4 Stimmen

Benchmarking auf Multi-Core-Prozessoren

Ich suche nach Möglichkeiten zur Durchführung von Mikro-Benchmarks auf Mehrkernprozessoren.

Kontext:

Etwa zur gleichen Zeit, als Desktop-Prozessoren die Out-of-Order-Ausführung einführten, die eine Vorhersage der Leistung erschwerte, wurden - vielleicht nicht zufällig - auch spezielle Befehle eingeführt, um sehr genaue Zeitangaben zu erhalten. Beispiele für diese Anweisungen sind rdtsc auf x86 und rftb auf PowerPC. Diese Befehle lieferten präzisere Zeitangaben, als es ein Systemaufruf jemals zulassen könnte, und ermöglichten es den Programmierern, Mikro-Benchmarking zu betreiben - im Guten wie im Schlechten.

Bei einem noch moderneren Prozessor mit mehreren Kernen, von denen einige zeitweise schlafen, werden die Zähler nicht zwischen den Kernen synchronisiert. Uns wird gesagt, dass rdtsc nicht mehr sicher für Benchmarking ist, aber ich muss wohl eingeschlafen sein, als uns die alternativen Lösungen erklärt wurden.

Frage:

Einige Systeme können den Leistungszähler speichern und wiederherstellen und einen API-Aufruf zum Auslesen der richtigen Summe bereitstellen. Wenn Sie wissen, wie dieser Aufruf für ein bestimmtes Betriebssystem lautet, teilen Sie uns dies bitte in einer Antwort mit.

Bei einigen Systemen kann es möglich sein, Kerne abzuschalten, so dass nur noch ein Kern läuft. Ich weiß, dass dies bei Mac OS X Leopard möglich ist, wenn das rechte Einstellungsfenster aus den Entwicklertools installiert wird. Glauben Sie, dass dies die rdtsc wieder sicher zu verwenden?

Mehr Kontext:

Bitte gehen Sie davon aus, dass ich weiß, was ich tue, wenn ich versuche, einen Mikro-Benchmark durchzuführen. Wenn Sie der Meinung sind, dass es sich nicht lohnt, eine Optimierung vorzunehmen, wenn der Gewinn einer Optimierung nicht durch die Zeitmessung der gesamten Anwendung gemessen werden kann, stimme ich Ihnen zu, aber

  1. Ich kann die gesamte Anwendung nicht zeitlich festlegen, bis die alternative Datenstruktur fertig ist, was sehr lange dauern wird. Wenn der Mikro-Benchmark nicht vielversprechend wäre, könnte ich die Implementierung jetzt aufgeben;

  2. Ich benötige Zahlen für eine Veröffentlichung, auf deren Abgabetermin ich keinen Einfluss habe.

3voto

Stephen Canon Punkte 100340

Unter OSX (ARM, Intel und PowerPC) müssen Sie 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);

Beachten Sie, dass Sie sich dabei nicht auf einen Kern beschränken müssen. Das Betriebssystem kümmert sich um die Korrekturen, die hinter den Kulissen für mach_absolute_time( ) um aussagekräftige Ergebnisse in einer Multi-Core- (und Multi-Socket-) Umgebung zu erzielen.

1voto

Lothar Punkte 11643

Die Kerne geben die korrekten synchronisierten Werte für "rtdsc" zurück. Wenn Sie einen Multisocket-Rechner haben, müssen Sie den Prozess auf einen Socket festlegen. Dies ist nicht das Problem.

Das Hauptproblem ist, dass der Scheduler die Daten unzuverlässig macht. Es gibt eine Leistungs-API für Linux Kernel > 2.6.31, aber ich habe sie mir nicht angesehen. Windows > Vista macht hier einen guten Job, verwenden Sie QueryThreadCycleTime und QueryProcessCycleTime.

Ich bin mir bei OSX nicht sicher, aber AFAIK passt "mach_absolute_time" die geplante Zeit nicht an.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X