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;
}
}
Quelle est votre CPU? – osgx