5 Stimmen

Können wir vergleichen, wie schnell CUDA oder OpenCL im Vergleich zur CPU-Leistung ist?

Wie viel schneller kann ein Algorithmus auf CUDA- oder OpenCL-Code im Vergleich zu einem allgemeinen Einzelprozessorkern ausgeführt werden (unter Berücksichtigung der Tatsache, dass der Algorithmus sowohl für das CPU- als auch für das GPU-Ziel geschrieben und optimiert wurde)?

Ich weiß, dass es sowohl von der Grafikkarte als auch von der CPU abhängt, aber sagen wir, eine der schnellsten GPUs von NVIDIA und ein (einzelner Kern eines) Intel i7-Prozessors?

Und ich weiß, dass es auch von der Art des Algorithmus abhängt.

Ich brauche keine strikte Antwort, sondern erfahrene Beispiele wie: für einen Bildmanipulationsalgorithmus mit doppelpräzisem Fließkomma und 10 Operationen pro Pixel dauerte zunächst 5 Minuten und läuft jetzt mit dieser Hardware in x Sekunden.

11voto

Marco van de Voort Punkte 24852

Ihre Frage ist zu weit gefasst und sehr schwer zu beantworten. Außerdem ist nur ein kleiner Prozentsatz der Algorithmen (diejenigen, die ohne viel gemeinsamen Zustand auskommen) mit GPUs machbar.

Aber ich möchte Sie auffordern, Behauptungen kritisch zu betrachten. Ich bin in der Bildverarbeitung tätig und habe viele Artikel zu diesem Thema gelesen, aber im Falle der GPU beträgt die Zeit für das Hochladen der Eingabedaten in die GPU und das Herunterladen der Ergebnisse zurück in den Hauptspeicher häufig no in die Berechnung des Faktors einfließen.

Es gibt zwar einige wenige Fälle, in denen dies keine Rolle spielt (beide sind klein oder es gibt eine zweite Berechnungsstufe, die das Ergebnis weiter verkleinert), aber in der Regel muss man die Ergebnisse und die Ausgangsdaten übertragen.

Ich habe erlebt, dass sich dadurch ein behauptetes Plus in ein Minus verwandelt hat, weil allein die Upload-/Download-Zeit länger war, als die Haupt-CPU für die Berechnung benötigt hätte.

Das Gleiche gilt für die Kombination von Ergebnissen verschiedener GPU-Karten.

Update Neuere Grafikprozessoren scheinen in der Lage zu sein, mit Hilfe von Ping-Pong-Puffern gleichzeitig hoch- und herunterzuladen und zu rechnen. Der Ratschlag, die Randbedingungen gründlich zu prüfen, gilt jedoch nach wie vor. Es gibt eine Menge Spin da draußen.

Aktualisierung 2 Die Verwendung einer GPU, die mit der Videoausgabe geteilt wird, ist oft nicht optimal. Erwägen Sie z. B. den Einbau einer Low-Budget-Karte für Video und die Verwendung der Onboard-Grafikkarte für GPGPU-Aufgaben.

1voto

bjoernz Punkte 3812

Ich denke, dass dies Video-Einführung zu OpenCL gibt eine gute Antwort auf Ihre Frage in der ersten oder zweiten Folge (ich erinnere mich nicht). Ich glaube, es war am Ende der ersten Folge...

Im Allgemeinen hängt es davon ab, wie gut Sie das Problem "parallelisieren" können. Auch die Größe des Problems selbst spielt eine Rolle, da es Zeit kostet, die Daten auf die Grafikkarte zu kopieren.

1voto

grrussel Punkte 7171

Ihre Frage ist im Allgemeinen schwer zu beantworten; es gibt einfach viele verschiedene Variablen, die es schwierig machen, genaue oder faire Antworten zu geben.

Sie vergleichen also gleichzeitig 1) die Wahl des Algorithmus, 2) die relative Leistung der Hardware, 3) die Optimierungsfähigkeit des Compilers, 4) die Wahl der Implementierungssprachen und 5) die Effizienz der Algorithmusimplementierung...

Beachten Sie, dass z. B. verschiedene Algorithmen auf der GPU besser laufen als auf der CPU, und dass die Datenübertragungen zur und von der GPU bei den Zeitangaben ebenfalls berücksichtigt werden müssen.

AMD hat eine Fallstudie (eigentlich mehrere) zur OpenCL-Leistung für OpenCL-Code, der auf der CPU und auf der GPU ausgeführt wird. Hier ist eine mit Leistungsergebnissen für spärliche Matrix-Vektor-Multiplikation.

1voto

peakxu Punkte 6487

Es hängt sehr stark vom Algorithmus ab und davon, wie effizient die Implementierung sein kann.

Insgesamt kann man mit Fug und Recht behaupten, dass die GPU besser rechnet als die CPUs. Eine Obergrenze ergibt sich daher, wenn man die theoretische GFlops-Leistung eines Spitzen-GPU durch eine Spitzen-CPU teilt. Eine ähnliche Berechnung können Sie für die theoretische Speicherbandbreite durchführen.

Zum Beispiel 1581,1 GFlops für eine GTX580 im Vergleich zu 107,55 GFLOPS für einen i7 980XE. Beachten Sie, dass die Bewertung für GTX580 für einfache Präzision gilt. Ich glaube, man muss den Wert für die Fermi-Klasse, die nicht Tesla ist, um den Faktor 4 reduzieren, um auf den Double-Precision-Wert zu kommen. In diesem Fall können Sie also ungefähr 4x erwarten.

Hinweise darauf, warum Sie vielleicht besser abschneiden (oder Ergebnisse sehen, die weitaus höhere Geschwindigkeitssteigerungen behaupten):

  1. GPUs haben eine bessere Speicherbandbreite als CPUs, sobald die Daten auf der Karte sind. Manchmal können speichergebundene Algorithmen auf dem Grafikprozessor gut funktionieren.

  2. Clevere Nutzung von Caches (Texturspeicher usw.), die eine bessere als die angegebene Bandbreite ermöglichen.

  3. Wie Marco sagt, wurde die Transferzeit nicht mitgerechnet. Ich persönlich beziehe diese Zeit immer in meine Arbeit mit ein und habe festgestellt, dass die größten Geschwindigkeitssteigerungen bei iterativen Algorithmen zu verzeichnen sind, bei denen alle Daten auf die GPU passen (ich persönlich habe hier über 300x auf einer Mittelklasse-CPU zu einer Mittelklasse-GPU erhalten).

  4. Vergleiche von Äpfeln mit Orangen. Ein Vergleich zwischen einer Top-End-GPU und einer Low-End-CPU ist von Natur aus unfair. Das Gegenargument ist, dass eine High-End-CPU viel mehr kostet als eine High-End-GPU. Sobald Sie einen GFlops/$- oder GFlops/Watt-Vergleich anstellen, kann es für die GPU viel günstiger aussehen.

1voto

__kernel void vecAdd(__global float* results )
{
   int id = get_global_id(0);
}

dieser Kernel-Code kann 16M Threads auf einer neuen 60$ R7-240 GPU in 10 Millisekunden erzeugen.

Dies entspricht 16 Thread-Erstellungen oder Kontextwechseln in 10 Nanosekunden. Was ist die Taktung einer 140$ FX-8150 8-Kern CPU? Es ist 1 Thread in 50 Nanosekunden pro Kern.

Jede in diesem Kernel hinzugefügte Anweisung ist ein Gewinn für eine GPU, bis sie eine Verzweigung macht.

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