Utilisation de la fonction QueryPerformanceFrequency probleme .... - C - Programmation
Marsh Posté le 09-03-2004 à 15:51:07
Déjà, tu devrais apprendre à utiliser google correctement.
Va voir http://haypo.developpez.com/article/frequence_cpu/ et http://haypo.developpez.com/articl [...] ence_cpu.c par exemple.
En plus l'argument lpFrequency de la fonction QueryPerformanceFrequency :
- est un pointeur. Il faut donc initialiser le pointeur (mais ça c'est un problème de C++). Toi tu passes un pointeur qui pointe sur l'addresse mémoire 5000 => gros problème.
- la valeur sur lequel il pointe n'a pas besoin d'être initialisée vu que c'est justement la fonction qui la remplie.
Marsh Posté le 12-03-2004 à 18:46:49
LARGE_INTEGER PerformanceCountStart, PerformanceCountEnd;
QueryPerformanceCounter(&PerformanceCountStart);
// ton code à tester
QueryPerformanceCounter(&PerformanceCountEnd);
Ensuite tu récupères la différence :
PerformanceCountEnd.LowPart - PerformanceCountStart.LowPart
Marsh Posté le 19-09-2006 à 11:28:47
Bonjour, pouvez vous me confirmer qu'il y a un problème sur les Pc multiprocesseurs si le premier QueryPerformanceCounter n'est pas exécuté par le même processeur que le second. Il me semble en effet que cette fonction récupère le nombre de tops stocké dans le cpu et donc propre à un cpu. On peut bien sur associer le code à exécuter à un processeur mais si on veut faire un code multithread pour exploiter toute la puissance des cpu...
bad
Marsh Posté le 19-09-2006 à 14:35:27
argusazure a écrit : Bonjour, pouvez vous me confirmer qu'il y a un problème sur les Pc multiprocesseurs si le premier QueryPerformanceCounter n'est pas exécuté par le même processeur que le second. Il me semble en effet que cette fonction récupère le nombre de tops stocké dans le cpu et donc propre à un cpu. On peut bien sur associer le code à exécuter à un processeur mais si on veut faire un code multithread pour exploiter toute la puissance des cpu... |
RTFMSDN:
http://msdn.microsoft.com/library/ [...] ounter.asp
Citation : |
Donc ca confirme!
Marsh Posté le 19-09-2006 à 19:39:09
Remarks
On a multiprocessor computer, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the basic input/output system (BIOS) or the hardware abstraction layer (HAL). To specify processor affinity for a thread, use the SetThreadAffinityMask function.
Marsh Posté le 20-09-2006 à 01:12:50
Mince, ça m'apprendra à poster du taf sans avoir pris le temps de tout lire, désolé
Marsh Posté le 20-09-2006 à 15:14:02
Formulé autrement, ce que je voudrais savoir, c'est ce que retourne exactement QueryPerformanceCounter. Si c'est le nombre de top du processeur depuis le boot du pc, il est normal , me semble t il que la fonction ne retourne pas la même valeur en fonction du processeur sur laquelle elle est executée. A moins que les processeurs ne soient synchronisés ? C'est que je ne m'y connais pas trop en fait. Merci en tout cas de me donner un coup de main
Marsh Posté le 20-09-2006 à 18:58:53
AgusAzure:-> Le mieux pour pas avoir de probleme, c'est de faire que le meme thread appele les deux QueryPerformanceCounter et cela sur le meme processeur à chaque fois, comme ca tu n'as pas a te demander comment cela fonctionne (ou pas!) en dessous...
Marsh Posté le 21-09-2006 à 10:07:20
breizhbugs a écrit : AgusAzure:-> Le mieux pour pas avoir de probleme, c'est de faire que le meme thread appele les deux QueryPerformanceCounter et cela sur le meme processeur à chaque fois, comme ca tu n'as pas a te demander comment cela fonctionne (ou pas!) en dessous... |
Si le code à mesurer s'exécute sur un seul processeur, ça marche sans aucun doute. Mais ce que je veux faire est un peu plus complexe. J'ai un thread père qui exécute les 2 QueryPerformanceCounter sur le processeur 1. Et il lance 2 threads fils (qui font le travail) sur les processeurs 1 et 2, et attend la fin de ses 2 fils. Or le temps que vais obtenir sera le temps d'execution sur le processeur 1 et non le temps du thread père plus le max du temps des threads fils.
Il doit donc falloir que je chronomètre le temps d'exécution de chaque thread et que je fasse moi même le max.
De plus, en général, je trouve assez moyen pour les performaces du système, d'affecter un thread à un processeur alors que c'est plutot le travail de l'os. Car peut-être que ce processeur est déja utilisé à 100% et l'autre à 0%.
Marsh Posté le 21-09-2006 à 20:06:06
argusazure a écrit : Si le code à mesurer s'exécute sur un seul processeur, ça marche sans aucun doute. Mais ce que je veux faire est un peu plus complexe. J'ai un thread père qui exécute les 2 QueryPerformanceCounter sur le processeur 1. Et il lance 2 threads fils (qui font le travail) sur les processeurs 1 et 2, et attend la fin de ses 2 fils. Or le temps que vais obtenir sera le temps d'execution sur le processeur 1 et non le temps du thread père plus le max du temps des threads fils. |
Code :
|
Cea te donne bien le temps total de l'ensemble non? ou alors ce n'est pas ca que tu veut?
Marsh Posté le 22-09-2006 à 14:56:19
breizhbugs a écrit :
|
Si c'est presque ça que je veux mais je ne suis pas sur que ça me donne le temps total de l'ensemble.
Marsh Posté le 22-09-2006 à 15:12:21
argusazure a écrit : Si c'est presque ça que je veux mais je ne suis pas sur que ça me donne le temps total de l'ensemble. |
Si, cela te donne le temps total de l'ensemble car le pere attends la fin des deux fils avant de reprendre une mesure.
Cela dit, il est preferable de ne pas indiquer sur quel processeur les fils doivent tourner(suppose que tu tourne sur un quadri-proc, hein?)
Marsh Posté le 25-09-2006 à 11:09:49
breizhbugs a écrit : Si, cela te donne le temps total de l'ensemble car le pere attends la fin des deux fils avant de reprendre une mesure. |
Le but de ce que je veux faire et d'utiliser tous les processeurs pour executer une tâche. Si c'est une machine 4 processeurs, je cré 4 fils. J'affecte les fils ici pour que ce soit plus clair mais j'espère que l'OS le affectera de lui même sur des processeurs différents.
Le père attend la fin des 2 fils certe, mais on compte des tops processeurs. Donc si le fils 1 consomme 5 tops et le fils 2 consomme 10 tops, le nombre de top exécuté sur le processeur 1 est 5 et donc tempstotal devrait valoir 5 et non 10 comme il faudrait . (max(5,10))
A moins que le "bloquage" du père ne consomme des tops...No sé
Marsh Posté le 25-09-2006 à 12:37:32
QueryPerformanceCounter ne se base pas sur l'horloge processeur (via rdtsc), mais utilise le timer hardware.
Marsh Posté le 09-03-2004 à 15:23:48
bonjour,
Sous Borland......
J'utilise le compteur de windows , la fonction GetTickCount , mais cette fonction etant peu precise , je voudrais utilisé les autres fonctions associées QueryPerformanceCounter. Mais j'ai des problemes.
[cpp]
//bibliothéque
#include <windows.h>
#include <stdio.h>
//variables globales
int i;
long int tempsInstant;
LARGE_INTEGER *lpFrequency;
LARGE_INTEGER *lpPerformanceCount;
//main
int main(int argc, char* argv[])
{
lpFrequency=50000;
//Initialisation de la frequence
if(0==QueryPerformanceFrequency(lpFrequency))
{
printf("***echec init frequence***\n" );
return 0;
}
//boucle de test retour
for (i=0;i<=100;i++)
{
if(0==QueryPerformanceCounter(lpPerformanceCount))
{
printf("***echec du compteur***\n" );
return 0;
}
printf("%ld\n",lpPerformanceCount);
}
return 0;
}
Mon probleme vient du fait que je n'arrive pas a initialisé ma variable lpFrequency. Borland me fait une erreur de type structure.
Voici les docs de large integer ,QueryPerformanceFrequency et QueryPerformanceCounter.
The LARGE_INTEGER structure is used to represent a 64-bit signed integer value.
typedef union _LARGE_INTEGER {
struct {
DWORD LowPart;
LONG HighPart;
};
LONGLONG QuadPart;
} LARGE_INTEGER;
Members
LowPart
Specifies the low-order 32 bits.
HighPart
Specifies the high-order 32 bits.
QuadPart
Specifies a 64-bit signed integer.
Remarks
The LARGE_INTEGER structure is actually a union. If your compiler has built-in support for 64-bit integers, use the QuadPart member to store the 64-bit integer. Otherwise, use the LowPart and HighPart members to store the 64-bit integer.
The QueryPerformanceFrequency function retrieves the frequency of the high-resolution performance counter, if one exists.
BOOL QueryPerformanceFrequency(
LARGE_INTEGER *lpFrequency // address of current frequency
);
Parameters
lpFrequency
Points to a variable that the function sets, in counts per second, to the current performance-counter frequency. If the installed hardware does not support a high-resolution performance counter, this parameter can be to zero.
Return Values
If the installed hardware supports a high-resolution performance counter, the return value is nonzero.
If the installed hardware does not support a high-resolution performance counter, the return value is zero.
The QueryPerformanceCounter function retrieves the current value of the high-resolution performance counter, if one exists.
BOOL QueryPerformanceCounter(
LARGE_INTEGER *lpPerformanceCount // address of current counter value
);
Parameters
lpPerformanceCount
Points to a variable that the function sets, in counts, to the current performance-counter value. If the installed hardware does not support a high-resolution performance counter, this parameter can be to zero.
Return Values
If the installed hardware supports a high-resolution performance counter, the return value is nonzero.
If the installed hardware does not support a high-resolution performance counter, the return value is zero.
merci d'avance de vos reponses.