2016-08-09 1 views
0

Je prévois de mesurer les compteurs PMU pour L1, L2, L3 manque manque de prédiction de branche, j'ai lu des documents Intel liés, mais je ne suis pas sûr du dessous scenarios.could quelqu'un s'il vous plaît préciser?PMU pour l'environnement multithread

//assume PMU reset and PERFEVTSELx configurtion done above 
ioctl(fd, IOCTL_MSR_CMDS, (long long)msr_start) //PMU start counters 
my_program(); 
ioctl(fd, IOCTL_MSR_CMDS, (long long)msr_stop) ///PMU stop 
//now reading PMU counters 

1.Quels se produira si mon processus est prévu lorsque mon_programme() est en cours d'exécution, et attribuées à un autre noyau?

2.Quel se passera si le processus prévu et le calendrier à revenir à même noyau à nouveau, en attendant un autre processus remis à zéro les compteurs PMU?

Comment faire en sorte que nous lisons les valeurs correctes de compteurs PMU.?

Détails de la machine: CentOS avec le noyau Linux 3.10.0-327.22.2.el7.x86_64, qui est alimenté avec Intel (R) Core (TM) i7-3770 CPU @ 3.40GHz

Merci

+0

Vous vous rendez compte que 'perf' peut lire les compteurs de performance matérielle pour vous? – EOF

+0

oui, je lis des documents perf. Il ne sera pas très utile pour mon application, il y a beaucoup de restrictions/dépendances Linux que nous ne voulons pas. –

Répondre

1

Résumé des the Intel forum thread a commencé par l'OP:

  • Le sous-système Linux perf virtualise les compteurs de performance, mais cela signifie que vous devez les lire avec un appel système, au lieu de rdpmc, pour obtenir la valeur 64 bits virtualisée complète au lieu de ce qui est actuellement dans le registre du compteur de performance architecturale. Si vous souhaitez utiliser rdpmc dans votre propre code afin qu'il puisse se mesurer, épinglez chaque thread à un noyau car les commutateurs de contexte ne sauvegardent/ne restaurent pas les PMC. Il n'y a pas moyen facile d'éviter de mesurer tout qui se passe sur le noyau, y compris les gestionnaires d'interruption et d'autres processus qui obtiennent timeslice. Cela peut être une bonne chose, car vous devez tenir compte de l'impact des frais généraux du noyau.


citations Plus utiles de John D. McCalpin, PhD ("Dr. Bandwidth"):

Pour l'instrumentation de code en ligne, vous devriez être en mesure d'utiliser l'API "événements perf" , mais la documentation est minime. Certaines ressources sont disponibles à http://web.eece.maine.edu/~vweaver/projects/perf_events/faq.html

Vous pouvez utiliser « pread() » sur/dev/cpu/*/fichiers de périphériques msr lire les MSRs - cela peut être un peu plus facile à lire que le code à base IOCTL . Les codes "rdmsr.c" et "wrmsr.c" de "msr-tools-1.3" fournissent d'excellents exemples .

Il y a eu un certain nombre d'approches à la réservation et le partage compteurs de performance, y compris les logiciels uniquement et combinés approches matérielles + logiciel, mais à ce stade il n'y a pas " "approche standard". (Il semble que Intel a une approche basée sur le matériel utilisant MSR 0x392 IA32_PERF_GLOBAL_INUSE, mais je ne sais pas ce que les plates-formes soutiennent.)


vos questions

ce se produira-t-il si mon processus est programmé quand my_program() est en cours d'exécution, et programmé à un autre noyau?

Vous verrez une corbeille aléatoire, même si un autre processus réinitialise les PMC entre les périodes de temps de votre processus.

+0

oui. Pour éviter cela, nous pouvons utiliser l'affinité des threads, mais cela ne donnera pas non plus de résultats/comptages exacts, même parfois ces valeurs sont également indésirables. Pour autant, je comprends que nous ne pouvons pas obtenir des valeurs PMU exactes avec un environnement multi-thread./ou une connaissance approfondie de l'ordonnanceur OS. –