Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2387 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Utilisation de la fonction QueryPerformanceFrequency probleme ....

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Utilisation de la fonction QueryPerformanceFrequency probleme ....

n°668637
roromaino
Posté le 09-03-2004 à 15:23:48  profilanswer
 

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.

mood
Publicité
Posté le 09-03-2004 à 15:23:48  profilanswer
 

n°668672
pascal_
Posté le 09-03-2004 à 15:51:07  profilanswer
 

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.
 
 
 
 
 
 

n°672233
jcop
yeah !
Posté le 12-03-2004 à 18:46:49  profilanswer
 

LARGE_INTEGER PerformanceCountStart, PerformanceCountEnd;
 
QueryPerformanceCounter(&PerformanceCountStart);
 
// ton code à tester
 
QueryPerformanceCounter(&PerformanceCountEnd);
 
Ensuite tu récupères la différence :
 
PerformanceCountEnd.LowPart - PerformanceCountStart.LowPart

n°1444544
argusazure
Posté le 19-09-2006 à 11:28:47  profilanswer
 

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

n°1444632
breizhbugs
Posté le 19-09-2006 à 14:35:27  profilanswer
 

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...  
bad


RTFMSDN:
http://msdn.microsoft.com/library/ [...] ounter.asp
 

Citation :


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.


Donc ca confirme!


Message édité par breizhbugs le 19-09-2006 à 19:13:10
n°1444773
IrmatDen
Posté le 19-09-2006 à 17:13:36  profilanswer
 

En quoi ça répond à la question?? :??:


---------------
.
n°1444856
karlkox
Posté le 19-09-2006 à 19:39:09  profilanswer
 

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.

n°1444981
IrmatDen
Posté le 20-09-2006 à 01:12:50  profilanswer
 

Mince, ça m'apprendra à poster du taf sans avoir pris le temps de tout lire, désolé  :sweat:


---------------
.
n°1445342
argusazure
Posté le 20-09-2006 à 15:14:02  profilanswer
 

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 ;)

n°1445463
breizhbugs
Posté le 20-09-2006 à 18:58:53  profilanswer
 

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...

mood
Publicité
Posté le 20-09-2006 à 18:58:53  profilanswer
 

n°1445625
argusazure
Posté le 21-09-2006 à 10:07:20  profilanswer
 

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%.

Message cité 1 fois
Message édité par argusazure le 21-09-2006 à 10:08:25
n°1445978
breizhbugs
Posté le 21-09-2006 à 20:06:06  profilanswer
 

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.


 :non:  

Code :
  1. // le pere:
  2. setthreadaffinity(processeur1);//pour le pere
  3. debut=queryperfcounter();
  4. fils1=thread();
  5. fils2=thread();
  6. attendre(fils1);
  7. attendre(fils2);
  8. fin=queryperfcounter()
  9. tempstotal=fin-debut;


Cea te donne bien le temps total de l'ensemble non? ou alors ce n'est pas ca que tu veut?

n°1446331
argusazure
Posté le 22-09-2006 à 14:56:19  profilanswer
 

breizhbugs a écrit :


Code :
  1. // le pere:
  2. setthreadaffinity(processeur1);//pour le pere
  3. debut=queryperfcounter();
  4. fils1=thread();
  5. setthreadaffinity(processeur1,fils1)
  6. fils2=thread();
  7. setthreadaffinity(processeur2,fils2)
  8. attendre(fils1):attendre(fils2);
  9. fin=queryperfcounter()
  10. tempstotal=fin-debut;


Ca te donne bien le temps total de l'ensemble non? ou alors ce n'est pas ca que tu veux?


Si c'est presque ça que je veux mais je ne suis pas sur que ça me donne le temps total de l'ensemble.

Message cité 1 fois
Message édité par argusazure le 22-09-2006 à 14:57:44
n°1446336
breizhbugs
Posté le 22-09-2006 à 15:12:21  profilanswer
 

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?)

n°1447018
argusazure
Posté le 25-09-2006 à 11:09:49  profilanswer
 

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.
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?)


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é


Message édité par argusazure le 25-09-2006 à 11:13:58
n°1447097
bjone
Insert booze to continue
Posté le 25-09-2006 à 12:37:32  profilanswer
 

QueryPerformanceCounter ne se base pas sur l'horloge processeur (via rdtsc), mais utilise le timer hardware.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Utilisation de la fonction QueryPerformanceFrequency probleme ....

 

Sujets relatifs
fonction d'analyse d'un champs de base de donnéeDreamweaver/SQL> problème de requête
J'ai un problème avec SCCANF() et les types de variables[ActiveX]problème de visualisation ActiveX de Acrobat Pdf
Petit problème !!![HTML/JS] Problème avec déplacement d'images et validation de position
[Résolu] Problème de mise en page en colonne sous IEFonction pour augmenter la netteté d'une image sous PHP
[BATCH] Problème avec reg findProbleme de SetCookie sur multimania et free
Plus de sujets relatifs à : Utilisation de la fonction QueryPerformanceFrequency probleme ....


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR