2016-08-06 29 views
0

Gegeben eine n-mal-m-Matrix, würde ich gerne einen n-dimensionalen Vektor erstellen, der das Minimum jeder Matrixzeile in CUDA enthält.Min der Array-Zeilen in CUDA

Bisher habe ich durch diese kommen:

__global__ void OnMin(float * Mins, const float * Matrix, const int n, const int m) { 
    int i = threadIdx.x + blockDim.x * blockIdx.x; 
    if (i < n) { 
     Mins[i] = Matrix[m * i]; 
     for (int j = 1; j < m; ++j){ 
      if (Matrix[m * i + j] < Mins[i]) 
       Mins[i] = Matrix[m * i + j]; 
     } 
    } 
} 

in genannt:

OnMin<<<(n + TPB - 1)/TPB, TPB>>>(Mins, Matrix, n, m); 

aber ich denke, dass etwas existieren könnte mehr optimiert.

Ich versuchte cublasIsamin in einer Schleife aufzurufen, aber es ist langsamer.

Ich habe auch versucht, einen Kernel (global) von OnMin Kernel ohne Erfolg starten ... (sm_35, compute_35 wirft Fehler kompilieren ... Ich habe eine GTX670)

Irgendwelche Ideen?

Danke!

+1

Vielleicht könnten Sie es verbessern (ich nehme an, es ist speichergebunden, da es im Grunde keine Mathematik zu tun gibt), indem Sie zuerst Ihre Matrix transponieren. Das Problem besteht darin, dass das Speicherzugriffsmuster überhaupt nicht zusammenfließt (Threads in einem gegebenen Warp lesen aufeinanderfolgende Einträge einer Spalte, die im Speicher überhaupt nicht aufeinanderfolgend sind). Haben Sie auch versucht, das Ergebnis von nvvp zu betrachten? – leo

+1

Mögliches Duplikat von [Matrixzeilen mit CUDA reduzieren] (http://stackoverflow.com/questions/17862078/reduce-matrix-rows-with-cuda) –

Antwort

1

Das Auffinden des Minimums von Array-Zeilen in einer Zeilen-Haupt-Matrix ist eine parallele Reduktionsfrage, die beim Stack-Überlauf viele Male diskutiert wurde. Zum Beispiel, dieses.

Reduce matrix rows with CUDA

Die Grundidee ist n Blöcke in einem Raster zu verwenden. Jeder Block enthält eine feste Anzahl von Threads, normalerweise 256. Jeder Block von Threads führt die parallele Reduktion in einer Zeile der m Elemente durch, um das Minimum gemeinsam zu finden.

Für eine ausreichend große Matrix, in der die GPU vollständig genutzt werden kann, beträgt die obere Grenze der Leistung die Hälfte der Zeit, in der die Matrix einmal kopiert wurde.