Frage

Ich bin die Suche nach Möglichkeiten Mikro-Benchmarks auf Multi-Core-Prozessoren auszuführen.

Kontext:

Etwa zur gleichen Zeit Desktop-Prozessoren eingeführt Out-of-Order-Ausführung so schwer gemacht Leistung vorherzusagen, sie, vielleicht nicht zufällig auch eingeführt spezielle Anweisungen sehr genaue Zeitpunkte zu erhalten. Beispiel für diese Anweisungen sind rdtsc auf x86 und rftb auf PowerPC. Diese Anweisungen gab Zeitpunkte, die genauer waren als je zuvor von einem Systemaufruf erlaubt Programmierern Mikro-Benchmark ihre Herzen, zum Guten oder zum Schlechten erlaubt werden könnte.

Auf einem noch moderneren Prozessor mit mehreren Kernen, von denen einige einen Teil der Zeit schlafen, werden die Zähler zwischen den Kernen nicht synchronisiert. Man sagt uns, dass rdtsc ist nicht mehr sicher für das Benchmarking zu verwenden, aber ich muss Dösen haben, wenn wir die alternativen Lösungen erläutert wurden.

Frage:

Einige Systeme können den Leistungsindikatoren und bieten einen API-Aufruf die richtige Summe lesen speichern und wiederherstellen. Wenn Sie wissen, was dieser Anruf für ein beliebiges Betriebssystem ist, informieren Sie uns bitte in einer Antwort wissen.

können Einige Systeme erlauben Kerne auszuschalten, nur ein Lauf lassen. Ich weiß, dass Mac OS X Leopard funktioniert, wenn die richtige Preference Pane von den Entwickler-Tools installiert ist. Glauben Sie, dass diese Marke rdtsc sicher in der Anwendung wieder?

Mehr Kontext:

Bitte gehe ich davon weiß, was ich tue, wenn eine Mikro-Benchmark zu tun versuchen. Wenn Sie der Meinung sind, dass, wenn ein Gewinn Optimierungs kann nicht durch Timing der gesamten Anwendung gemessen werden, ist es nicht wert, Optimierung, ich stimme Ihnen zu, aber

  1. Ich kann nicht die ganze Anwendung Zeit, bis die alternative Datenstruktur beendet ist, das eine lange Zeit in Anspruch nehmen wird. In der Tat könnte, wenn das Mikro-Benchmark nicht war vielversprechend, ich entscheiden über die Umsetzung jetzt aufgeben;

  2. ich brauche Zahlen in einer Publikation zu erstellen, deren Frist ich habe keine Kontrolle über.

War es hilfreich?

Lösung

Auf OSX (ARM, Intel und PowerPC), die Sie verwenden möchten 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 es keine Notwendigkeit zu begrenzen, um einen Kern für diese. Die OS-Griffe die Fix-up hinter den Kulissen für mach_absolute_time( ) erforderlich in einer Multi-Core-meaninful Ergebnisse zu geben (und Multi-Sockel) -Umgebung.

Andere Tipps

Die Kerne sind wieder die richtigen synchronisierten Werte für „rtdsc“. Wenn Sie eine Mehrfachsteckdosen Maschine haben Sie die processe an eine Steckdose zu beheben. Dies ist nicht das Problem.

Das Hauptproblem besteht darin, dass der Planer die Daten unzuverlässig macht. Es gibt einige Performance-API für Linux Kernel> 2.6.31, aber ich habe nicht es aussah. Windows> Vista hier einen tollen Job gemacht, verwenden QueryThreadCycleTime und QueryProcessCycleTime.

Ich bin nicht sicher über OSX aber AFAIK „mach_absolute_time“ paßt nicht die geplante Zeit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top