2010-03-14 5 views
8

Ich fange gerade an, 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.Was ist die trivialste Funktion, die von einer Berechnung auf einer GPU profitieren würde?

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 davon aus bin dass man es niemals rechtfertigen könnte, dies auf der GPU zu berechnen, die Speicherübertragung würde die Zeit, die es erfordert, dies auf der CPU nach Größenordnungen zu berechnen, ausnutzen (ich könnte mich dabei irren, daher diese Frage).

Was ich frage mich ist, was wäre das einfachste Beispiel, wo Sie erhebliche Beschleunigung erwarten würden, wenn Sie einen OpenCL-Kernel anstelle der CPU verwenden?

Antwort

6

Wenn Sie einen ausreichend großen Satz von Matrizen haben, an denen Sie lineare Algebra-Operationen ausführen möchten, oder dass Sie im Wesentlichen die gleiche 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, um zu beginnen, da es ein sehr hohes Maß an Abstraktion bietet und Ihnen erlauben wird, sehr schnell hereinzuspringen. Schauen Sie sich diesen Kurs über Parallel Computing mit Cuda von der Universität von Illinois http://courses.ece.illinois.edu/ece498/al/ an, wenn Sie bereit sind, weiter zu tauchen.

+0

Link ist unterbrochen. – user

3

hängt von der Definition von trivial ab. meiner Meinung nach wäre es Matrix-Matrix-Produkt, da es O(3)/O(2) Compute-to-Memory-Verhältnis hat. Algorithmen, die ähnliche Verhältnisse aufweisen, werden wahrscheinlich davon profitieren, dass sie auf GPU konkurrieren.

+0

Matrixmultiplikation weit von einer trivialen Anwendung ist und nicht das beste Beispiel für eine Anwendung, die von der GPU-Berechnung profitieren kann. – Eric

0

Nach Matrixmultiplikation würde ich Bildkonvolution sagen (wie Unschärfe, Rauschunterdrückung usw.). Auschecken AMD's tutorial.

2

Während Ihr Kernel offensichtlich sehr trivial ist, kann es ein nützliches Beispiel sein, es ist vollständig speichergebunden, da für jedes Element zwei Lese- und ein Schreiboperationen und nur eine arithmetische Operation vorhanden sind. Es gibt einige Anweisungen, um die Adresse usw. zu berechnen, aber all dies ergibt praktisch nichts im Vergleich zu den Kosten des Speicherzugriffs.

Angenommen, die Daten befinden sich bereits auf der GPU, können Sie die sehr hohe Bandbreite der GPU für den Speicher auch für diesen einfachen Kernel nutzen.

Natürlich verlassen sich GPUs darauf, dass Sie genügend Threads haben, um die Speicherlatenz zu verbergen, daher sollte die Größe Ihrer lokalen Arbeitsgruppe ziemlich groß sein (sagen wir 256 oder 512) und Ihre globale Arbeitsgruppe sollte sehr groß sein (z. B. Hunderte von Tausende), damit dies effektiv ist, aber das ist der Punkt!

0

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 benutzte es als Beispiel in einem Tutorial, das auf meinem Blog here zu finden ist, nur die Zahlen zu berechnen, ohne sogar ein Bild zu machen, um es noch einfacher zu machen. Fast jedes peinlich parallele Problem (siehe Wikipedia-Eintrag) ist ein guter Anfang.

1

Ich weiß, die Frage ist ziemlich alt, aber ... Ich fand, dass die Berechnungen des Mandelbrot-Set 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 Beispiel-Anwendung verwendet werden, wie es ...

  • hat einen 2-dimensionalen Eingabedatensatz (berechnet ein Bild)
  • Sie erklären kann und Wellenfronten, warum 2-dimensionale Verarbeitung vorteilhaft in einigen Fällen
  • zeigt Typen von Vektordaten
  • ein Bild erzeugt, das durch das menschliche Auge (Debugging)
  • kann leicht erweitert werden, schnell nachprüfbar ist: Farbzuordnung (__const ant), float4 processing statt float2 (optimierung), Erzeugung von int4 (R, G, B, A) Ausgangsvektoren (Optimierung). Reduktionsschritte (RGBA) => (RGB)
  • benötigte mathematisches Wissen ist akzeptabel (einfache Formel)

Grüße, Stefan