Question

Je cherche des moyens d'effectuer des micro-benchmarks sur les processeurs multi-core.

Contexte:

À peu près les mêmes processeurs de bureau de temps introduits hors ordre d'exécution qui fait la performance difficile à prédire, ils, peut-être pas par hasard, a également introduit des instructions spéciales pour obtenir des timings très précises. Exemple de ces instructions sont rdtsc sur x86 et PowerPC sur rftb. Ces instructions ont donné des timings qui étaient plus précis que ne pourrait jamais être autorisé par un appel système, les programmeurs autorisés à micro-référence leur cœur, 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ées entre les noyaux. On nous dit que rdtsc n'est plus sûr à utiliser pour l'analyse comparative, mais je devais avoir assoupir quand nous expliquions les solutions alternatives.

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 tout 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 fait lorsque le volet de droite de préférence est installé à partir des outils développeurs. Pensez-vous que cette marque 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 chronométrant l'ensemble de l'application, il ne vaut pas optimalisation, je suis d'accord avec vous, mais

  1. Je ne peux fois que l'application jusqu'à ce que toute la structure de données de remplacement est terminée, ce qui prendra beaucoup de temps. En fait, si le micro-référence n'a pas été prometteur, je pourrais décider de renoncer à présent sur la mise en œuvre;

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

Était-ce utile?

La solution

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. Les poignées du système d'exploitation du fix-up requis dans les coulisses pour mach_absolute_time( ) pour donner des résultats meaninful dans un environnement multi-coeurs (et multi-socket).

Autres conseils

Les noyaux reviennent les valeurs correctes pour synchronisés « rtdsc ». Si vous avez une machine à multiprise vous devez fixer le processe à une prise. Ce n'est pas le problème.

Le principal problème est que le planificateur rend les données peu fiables. Il y a une API de performance pour le noyau Linux> 2.6.31, mais je n'ai pas regardé. Windows> Vista fait un excellent travail ici, utilisez QueryThreadCycleTime et QueryProcessCycleTime.

Je ne suis pas sûr de Mac OS X, mais autant que je sache « mach_absolute_time » ne règle pas l'heure prévue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top