Wie soll ich Profilierungs- / Timing-Informationen zu meinem Code melden?


8

Ich habe viele Veröffentlichungen in Fachzeitschriften für Computerphysik gesehen, die unterschiedliche Metriken für die Leistung ihres Codes verwenden. Insbesondere für GPGPU-Code scheint es eine Vielzahl von Timing-Ergebnissen zu geben, die von Menschen veröffentlicht werden. Insbesondere habe ich gesehen:

  • Vergleiche von (im Wesentlichen) Ausführung timeauf der GPU- und CPU-Version und Berichterstattung über einen Durchschnitt
  • Vergleiche der Profildaten für jede aufgerufene GPU / CPU-Funktion (zeitliche Abstimmung des Laufs mainund aller von ihr aufgerufenen Funktionen, jedoch ohne Berücksichtigung der Treiberinitialisierungszeit)
  • Vergleiche von Profildaten für mehrere relevante Funktionen, Ignorieren von Dingen wie Speicherübertragungen (in diesem Fall über den PCI-E-Bus), E / A auf die Festplatte, Transformieren der Daten von einem Format in ein anderes usw.
  • Vergleiche von Profildaten für nur eine Funktion (z. B. Vergleichen nur der Zeit für Spin-Updates in einer CPU mit GPU Quantum Monte Carlo) und Ignorieren von Dingen wie Speicherübertragungszeit, E / A auf Festplatte, Einrichten des Hamilton-Operators / Diagonalisieren , usw

Mein Gefühl ist, dass die erste Option die "ehrlichste" der vier ist, obwohl ich auch die Vorzüge der zweiten und dritten sehen kann. Es ist ein bisschen lächerlich, einen Laufzeitunterschied von 5 Sekunden zu melden, wenn 4,99 Sekunden der Unterschied bei E / A-Implementierungen zwischen Sprachen oder Infiniband und Gigabit waren. Die letzte Option erscheint mir etwas "skizzenhaft", da diese Funktion nicht die Leistung widerspiegelt, die jemand, der meine Ergebnisse repliziert, sehen würde, wenn diese Funktion nicht der Schmerzpunkt des gesamten Programms ist. Welcher dieser Ansätze ist klarer? Idealerweise würde ein Papier all dies enthalten, aber im Falle einer Beschränkung der Zahlen / Länge, was ist / sind am wertvollsten, ehrlichsten und relevantesten?

Antworten:


6

Die Gesamtlaufzeit (Wanduhr) ist die einzige Metrik, die in der Industrie oder in realen Anwendungen von Bedeutung ist: Diese Zahl sollte niemals weggelassen werden, auch wenn sie peinlich ist. Natürlich hängt diese Metrik stark von der Testumgebung ab, daher sollte dies ausführlich beschrieben werden.

Alle anderen Metriken können (oder sollten) gemeldet werden, wenn sie Einblick in das Problem geben, oder daraus können interessante Schlussfolgerungen (z. B. Überprüfung einer theoretischen Grenze) gezogen werden.

Ich denke, dass dieser Blogeintrag diesen Punkt anspricht, insbesondere den letzten Absatz.


2
Selbst die Wanduhrzeit erscheint mir möglicherweise irreführend, da die Qualität der Implementierungen jedes Algorithmus von Bedeutung ist. Joel Spolsky befasst sich in einem Blog-Beitrag mit dem Thema "Kein schneller Code" . Wie soll ich wissen, was wirklich "am schnellsten" ist, ohne den Quellcode der Implementierungen zu veröffentlichen (und ich vermute in einigen Fällen, selbst wenn man den Quellcode der Implementierungen veröffentlicht hat)? Anders ausgedrückt, wie macht man einen Vergleich der Wanduhrzeiten (oder einer anderen Metrik) sinnvoll?
Geoff Oxberry

1
@GeoffOxberry In einer fernen Vergangenheit war fast jede Berechnung seriell, und die Speicherhierarchie bestand nur aus zwei Ebenen, In-Core und Out-of-Core. In jenen (glücklichen) Tagen matlab, flopsdie nach jedem Befehl noch gezählt wurden ... Heutzutage haben wir Multicore-CPUS, GPGPUS, Cluster, Clouds, L1 / L2 / L3-Caches, ... Die Effizienz hängt davon ab, wie gut Sie einen Algorithmus abbilden können auf die gegebene hw / sw Architektur. Es ist albern zu versuchen, alles zu einer einzigen Zahl zusammenzufassen, aber dennoch sollten wir in der Lage sein, eine Bestellung einzuführen und unter bestimmten und genau definierten Bedingungen zu sagen, wer schneller ist.
Stefano M

Ja, ich stimme zu. Ich frage, wie man eine solche Reihenfolge einführen sollte, um aussagekräftige Vergleiche anzustellen, die unter den von Ihnen angegebenen und genau definierten Bedingungen bestimmen, wer schneller ist.
Geoff Oxberry

+1 All dies ist sinnvoll und hängt von dem Punkt ab, den man in der Veröffentlichung ansprechen möchte. Wenn es um Leistung geht, muss dies viel genauer erklärt werden.
Mike Dunlavey

4

Es ist oft der Fall, dass man nur die Spitze des Eisbergs aller Arbeiten und Kompromisse melden kann, die in eine Software eingeflossen sind. Die Berichtsleistung ist gut, aber die eigentliche Sache ist, wenn der Code im Internet frei zugänglich gemacht wird. Auf diese Weise kann jeder Interessierte die Ergebnisse bewerten und reproduzieren.

Wenn Sie die Software freigeben, können Sie im Idealfall auch die Tests zur Verfügung stellen, mit denen die in einem Dokument dargestellten Daten generiert werden.


1
Ich stimme vollkommen zu: Nackte Zahlen machen keinen Sinn. Um reproduzierbaren und aussagekräftigen Quellcode zu erhalten, sollten Testdatensätze, Hardware-Konfiguration und SW-Konfiguration veröffentlicht werden.
Stefano M

Für den Fall, dass ich einen Algorithmus zweimal implementiert habe, einmal auf der GPU und einmal auf der CPU, stimme ich zu, dass HW / SW-Konfigurationen unbedingt erforderlich sind. Ich bin mir immer noch nicht sicher, welche Daten ich präsentieren soll, wenn ich einen "Skalierungseffekt" finde (z. B. Vergleich der Beschleunigung mit der Matrixgröße für ED). Soll ich Wanduhren vergleichen? Nur der ED-Teil der Berechnung?
Limetten

Wenn Sie an einem tiefen Vergleich von Codes interessiert sind, mag ich die Arbeit von Volkov und Demmel in ihrem (etwas alten, aber illustrativen)
Artikel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.