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!
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
Mögliches Duplikat von [Matrixzeilen mit CUDA reduzieren] (http://stackoverflow.com/questions/17862078/reduce-matrix-rows-with-cuda) –