2009-09-12 4 views
16

Ich bin interessiert zu wissen, ob alle gängigen Algorithmen (Sortierung, Suche, Grafiken, etc.) auf OpenCL (oder eine andere GPU-Sprache) portiert wurden, und wie die Leistung zu vergleichen ist Algorithmus, der von der CPU ausgeführt wird. Ich bin speziell an den Ergebnissen (Zahlen) interessiert.GPU vs CPU-Leistung für allgemeine Algorithmen

Danke!

Antwort

3

Es gibt quite a few samples von dieser Art von Sache auf NVidias Website. Denken Sie daran, dass einige Dinge wie das Sortieren spezielle Algorithmen für eine effiziente Parallelität benötigen und möglicherweise nicht so effizient sind wie ein Algorithmus ohne Threads auf einem einzelnen Kern.

9

GPUs sind hochspezialisierte Hardware, die für eine kleine Anzahl von Aufgaben entwickelt wurde und sehr gut parallelisiert werden kann. Dies ist im Grunde arithmetisch (insbesondere Gleitkommaarithmetik mit einfacher Genauigkeit, obwohl neuere GPUs mit doppelter Genauigkeit recht gut funktionieren). Als solche sind sie nur für bestimmte Algorithmen geeignet. Ich bin mir nicht sicher, ob die Sortierung zu dieser Kategorie passt (zumindest im allgemeinen Fall).

Häufigere Beispiele sind die Preisgestaltung von Finanzinstrumenten, große Mengen an Matrixmathematik und sogar defeating encryption (durch rohe Gewalt). Davon abgesehen habe ich Fast parallel GPU-sorting using a hybrid algorithm gefunden.

Ein anderes häufig zitiertes Beispiel ist running [email protected] on an Nvidia GPU, aber es vergleicht Äpfel mit Orangen. Die Arbeitseinheiten für GPUs sind anders (und stark begrenzt), verglichen mit dem, was CPUs normalerweise tun.

5

Werfen Sie einen Blick auf thrust:

Thrust ist eine CUDA-Bibliothek von parallelen Algorithmen mit einer Schnittstelle ähnelt dem C++ Standard Template Library (STL). Schub bietet eine flexible High-Level-Schnittstelle für GPU Programmierung, die Entwicklerproduktivität erheblich verbessert.

+0

Schub hat auch gerade Version 1.1 freigegeben. – Eric

4

BE BEHALTEN, sehr vorsichtig von irgendwelchen Leistungszahlen für GPGPU zitiert. Viele Leute posten gerne wirklich beeindruckende Zahlen, die nicht die Transferzeit berücksichtigen, die benötigt wird, um die Eingabedaten von der CPU zur GPU und die Ausgabedaten zurück zu bekommen, wobei beide über einen PCIe-Flaschenhals laufen.

+0

Danke-guten Punkt. – Chris

+3

Das stimmt, aber viele der Beispiele auf der NVIDIA-Webseite sind vollständige Anwendungen und beinhalten definitiv diese Übertragungszeiten. Das eigentliche Problem ist: Wie optimiert ist die CPU-Version im Benchmark? – Eric

0

Die Bildgrößenanpassung muss auf vielen Websites, die Bilduploads akzeptieren, üblich sein.

Die Größenänderung eines 2600ish x 2000ish 2MB JPEG-Bildes (auf 512x512) benötigte 23,5 Millisekunden in C# mit absolut niedrigsten Qualitätsoptionen und Nearest-Neighbor-Sampling. Verwendete Funktion war graphics.DrawImage() basierend auf 1. CPU-Auslastung war auch% 21.5.

Die Extraktion von "rgba byte array" auf C# -Seite und das Senden an GPU und die Größenänderung in GPU und das Zurückgeben von Ergebnissen in ein Bild dauerte 6,3 Millisekunden und die CPU-Auslastung betrug% 12.7. Dies wurde mit einem 55% günstigeren GPU mit nur 320 Kernen gemacht.

Nur 3,73X Beschleuniger.

Der limitierende Faktor hier war, die extrahierten 20 MB RGB-Daten (JPEG ist nur 2 MB!) Zu GPU zu senden. Dieser zeitraubende Teil war fast% 90 der gesamten Zeit, einschließlich der C# -Seiten-Byte-Array-Extraktion! Also würde ich sagen, dass es eine 30-fache Beschleunigung geben würde, zumindest wenn die Extraktion auch in der GPU erfolgen könnte.

30X ist nicht schlecht.

Dann können Sie die Extraktionsebene mit der Größenänderungsschicht in die Pipeline leiten, um die Speicherkopienlatenz zu verbergen, um noch schneller zu werden! Dies könnte 40X-50X sein.

Dann erhöhen Sie die Qualität der Probenahme (wie Bikubic statt nächster Nachbar), Sie haben noch mehr Vorteile in der GPU-Seite. Das Hinzufügen eines 5x5-Gauß-Filters fügte nur 0,77 Millisekunden hinzu. Die CPU würde darüber hinaus eine höhere Zeit bekommen, insbesondere wenn die benötigten Gauß-Parameter anders als die C# .Net-Implementierung sind.


Auch wenn Sie mit Beschleunigungs-Verhältnis nicht zufrieden sind, zu GPU ausgelagert und einen „freien Kern“ auf der CPU ist noch vorteilhaft für mehr Arbeit zu diesem Server schieben.

Jetzt fügen Sie die Tatsache der GPU Stromverbrauch Ebenen (30W vs 125W in diesem Beispiel), es ist viel vorteilhafter.


CPU konnte kaum in

C[i]=A[i]+B[i] 

Benchmarks gewinnen, wenn beide Seiten auf optimierten Codes laufen und Sie können immer noch Offload Hälfte von Arrays GPU und beenden schneller CPU mit + GPU zugleich.


GPU ist nicht für ungleichmäßige Arbeiten gebaut. GPUs haben tiefe Pipelines, so dass sie aufgrund von Verzweigungen nach einem Stand aufstehen, zu lange brauchen. Auch SIMD-Typ-Hardware zwingt es auf allen Arbeitselementen auf dasselbe zu tun. Wenn ein Arbeitselement eine andere Aufgabe als die Gruppe ausführt, verliert es die Spur und fügt Blasen in der gesamten SIMD-Pipeline hinzu oder andere warten auf den Synchronisationspunkt. Die Abzweigung wirkt sich also sowohl auf tiefe als auch auf breite Pipeline-Bereiche aus und macht sie in perfekt chaotischen Bedingungen sogar langsamer als CPU.