Was ist die triviale Funktion, die aus wird berechnet auf einer GPU profitieren würde?

StackOverflow https://stackoverflow.com/questions/2443402

  •  19-09-2019
  •  | 
  •  

Frage

Ich fange gerade OpenCL Lernen aus. Ich versuche, ein Gefühl dafür zu bekommen, was Performance-Gewinne zu erwarten, wenn Funktionen / Algorithmen auf die GPU zu bewegen.

Die grundlegendste Kernel in den meisten Anleitungen gegeben ist ein Kernel, die zwei Reihen von Zahlen nimmt und summiert den Wert an den entsprechenden Indizes und fügt sie zu einem dritten Array, etwa so:

__kernel void 
add(__global float *a,
    __global float *b,
    __global float *answer)
{
    int gid = get_global_id(0);
    answer[gid] = a[gid] + b[gid];
}

__kernel void
sub(__global float* n,
    __global float* answer)
{
    int gid = get_global_id(0);
    answer[gid] = n[gid] - 2;
}

__kernel void
ranksort(__global const float *a,
         __global float *answer)
{
  int gid = get_global_id(0);
  int gSize = get_global_size(0);
  int x = 0;
  for(int i = 0; i < gSize; i++){
    if(a[gid] > a[i]) x++;
  }
  answer[x] = a[gid];
}

Ich gehe davon aus, dass Sie nie auf der GPU justify Berechnung könnte, würde die Speicherübertragung, um die Zeit gewichten sie die Berechnung dieser um Größenordnungen auf der CPU nehmen würde (könnte ich darüber, daher ist diese Frage falsch sein).

Was ich frage mich, ist das, was die meisten triviales Beispiel wäre, wenn Sie erhebliche Beschleunigung erwarten würde, wenn eine OpenCL-Kernel anstelle der CPU mit?

War es hilfreich?

Lösung

Wenn Sie eine ausreichend große Menge von Matrizen Sie beabsichtigen, auf der linearen Algebra Operationen auszuführen, oder dass Sie im Wesentlichen auf jedem Element die gleiche Operation durchgeführt wird, würde ich das als ein triviales Beispiel betrachten. Matrix-Multiplikation, Addition, FFTs, Faltung, usw. Sie werden ein bisschen ein Speedup sehen, ohne viel Arbeit zu tun. jetzt, wenn Sie die 100x speedups sehen wollen, dann müssen Sie in die Speicherverwaltung vertiefen und ein gutes Stück darüber wissen, was hinter den Kulissen vor sich geht.

für den Einstieg, würde ich beginnen mit pycuda empfehlen, da es ziemlich einfach, um loszulegen, da sie einen sehr hohen Abstraktionsniveau bietet und ermöglicht es Ihnen, sehr schnell zu springen. lesen Sie in diesem Kurs auf parallel aus der Berechnung cuda von der Universität von Illinois mit http: //courses.ece. illinois.edu/ece498/al/ , wenn Sie bereit sind, zu tauchen in weiter.

Andere Tipps

hängt von der Definition von trivial. meiner Meinung nach wäre es Matrix Matrixprodukt, da es O(3)/O(2) Rechen auf Speicher Verhältnis hat. Algorithmen, die ähnliche Verhältnisse aufweisen, sind wahrscheinlich profitieren von auf GPU konkurrierten wird.

Während des Kernels eindeutig sehr trivial ist, kann es ein nützliches Beispiel sein, ist es völlig Speicher gebunden, da für jedes Element Sie zwei liest und eine Schreib, und nur eine Rechenoperation. Es gibt einige Anweisungen, um die Adresse usw. zu berechnen, aber alle diese Beträge praktisch nichts im Vergleich zu den Kosten der Zugriff auf den Speicher.

, um die Daten Angenommen, ist bereits auf der GPU, können Sie von der sehr hohen Bandbreite GPU profitieren auf den Speicher auch für diesen einfachen Kernel.

Natürlich vertrauen GPUs auf Sie genug Threads, die die Speicherlatenz zu verstecken, so dass Ihre lokale Arbeitsgruppe Größe ziemlich groß sein soll (etwa 256 oder 512) und Ihre globale Arbeitsgruppengröße sollte sehr groß sein (zB Hunderttausende ) für dieses wirksam zu sein, aber das ist irgendwie der Punkt!

Ich weiß, die Frage ist ziemlich alt, aber ... Ich fand, dass Berechnungen der Mandelbrot-Menge ganz optimal für GPU ist. Sie haben einen komplexen Eingangsvektor (float2) und einen skalaren Ausgang (int) und Sie werden einige hundert Operationen pro Eingangsvektor im Durchschnitt.

Es könnte als ein gutes Beispiel-Anwendung verwendet werden, wie es ...

  • hat einen 2-dimensionalen Eingabedatensatz (berechnet ein Bild)
  • Sie können erklären, und warum Wellenfronten 2-dimensionale Verarbeitung ist vorteilhaft in einigen Fällen
  • zeigt Vektordatentypen
  • erzeugt ein Bild, das schnell überprüfbar durch das menschliche Auge ist (Debugging)
  • kann leicht erweitert werden, indem: Farbzuordnung (__constant), anstelle von float4 float2 (Optimierung) Verarbeitung, Produktion INT4 (R, G, B, A) Ausgangsvektoren (Optimierung). Reduktionsschritte (RGBA) => (RGB)
  • benötigte mathematisches Wissen ist akzeptabel (einfache Formel)

Viele Grüße, Stefan

Nach Matrixmultiplikation würde ich Bildfaltung (wie Unschärfe, Entrauschen etc.) sagen. Schauen Sie sich AMDs Tutorial .

Was „triviale“ ist eine Sache der Meinung, aber ich würde sagen, dass ein Bild der Mandelbrot-Menge Computing ist eine ziemlich einfache Anwendung unter Verwendung der GPU. Jeder Punkt ist völlig unabhängig von jedem anderen Punkt, so dass Sie einen Thread für jeden Punkt starten können und enorme Beschleunigung bekommen. Die Formel, die sich iteriert ist eine einfache quadratische Funktion. Ich benutzen es als Beispiel in einem Tutorial, das auf meinem Blog gefunden werden kann: hier , nur die Zahlen der Berechnung ohne selbst ein Bild zu machen, um es noch einfacher. Fast jede peinliche parallel (siehe Wikipedia-Eintrag) Problem ein gutes ist ein zu beginnen.

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