4

Je cherche des moyens d'effectuer des micro-benchmarks sur les processeurs multi-core.Comment référence sur les processeurs multi-core

Contexte:

à peu près les mêmes processeurs de bureau de temps introduits hors ordre d'exécution qui a rendu des performances difficiles à prévoir, ils, peut-être pas par hasard, a également présenté des instructions spéciales pour obtenir des timings très précises. Exemple de ces instructions sont rdtsc sur x86 et rftb sur PowerPC. Ces instructions donnaient des horaires qui étaient plus précis que ce qui pouvait être autorisé par un appel système, permettant aux programmeurs de micro-évaluer leurs cœurs, pour le meilleur ou pour le pire.

Sur un processeur encore plus moderne avec plusieurs cœurs, dont certains dorment de temps en temps, les compteurs ne sont pas synchronisés entre les cœurs. On nous dit que rdtsc n'est plus sûr à utiliser pour l'analyse comparative, mais j'ai dû somnoler quand on nous a expliqué les solutions de rechange.

Question:

Certains systèmes peuvent sauvegarder et restaurer le compteur de performance et de fournir un appel d'API pour lire la somme appropriée. Si vous savez ce que cet appel est pour n'importe quel système d'exploitation, s'il vous plaît laissez-nous savoir dans une réponse.

Certains systèmes peuvent permettre de désactiver les noyaux, ne laissant qu'une seule course. Je sais que Mac OS X Leopard fonctionne lorsque le volet Préférences approprié est installé à partir des outils de développement. Pensez-vous que cela rend le rdtsc sûr à utiliser à nouveau?

Plus contexte:

S'il vous plaît suppose que je sais ce que je fais en essayant de faire un micro-référence. Si vous êtes d'avis que si elle ne peut mesurer les gains d'une optimisation en synchronisant l'ensemble de l'application, il ne vaut pas optimalisation, je suis d'accord avec vous, mais

  1. Je ne peux pas le temps l'ensemble de l'application jusqu'à ce que la structure de données alternative est fini, ce qui prendra beaucoup de temps. En fait, si le micro-benchmark n'était pas prometteur, je pourrais décider de renoncer à la mise en œuvre maintenant;

  2. J'ai besoin de fournir des chiffres dans une publication dont la date limite que je ne contrôle pas.

Répondre

2

Sur OSX (ARM, Intel et PowerPC), vous souhaitez utiliser mach_absolute_time():

#include <mach/mach_time.h> 
#include <stdint.h>  

// Utility function for getting timings in nanoseconds. 
double machTimeUnitsToNanoseconds(uint64_t mtu) { 
    static double mtusPerNanosecond = 0.0; 
    if (0.0 == mtusPerNanosecond) { 
     mach_timebase_info_data_t info; 
     if (mach_timebase_info(&info)) { 
      // Handle an error gracefully here, whatever that means to you. 
      // If you do get an error, something is seriously wrong, so 
      // I generally just report it and exit(). 
     } 
     mtusPerNanosecond = (double)info.numer/info.denom; 
    } 
    return mtu * mtusPerNanosecond; 
} 

// In your code: 
uint64_t startTime = mach_absolute_time(); 
// Stuff that you want to time. 
uint64_t endTime = mach_absolute_time(); 
double elapsedNanoseconds = machTimeUnitsToNanoseconds(endTime - startTime); 

Notez qu'il n'y a pas besoin de limiter à un noyau pour cela. Le système d'exploitation gère la correction requise dans les coulisses pour mach_absolute_time() afin d'obtenir des résultats satisfaisants dans un environnement multicœur (et multi-socket).

+0

Merci, je devrais être en mesure de travailler sur http://developer.apple.com/mac/library/qa/qa2004/qa1398.html, bien que je suis très déçu du résultat de 'man mach_absolute_time'. –

+0

@Pascal: Ce serait un bon bug à signaler. J'ai posté un exemple de code qui évite le jet de pointeur dans cette note. –

+0

Notez que cette solution souffrira beaucoup plus de l'effet de sonde que d'épingler votre processus sur un seul noyau et d'utiliser rtdsc deux fois (sur x86, ne peut pas parler pour PowerPC). Le compilateur ne peut pas intégrer vos fonctions, il prend plus de mémoire cache d'instructions, et vous multipliez et divisez ce qui, selon moi, peut varier en fonction du temps nécessaire à leur exécution en fonction de leurs opérandes. 'rtdsc' lit juste un registre et est donc beaucoup moins cher et affectera moins vos résultats. –

1

Les noyaux reviennent les valeurs correctes pour synchronisées « rtdsc ». Si vous avez une machine multisocket, vous devez fixer le process à une socket. Ce n'est pas le problème.

Le principal problème est que le planificateur rend les données peu fiables. Il y a quelques API de performance pour Linux Kernel> 2.6.31 mais je ne l'ai pas regardé. Windows> Vista fait du bon travail ici, utilisez QueryThreadCycleTime et QueryProcessCycleTime.

Je ne suis pas sûr d'OSX mais AFAIK "mach_absolute_time" n'ajuste pas l'heure planifiée.

Questions connexes