2010-12-02 41 views
4

Je veux mesurer la ammount de la virgule flottante et des opérations arithmétiques exécutées par une application avec « perf », la nouvelle commande d'interface de ligne de commande pour le sous-système de compteur de performance linux. (Pour tester, j'utilise une application fictive simple que j'ai créée, voir ci-dessous). Comme je n'ai trouvé aucun événement 'perf' défini pour mesurer les opérations FP et entières, j'ai commencé à creuser dans les codes d'événements matériels bruts (à utiliser avec -rNNN, où NNN est la valeur hexadécimale du code d'événement). Donc, mon vrai problème est que, les codes que j'ai trouvé des instructions à la retraite (INST_RETIRED) ne font pas la distinction entre FP et d'autres instructions (X87 et MMX/SSE). Quand j'ai essayé d'utiliser les umasks appropriés au code particulier, je trouve que en quelque sorte « perf » ne comprend pas ou favorable à l'inclusion umask. J'ai essayé avec:mesure FLOP d'une application avec linux perf outil

% perf stat -e rC0 ./a.out 

qui me donne les instructions à la retraite, mais

% perf stat -e rC002 ./a.out 

qui devrait me donner les instructions x87 exécutées dit que je fournis des paramètres erronés. Peut-être, mais quelle est la bonne façon d'utiliser les masques d'événements matériels bruts avec 'perf'? En général, quel est le moyen d'obtenir le nombre exact d'opérations en virgule flottante et en nombres entiers un programme exécuté en utilisant l'outil Perf?

Un grand merci, Konstantin Boyanov


Voici mon application test:

int main(void){ 
    float numbers[1000]; 
    float res1; 
    double doubles[1000]; 
    double res2; 

    int i,j=3,k=42; 

    for(i=0;i<1000;i++){ 
    numbers[i] = (i+k)*j; 
    doubles[i] = (i+j)*k; 
    res1 = numbers[i]/(float)k; 
    res2 = doubles[i]/(float)j; 
    } 
} 
+0

Quelle est votre CPU? – osgx

Répondre

4

L'événement à utiliser dépend du processeur. Vous pouvez utiliser libpfm4 (http://perfmon2.git.sourceforge.net/git/gitweb-index.cgi) pour déterminer quels sont les événements disponibles (en utilisant le programme showevinfo), puis check_events de la même distribution à la figure la première codes pour l'événement. Mon processeur Sandy Bridge prend en charge l'événement FP_COMP_OPS_EXE que j'ai trouvé de manière empirique et qui correspond étroitement au nombre de FLOP.

2

Je ne suis pas sûr de perf, mais oprofile a des événements à virgule flottante pour de nombreux processeurs. Il peut y avoir un certain chevauchement, car INST_RETIRED est aussi un événement oprofile valide.