Stromverbrauch von OpenCL-Code, der auf einer NVIDIA-GPU ausgeführt wird

480
a_sid

Ich versuche, OpenCL-Code für einen MJPEG-Decoder auf einer Nvidia-GPU (Tesla K20c) auszuführen. Ich habe auf anderen Stack Exchange-Websites Fragen zur Implementierung des Decoders auf der GPU gestellt und versuche jetzt, den Stromverbrauch jedes einzelnen OpenCL-Kernels zu berechnen, der auf dem Tesla K20c ausgeführt wird. (Ich habe 4 sequentielle C-Funktionen, nämlich iqzz, IDCT, Upsampling und Farbkonvertierung in OpenCL-Kernel übersetzt).

Ich habe verwendet nvidia-smi, um den Stromverbrauch der GPU zu überprüfen, wenn ich meinen OpenCL-Code ausführte. Der Stromverbrauch im Leerlauf von K20c beträgt 17 W, wenn kein Code ausgeführt wird.

enter image description here

Ich habe die folgende Methode verwendet, um die Leistungsfähigkeit jedes einzelnen Kernels zu untersuchen:

Um den Stromverbrauch eines bestimmten OpenCL-Kernels zu berechnen, habe ich die verbleibenden OpenCL-Kernel auskommentiert und die entsprechenden C-Versionen an ihrer Stelle laufen lassen. Ich habe das getan, um den Code korrekt laufen zu lassen. Wenn ich also einen anderen OpenCL-Kernel ausführen möchte, aktiviere (unkommentiert) ich die Single-Threaded-C-Versionen der anderen Kernel.

Jeder einzelne Kernel, dessen Leistung ich auf die obige Weise untersuchen wollte, zog Leistung im Bereich von etwa 49 W bis 55 W an. Der Kern für die Funktion Upsampling verbrauchte die meiste Leistung (55 W).

enter image description here

Darüber hinaus glaube ich, dass, wenn ich alle OpenCL-Kernel gleichzeitig auf der GPU ausführte, der Gesamtstromverbrauchswert die Summe der Werte sein sollte, die ich erhalten habe, als ich jeden Kernel einzeln ausgeführt habe. Stattdessen betrug der Gesamtstromverbrauch, als ich alle Kernel gleichzeitig betrieb, 54,83 W! Der Stromverbrauch ist sogar noch geringer als der vom Kernel für Upsampling verbrauchte Strom.

Haben Sie Vorschläge für die korrekte Berechnung der von jedem Kernel in meinem OpenCL-Code verbrauchten Leistung? Die meisten Forschungsarbeiten (wie diese ) erwähnen ausgefallene Techniken wie das Anschließen von Sonden an den PCI-Bus, die CPU und die GPU. Ich habe jedoch ein geschlossenes System und kann keine physischen Mittel zur Messung der Leistung verwenden.

ZUSATZ:

Der Prozentsatz der Auslastung der GPU erreichte 98%, als ich printfeinem Kernel Anweisungen hinzugefügt hatte .

enter image description here

0
55 im Vergleich zu 54,83 klingt für mich nach Messfehler. Warum ist es unangemessen, dass die vollständige GPU-Implementierung 54,83 Watt benötigt? Der K20C hat 2496 Kerne. Wenn Sie einen Kernel ausführen, wird dieser Kernel auf allen Kernen ausgeführt. Führen Sie zwei Kernel aus, und diese 2496 Kerne werden gemeinsam genutzt. In beiden Fällen werden immer nur 2496 Kerne mit Strom versorgt. Um Ihre Messmethode zu überprüfen, senden Sie Kernel mit einer unterschiedlichen Anzahl von Threads (beginnend mit << Kernzahl von gpu), und sehen Sie, wie sie zunimmt. Es gibt einen geringfügigen Unterschied zwischen den Kernels aufgrund der Speicherbandbreite, aber irgendwann werden Sie die GPU sättigen. sebf vor 6 Jahren 1
@sebf Ich verstehe, dass die GPU gesättigt sein kann (siehe den Zusatz, den ich zur Frage gemacht habe). Ich verstehe nicht, was Sie mit _55 meinen, verglichen mit 54.83 klingt für mich nach Messfehler. a_sid vor 6 Jahren 0
@sebf Der Stromverbrauch von "nvidia-smi" beinhaltet wahrscheinlich den Stromverbrauch anderer umgebender Komponenten (Bus, Schienen usw.). Wie kann ich den ** Stromverbrauch des ** Kernels berechnen? a_sid vor 6 Jahren 0
Ich meine, der Unterschied von 170 mW bedeutet nicht, dass Upsampling alleine mehr Energie verbraucht als alle Kernel, sondern dass die Messungen bei jeder Messung um mehr als 170 mW variieren. Sie könnten versuchen, Ihre Kernel mit unterschiedlichen Thread-Zählungen zu starten, beginnend mit 1, sie plotten und den stückweisen linearen Bereich (sofern vorhanden) finden, und der Gradient könnte sich dem Stromverbrauch eines Kernelaufrufs annähern. sebf vor 6 Jahren 2

1 Antwort auf die Frage

0
trapezoid

nvidia-smi Es werden Informationen zum Stromverbrauch für die gesamte GPU zurückgegeben, die meines Erachtens nicht in der Lage sein werden, Ihnen die gewünschte Granularität zu geben.

Der Energieverbrauch für einen "individuellen Kernel" ist in diesem Zusammenhang wenig sinnvoll. Die GPU ist eingeschaltet und verbraucht etwas Strom, unabhängig davon, was Sie darauf laufen. (Diese Zahl sollte Ihre Basis für den Stromverbrauch sein.)

  • Die von Ihnen angegebene Zahl von 54,83 W impliziert, dass Ihr Kernel weniger Strom verbraucht als Upsampling, was sinnvoll ist, da Upsampling ein sehr kostspieliger Vorgang ist und leicht 170 mW mehr Leistung brennen kann.

(Die 17W-Leerlaufmessung ist irreführend, da der Chipsatz wahrscheinlich in einem ACPI-Suspendierungszustand ist, in dem Teile des Chips vollständig deaktiviert sind, wodurch ein "ungewöhnlich" niedriger Stromverbrauch ermöglicht wird, den Sie mit keinem Kernelbetrieb erreichen könnten.)

54,83 W ist der Stromverbrauch, den ich bekomme, wenn ich ** ALL ** die Kernel auf der GPU (** einschließlich ** Upsampling) laufe. a_sid vor 6 Jahren 0