2011-06-25 15 views
2

CコードをCUDAに移植したいと思います。主な計算部分にはネストされたループのための3が含まれています:CUDAネストループ

for (int i=0; i< Nx;i++){ 
    for (int j=0;j<Ncontains[i];j++){ 
    for (int k=0;k< totalVoxels;k++){ 
      ....... 
    } 
    } 
} 

私はどのように私のCUDAカーネルに変換できますか? 2つのforループを使用すると、次のようなことができます。

int n= blockIdy.y * blockDim.y + threadIdx.y; 
int i= blockIdx.x * blockDim.x + threadIdx.x; 

これはどうやって最初に起動できますか?あなたがそれを行うことができます

答えて

3

多くの方法、そのうちの一つは次のとおりです。

for (int i=blockIdx.x; i< Nx; i += gridDim.x){ 
    for (int j=threadIdx.y; j<Ncontains[i]; j+= blockDim.y){ 
    for (int k=threadIdx.x; k< totalVoxels; k += blockDim.x){ 
      ....... 
    } 
    } 
} 

あなたが呼ぶだろう上:

// nx,ny block dimensions 
kernel <<< dim3(nBlocks), dim3(nx, ny) >>> (...); 
+0

、この方法をやって、私はそのようにカーネルを呼び出す必要がありますか? - > kernel <<< Nblock、Nthreads_per_block >>>たとえば、カーネル<<<20,16> >>と言うことができますか?そのカーネルをよりクリーンかつ効率的に呼び出す方法はありますか?申し訳ありませんが、私はかなり新しいです...そしてAnycornにありがとう。 – Manolete

+0

@Manアップデートを参照してください。パラレル化が強くなることは、あなたの特定のケースに依存することにも注意してください。上記は*ちょっと*例です – Anycorn

+0

私はそれが本当に最初のインスタンスでは改善できないことは知っていますが、私の最初の目標はGPU上で正しく動作させることです。最適化は第2段階で行われます。私は最初にあなたの答えを理解しようとし、私はスピードアップを改善しようとします。私はこれらすべての "トリック"をどこで学ぶことができるか知っていますか?ほとんどすべてのNVIDIAのマニュアルと本を読んだことがありますが、それは常に行列に関連しており、ループやアルゴリズムには関係ありません。 – Manolete