Ich habe gerade angefangen, OpenCL zu lernen. Ich versuche ein Gefühl dafür zu bekommen, welche Leistungsgewinne zu erwarten sind, wenn man Funktionen / Algorithmen auf die GPU verschiebt.
Der einfachste Kernel, der in den meisten Tutorials gegeben wird, ist ein Kernel, der zwei Arrays von Zahlen akzeptiert und den Wert an den entsprechenden Indizes summiert und sie zu einem dritten Array hinzufügt, etwa so:
%Vor%Ich gehe davon aus, dass Sie es niemals rechtfertigen könnten, dies auf der GPU zu berechnen, die Speicherübertragung würde die Zeit, die es nach Größenordnungen auf der CPU benötigt, ausnutzen (ich könnte mich deswegen irren). p>
Was ich mich wundere ist, was wäre das trivialste Beispiel, bei dem man eine wesentliche Beschleunigung erwarten würde, wenn man einen OpenCL-Kernel anstelle der CPU verwendet?
Wenn Sie über genügend Matrizen verfügen, mit denen Sie lineare Algebra-Operationen ausführen möchten, oder wenn Sie im Wesentlichen dieselbe Operation für jedes Element ausführen, würde ich dies als ein triviales Beispiel betrachten. Matrixmultiplikation, Addition, FFT's, Faltung, etc. Sie werden ein wenig Beschleunigung sehen, ohne viel Arbeit zu machen. Wenn Sie nun die 100-fachen Beschleunigungen sehen möchten, müssen Sie sich in die Speicherverwaltung vertiefen und wissen, was hinter den Kulissen passiert.
Für den Anfang würde ich empfehlen, mit pycuda zu beginnen, da es ziemlich einfach ist, loszulegen, da es ein sehr hohes Abstraktionsniveau bietet und es Ihnen erlaubt, sehr schnell zu springen. Schauen Sie sich diesen Kurs über Parallel Computing mit Cuda von der Universität von Illinois an, wenn Sie bereit sind, weiter zu tauchen .
Obwohl Ihr Kernel offensichtlich sehr trivial ist, kann er ein nützliches Beispiel sein, er ist vollständig speichergebunden, da Sie für jedes Element zwei Lese- und einen Schreibzugriff und nur eine arithmetische Operation haben. Es gibt einige Anweisungen, um die Adresse usw. zu berechnen, aber das alles ist praktisch nichts im Vergleich zu den Kosten für den Zugriff auf Speicher.
Angenommen, die Daten befinden sich bereits auf der GPU, können Sie selbst für diesen einfachen Kernel von der sehr hohen Bandbreite der GPU für den Speicher profitieren.
Natürlich sind GPUs darauf angewiesen, dass Sie genügend Threads haben, um die Speicherlatenz zu verbergen, sodass die Größe Ihrer lokalen Arbeitsgruppe ziemlich groß sein sollte (zB 256 oder 512) und Ihre globale Arbeitsgruppengröße sehr groß sein sollte (z. B. Hunderttausende) ) Damit dies effektiv ist, aber das ist der Punkt!
Ich weiß, die Frage ist ziemlich alt, aber ... Ich fand, dass die Berechnung des Mandelbrot-Satzes für GPU ziemlich optimal ist. Sie haben einen komplexen Eingabevektor (float2) und eine skalare Ausgabe (int) und Sie haben im Durchschnitt einige hundert Operationen pro Eingabevektor.
Es könnte als eine gute Beispielanwendung verwendet werden, wie es ...
Grüße, Stefan
Nach der Matrixmultiplikation würde ich Bildkonvolution sagen (wie Unschärfe, Rauschunterdrückung usw.). Sehen Sie sich das AMD-Lernprogramm an.
Was "trivial" ist, ist eine Frage der Meinung, aber ich würde sagen, dass die Berechnung eines Bildes des Mandelbrot-Sets eine ziemlich einfache Anwendung unter Verwendung der GPU ist. Jeder Punkt ist völlig unabhängig von jedem anderen Punkt, so dass Sie für jeden Punkt einen Thread starten und eine enorme Beschleunigung erzielen können. Die Formel selbst, die iteriert wird, ist eine einfache quadratische Funktion. Ich habe es als Beispiel in einem Tutorial verwendet, das auf meinem Blog hier zu finden ist , einfach die Zahlen berechnen, ohne ein Bild zu machen, um es noch einfacher zu machen. Fast jedes peinlich parallele Problem (siehe Wikipedia-Eintrag) ist ein guter Anfang.