So messen Sie die Gesamtleistung von parallelen Programmen (mit papi)

8

Ich habe mich gefragt, wie man die Leistung (in Flops) eines Parallelprogramms am besten messen könnte. Ich lese über papi_flops. Dies scheint für ein serielles Programm gut zu funktionieren. Aber ich weiß nicht, wie ich die Gesamtleistung eines Parallelprogramms messen kann.

Ich möchte die Leistung einer Blas / Lapack-Funktion messen, in meinem Beispiel unter Gemm. Aber ich möchte auch andere Funktionen messen, vor allem Funktionen, bei denen die Anzahl der Operationen nicht bekannt ist. (Im Fall von gemm sind die Ops bekannt (ops (gemm) = 2 * n ^ 3), also könnte ich die Performance als eine Funktion der Anzahl der Operationen und der Ausführungszeit berechnen.) Die Bibliothek (Ich benutze Intel MKL) spawnen die Threads automatisch. Daher kann ich die Leistung jedes Threads nicht einzeln messen und dann reduzieren.

Dies ist mein Beispiel:

%Vor%

Dies ist ein Ausgang (für Matrixgröße 200):

%Vor%

Wir können für die Ausführungszeit sehen, dass die Funktion gemm skaliert. Aber die Flops, die ich vermesse, sind nur die Leistung von Thread 0.

Meine Frage ist: Wie kann ich die Gesamtleistung messen? Ich bin dankbar für jede Eingabe.

    
Sebastian 29.07.2015, 13:21
quelle

1 Antwort

4

Zuerst bin ich nur neugierig - warum brauchen Sie die FLOPS? interessiert es dich nicht, wieviel Zeit du brauchst? oder vielleicht Zeit im Vergleich zu anderen BLAS-Bibliotheken genommen?

PAPI ist Thread-basiert nicht viel Hilfe für sich allein.

Was ich tun würde, ist, den Funktionsaufruf zu messen und zu sehen, wie sich die Zeit mit der Anzahl der erzeugten Threads ändert. Es sollte nicht mehr Threads erzeugen als physische Kerne (HT ist hier nicht gut). Wenn die Matrix groß genug ist und die Maschine nicht geladen ist, sollte die Zeit einfach durch die Anzahl der Threads geteilt werden. Z. B. sollten 10 Sekunden über 4 Kern 2,5 Sekunden werden.

Abgesehen davon gibt es zwei Dinge, die Sie tun können, um es wirklich zu messen:
1. Verwenden Sie, was Sie jetzt verwenden, aber injizieren Sie Ihren Start / Ende-Messcode um den BLAS-Code. Eine Möglichkeit, dies zu tun (in Linux), ist das Vorladen einer Lib, die pthread_start definiert, und das Verwenden eigener Funktionen, die die Originale aufrufen, aber einige zusätzliche Messungen vornehmen. Eine weitere Möglichkeit, den Funktionszeiger zu überschreiben, wenn der Prozess bereits läuft (= Trampolin). In Linux ist es in der GOT / PLT und in Windows ist es komplizierter - suchen Sie nach einer Bibliothek.
2. Verwenden Sie oprofile oder einen anderen Profiler, um die Anzahl der ausgeführten Anweisungen in der von Ihnen gewünschten Zeit zu melden. Oder noch besser, um die Anzahl der ausgeführten Fließkommaanweisungen zu melden. Ein kleines Problem dabei ist, dass SSE-Befehle sich multiplizieren oder zwei oder mehr Doubles gleichzeitig hinzufügen, also müssten Sie das berücksichtigen. Ich nehme an, Sie können davon ausgehen, dass sie immer die maximal möglichen Operanden verwenden.

    
BitWhistler 03.08.2015, 14:46
quelle