Frage

Ich bin daran interessiert zu wissen, ob irgendwelche gemeinsamen Algorithmen (Sortieren, Suchen, Grafiken, etc.) zu OpenCL portiert wurde (oder jede GPU Sprache), und wie die Leistung ist vergleichbar mit dem gleichen Algorithmus, der von der CPU ausgeführt. Ich bin speziell interessiert an den Ergebnissen (Zahlen).

Danke!

War es hilfreich?

Lösung

Es gibt ganz wenige Proben dieser Art der Sache auf NVidia-Website. Bedenken Sie, dass einige Dinge, wie das Sortieren benötigt spezielle Algorithmen für die effiziente Parallelität und möglicherweise nicht ganz so effizient wie ein nicht-Thread-Algorithmus auf einem einzelnen Kern.

Andere Tipps

GPUs sind hoch spezialisierte Hardware entwickelt, um sehr gut einen kleinen Satz von Aufgaben zu tun und hoch parallelisierte. Dies ist im Grunde Arithmetik (besonders single precision floating point math obwohl neuere GPUs mit doppelter Genauigkeit ganz gut tun). Als solche sind sie auf bestimmte Algorithmen nur geeignet. Ich bin mir nicht sicher, ob Sortieranlage diese Kategorie paßt (im allgemeinen Fall zumindest).

Weitere bekannte Beispiele sind die Preisgestaltung von Finanzinstrumenten, große Mengen an Matrix Mathematik und sogar Verschlüsselung besiegen (durch Brute-Force). Davon abgesehen, habe ich gefunden schnelle parallele GPU-Sortieranlage einen Hybrid-Algorithmus verwenden.

Ein weiteres häufig zitiertes Beispiel ist läuft SETI @ HOME auf einem Nvidia GPU aber es ist zu vergleichen Äpfel Orangen. Die Arbeitseinheiten für GPUs sind unterschiedlich (und sehr begrenzt) im Vergleich zu dem, was CPUs gewöhnlich tun.

Hier finden Sie aktuelle Schub :

  

Thrust ist eine CUDA-Bibliothek paralleler   Algorithmen mit einer Schnittstelle   ähnlich dem C ++ Standard Template   Library (STL). Schub liefert ein   flexible High-Level-Schnittstelle für die GPU   Programmierung, die sich stark verbessert   die Produktivität der Entwickler.

Seien Sie vorsichtig, sehr vorsichtig mit jeder Performance-Zahlen für GPGPU zitiert. Viele Leute mögen wirklich beeindruckende Zahlen schreiben, die die Transferzeit berücksichtigen, nicht erforderlich, um die Eingangsdaten von der CPU auf die GPU zu bekommen und die Ausgangsdaten zurück, die beide über einen PCIe-Engpass gehen.

Bildanpassung muss auf vielen Websites, gemeinsam sein, das Bild-Uploads übernehmen.

Ändern der Größe ein 2600ish x 2000ish 2MB-JPEG-Bildes (bis 512x512) nahm von 23,5 Millisekunden in C # mit absolut niedrigsten Qualitätsoptionen und nächsten Nachbarn Probenahme. Gebrauchte Funktion wurde auf Basis einer graphics.DrawImage(). CPU-Auslastung war auch% 21.5.

„rgba Byte-Array“ Extraktion auf C # Seite bekommen und auf GPU und Ändern der Größe in GPU Senden und das Erzielen von Ergebnissen zurück in ein Bild nahm 6,3 Millisekunden und die CPU-Auslastung war% 12.7. Dies wurde mit nur 320 Kernen mit einem% 55 billigen gpu getan.

Nur 3.73X Speedup Multiplikator.

Der limitierende Faktor war hier, um die extrahierten 20MB rgb Senden von Daten (JPEG ist nur 2 MB!) Zu GPU. Das Zeitteil verzehrte fast 90% der Gesamtzeit, einschließlich C # Seiten Bytedatenfeld Extraktion! So gues ich würde es etwa 30X Speedup zumindest, wenn Extraktionsteil auch in GPU getan werden könnte.

30X ist nicht schlecht.

Dann könnte man die Extraktionsschicht mit der Redimensionierung Schicht Pipeline Speicherkopie Latenz zu verbergen noch mehr Geschwindigkeit zu erhalten! Dies könnte 40X-50X.

erhöhen Sie die Qualität der Probenahme (wie bikubisch statt nächsten Nachbarn), können Sie noch mehr Vorteile in GPU Seite haben. Hinzufügen eines 5x5 Gauß-Filter nur 0,77 milliseonds hinzugefügt. CPU würde eine höhere Zeit oben auf, dass, vor allem, wenn die Gaußsche Parameter erforderlich sind anders als C # .NET-Implementierung.


Auch wenn Sie mit Beschleunigungs-Verhältnis nicht zufrieden sind, zu GPU ausgelagert und ein „freier Kern“ auf der CPU auf den Server zum Schieben mehr Arbeit noch von Vorteile ist.

Jetzt die Tatsache des GPU Stromverbrauch (30W vs 125W in diesem Beispiel) hinzufügen, ist es viel vorteilhafter.


CPU konnte kaum gewinnen in

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

Benchmarks, wenn beide Seiten auf optimierten Codes laufen und Sie können immer noch die Hälfte der Arrays GPU-Offload und beenden schneller mit CPU + GPU zur gleichen Zeit.


GPU ist nicht für die nicht einheitliche Werke gebaut. GPUs haben tiefe Rohrleitungen wegen der Verzweigung nach einem Stall so im Stehen, dauert zu lange. Auch SIMD-Typ Hardware-Kräfte es gleiche Sache auf allen Arbeitsschritten auf, es zu tun. Wenn ein workitem eine andere Sache tut als die Gruppe, verliert sie verfolgen und fügt Blasen in ganze Pipeline SIMD oder einfach andere warten auf den Sync-Punkt. So brancing betrifft sowohl tiefe und breite Pipeline Bereiche und machen es noch langsamer als CPU in völlig chaotische Zustände.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top