2016-05-05 6 views
2

Ich schreibe gerade ein Programm, das 2D-Blöcke eines großen 2D-Arrays auswählt und sie in ein kleineres 2D-Array einfügt. Die Arrays werden tatsächlich als 1D-Arrays gespeichert, aber ich nehme an, dass sie 2D-Arrays sind, die gerade ausgerichtet sind. Gerade jetzt für Loops sicherstellen, dass ich Nx, Ny Elemente der großen Schleife herausnehmen, bevor Sie zu einem neuen Teil des großen Arrays weitergehen.3 C++ Schleifen in Cuda entpacken

Ich kann wirklich einen Weg finden, diese Datenübertragung in einem CUDA Kernel effizienter zu machen. Ich wäre in der Lage gewesen, eine Lösung zu finden, wenn ich nur Arrays gleicher Größe hätte. Aber mit einem neuen Ort nach jedem Nx * Ny-Element bin ich verwirrt.

Unten sind die 3 for-Schleifen, die alles passieren lassen. posx und posy enthalten Koordinaten, die Startpositionen subtrahieren müssen.

for (int i = 0; i < loadsize; i++) 
    { 
     for (int k = 0; k < Searchsizey; k++) 
     { 
      for (int l = 0; l < Searchsizex; l++) 
      { 
       img[count] = ImgInt[posx[i] - ImgStartx + (posy[i] - ImgStarty) * sizex + sizex*k + l]; 
       count++; 
      } 
     } 
    } 

Das Problem ist, dass die beiden inneren Schleifen auf maximal Searchsizex und Searchsizey laufen. Wenn ich dies in einem Kernel implementieren möchte, der l und k als Indizierung von Threads verwendet, werden diese größer als Sochesizex und Sizesizey.

Ich dachte daran, einen CUDA-Kernel zu erstellen, der iterativ durchläuft, aber es scheint sehr effizient zu sein, dies auf diese Weise zu tun. Unten ist, was ich thoguht über das Einsetzen in einen Kernel, aber ich mag es nicht sehr. Es ist nur eine Art "halbparallel".

Ich hoffe, Sie haben ein paar Vorschläge, wie Sie das parallel machen können, danke!

+2

Abhängig von der Größe Ihrer Eingabe und der Größe von Posx und Posy können verschiedene Ansätze passen. Können Sie ungefähre Messwerte für diese angeben? Auch der Datentyp von img? –

+0

posx und posy könnten von sagen 0 bis 1000 reichen und dort könnte die Größe von loadszie Hunderte sein. Img ist ein Float – LukaK

+1

Um die beste Leistung zu erzielen, möchten Sie float4 als Schreibvorgänge verwenden und abhängig von der Zielhardware Textur oder Oberfläche für ImgInt verwenden. Im übrigen erscheint Ihr Ansatz der Parallelität sehr sinnvoll. –

Antwort

1

Also ich denke, da es keine Antworten mehr auf diesen Thread gab, werde ich Florents Kommentar als Antwort verwenden.

Die Schreibvorgänge müssen vom Typ float4 sein, und abhängig von der Zielhardware sollte für ImgInt Textur oder Oberflächentyp verwendet werden.

Ansonsten scheint der Ansatz der Parallelität sehr sinnvoll.