Frage

Mich würde interessieren, ob jemand eine Bewerbung geschrieben hat, die die Vorteile von a nutzt GPGPU indem Sie zum Beispiel nVidia CUDA.Wenn ja, welche Probleme haben Sie festgestellt und welche Leistungssteigerungen haben Sie im Vergleich zu einer Standard-CPU erzielt?

War es hilfreich?

Lösung

Ich habe GPGPU Entwicklung getan mit ATI Stream SDK statt Cuda . Welche Art von Leistung gewinnen Sie hängt davon ab, eine erhalten Los von Faktoren ab, aber das wichtigste ist, die numerische Intensität. (Das heißt, das Verhältnis von Rechenoperationen an Speicherreferenzen.)

A BLAS pegel 1 oder BLAS Ebene-2-Funktion wie das Hinzufügen von zwei Vektoren nur, dass 1 math Operation für jede Speicherreferenzen 3, so dass der NI ist (1/3). Dies ist immer dann laufen langsamer mit CAL oder Cuda als nur auf der CPU zu tun in. Der Hauptgrund dafür ist die Zeit, um die Daten von der CPU auf die GPU zu übertragen und wieder zurück.

Für eine Funktion wie FFT gibt O sind (N log N) Berechnungen und O (N) Speicherreferenzen, so dass der NI O (log N) ist. Wenn N sehr groß ist, sagen 1.000.000 es wahrscheinlich schneller sein wird es auf der gpu zu tun; Wenn N klein ist, sagt 1000 es mit ziemlicher Sicherheit langsamer sein wird.

Für eine BLAS pegel 3 oder LAPACK Funktion wie LU-Zerlegung einer Matrix oder ihre Eigenwert zu finden, gibt es O (N ^ 3) Berechnungen und O (N ^ 2) Speicherreferenzen, so dass der NI ist O (N ). Für sehr kleine Arrays, sagen N ein paar Score sind, diese noch schneller sein werden auf der CPU zu tun, aber wie N zunimmt, sehr der Algorithmus geht schnell aus dem Gedächtnis gebunden berechnen gebunden und die Leistungssteigerung auf der gpu sehr steigt schnell.

Alles, was komplexe stehenden Rechen hat mehr Berechnungen als skalare arithmetische denen, die in der Regel die NI verdoppelt und GPU-Leistung erhöht.


(Quelle: earthlink.net )

Hier

ist die Leistung CGEMM - Komplex mit einfacher Genauigkeit Matrix-Matrix-Multiplikation auf einer Radeon 4870 getan

.

Andere Tipps

I triviale Anwendungen geschrieben haben, es hilft wirklich, wenn Sie parallize können Punktberechnungen schweben.

Ich fand den folgenden Kurs cotaught von einem University of Illinois Urbana Champaign Professor und einem NVIDIA Ingenieure sehr nützlich, als ich die ersten Schritten: http://courses.ece.illinois.edu/ece498/al/Archive/Spring2007/Syllabus.html (inklusive Aufnahmen aller Vorträge).

I CUDA haben für mehrere Bildverarbeitungsalgorithmen verwendet. Diese Anwendungen sind natürlich sehr gut geeignet für CUDA (oder jede GPU Verarbeitung Paradigma).

IMO gibt es drei typische Phasen, wenn ein Algorithmus CUDA portieren:

  1. Initial Porting: Auch mit einer sehr grundlegenden Kenntnissen über CUDA, können Sie Port einfache Algorithmen innerhalb weniger Stunden. Wenn Sie Glück haben, gewinnen Sie einen Faktor von 2 bis 10 in der Leistung.
  2. Trivial Optimizations: Dies beinhaltet Texturen für Eingangsdaten und padding mehrdimensionaler Arrays verwenden. Wenn Sie erfahren sind, kann dies innerhalb eines Tages erfolgen und könnten Sie einen anderen Faktor 10 in der Leistung geben. Der resultierende Code ist immer noch lesbar.
  3. Hardcore Optimizations: Das Kopieren von Daten auf gemeinsam genutzten Speicher enthält globale Speicherlatenz zu vermeiden, den Code Drehen von innen nach außen, die Anzahl der verwendeten Register zu reduzieren, etc. Sie mehrere Wochen mit diesem Schritt verbringen, aber der Performance-Gewinn ist nicht wirklich lohnt sich in den meisten Fällen. Nach diesem Schritt wird der Code so verschleiert, dass niemand versteht es (auch Sie).

Dies ist sehr ähnlich einen Code für CPUs zu optimieren. die Antwort eines GPU Performance-Optimierungen ist jedoch noch weniger vorhersehbar als bei CPUs.

Ich habe für die Bewegungserkennung unter Verwendung von GPGPU (Ursprünglich CG verwenden und jetzt CUDA) und Stabilisierung (unter Verwendung von CUDA) mit Bildverarbeitung. Ich habe über eine 10-20x Speedup in diesen Situationen zu bekommen.

Von dem, was ich gelesen habe, ist dies für datenparallele Algorithmen ziemlich typisch ist.

Während ich keine praktischen Erfahrungen mit CUDA noch bekommen habe, habe ich das Thema Studium und eine Reihe von Papieren gefunden, die positiven Ergebnisse dokumentieren mit GPGPU-APIs (sie sind alle mit CUDA).

Das Papier rel="nofollow beschreibt, wie Datenbank, indem können paralellized verbindet eine Anzahl von parallelen Primitiven (Karte, Streuung, sammeln usw.), die zu einem effizienten Algorithmus kombiniert werden können.

In dieser Papier , eine parallele Implementierung der Standard-AES-Verschlüsselung erstellt mit vergleichbare Geschwindigkeit zu diskreter Hardware-Verschlüsselung.

Schließlich ist diese

Ich habe eine Monte-Carlo-Berechnung in CUDA für einige Finanz Verwendung umgesetzt. Der optimierte CUDA-Code ist über 500x schneller als ein „schwerer haben versucht, konnte aber nicht wirklich“ Multi-Thread-CPU-Implementierung. (Vergleich einer GeForce 8800GT mit einem Q6600 hier). Es ist gut, dass Monte Carlo Probleme peinlich obwohl parallel sind.

Wichtige Probleme gestoßen beinhaltet den Verlust der Präzision durch G8x und Begrenzung der G9x Chip einfacher Genauigkeit Gleitkommazahlen nach IEEE. Mit der Veröffentlichung der GT200-Chips könnte dies zu einem gewissen Grad gemildert werden, indem die doppelte Genauigkeit Einheit, auf Kosten einer gewissen Leistung. Ich habe es noch nicht ausprobiert.

Da auch CUDA ist eine C-Erweiterung, kann es in einer anderen Anwendung zu integrieren sein, nicht-trivial.

implementiert ich einen genetischen Algorithmus auf der GPU und bekam Geschwindigkeit ups von rund 7 .. Weitere Gewinne möglich sind, mit einer höheren numerischen Intensität als jemand anderes darauf hingewiesen. Also ja, sind die Gewinne aus, wenn die Anwendung richtig ist

Ich habe zur Lösung große linear Gleichungs auf GPU ATI Stream SDK Cholesky-Faktorisierung implementiert. Meine Beobachtungen waren

alt text

Got Leistung Speedup bis zu 10-mal.

auf demselben Problem arbeiten zu optimieren es, indem sie es auf mehrere GPUs skaliert werden.

Ja. Ich habe die Filter Nonlinear Anisotrope Diffusion implementiert mit die CUDA api.

Es ist ziemlich einfach, da es sich um ein Filter ist, die parallel ein Eingangsbild gegeben ausgeführt werden muss. Ich habe nicht viele Schwierigkeiten auf diese gestoßen, da es nur einen einfachen Kernel benötigt. Der Speedup war bei etwa 300x. Das war mein letztes Projekt auf CS. Das Projekt kann hier (es ist geschrieben in Portugiesisch du) zu finden.

Ich habe versucht, die Mumford & Shah zu Segmentierungsalgorithmus, aber das ist ein Schmerz zu schreiben, da CUDA noch am Anfang ist und so viele merkwürdige Dinge geschehen war. Ich habe sogar eine Leistungsverbesserung gesehen durch einen if (false){} im Code O_O hinzugefügt wird.

Die Ergebnisse für diesen Segmentierungsalgorithmus waren nicht gut. Ich hatte einen Leistungsverlust von 20x im Vergleich zu einem CPU-Ansatz (jedoch, da es sich um eine CPU ist ein anderer Ansatz, der die gleichen Ergebnisse yelded genommen werden könnte). Es ist immer noch ein work in progress, aber unfortunaly verließ ich das Labor arbeite ich an, vielleicht einen Tag könnte ich es beenden.

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