2016-08-06 16 views
0

与えられたn行m列の行列では、各行列行の最小値を含むnサイズのベクトルをCUDAで構築したいと考えています。CUDAの配列行の最小値

これまでのところ、私はこれを通じて来ている:私は、より最適化された何かが存在することができることを考えるしかし

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

:で呼び出さ

__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]; 
     } 
    } 
} 

私はループでcublasIsaminを呼び出そうとしましたが、速度が遅いです。

私も

(sm_35は、compute_35はコンパイルエラーを発生させます...私はGTX670を持っている)...成功せずOnMinカーネルからカーネル(グローバル)を起動任意のアイデアを試してみましたか?

ありがとうございます!

+1

あなたの行列を先に入れ替えることで、あなたはそれを改善することができました(基本的には数学がないので、メモリに束縛されているはずです)。問題は、メモリアクセスパターンが合体していないことです(ワープ内のスレッドは連続した列のエントリを読み込み、メモリ内に連続していないことを示します)。また、あなたはnvvpの結果を見てみましたか? – leo

+1

[CUDAで行列の行を減らす]の可能な複製(http://stackoverflow.com/questions/17862078/reduce-matrixrows-with-cuda) –

答えて

1

行優先行列の配列行の最小値を求めることは、スタックオーバーフローで何度も議論された並列削減問題です。例のために、これは1つです。

Reduce matrix rows with CUDA

基本的な考え方は、グリッド内のnブロックを使用することです。各ブロックは固定数のスレッドを含み、典型的には256個のスレッドを含む。各スレッドのブロックは、m要素の行に対して並列削減を行い、協調的に最小値を見つける。

GPUを最大限に活用できる十分なマトリックスの場合、パフォーマンスの上限は、マトリックスを1回コピーする時間の半分です。