2011-07-07 18 views
2

基本的なC/C++ループをCUDAカーネルに変換する方法を理解したいと思います。C/C++ forループをCUDAに変換する

for (int i=0;i < MAXi;i++) 
    for(int j=0;j< MAXj;j++){ 

     ...code that uses i and j.... 
    } 

私はすべての要素をMAXjで計算する必要があります。 これは非常に基本的なものかもしれませんが、私は本当にここで苦労しています。Maxjが約100万であるとします.MAXj = 1000000です。すべてのスレッドが動作する場所があります。 私は、内側のループで成功している:

int tid=threadIdx.x + blockDim.x*blockIdx.x + blockDim.x*gridDim.x*blockIdx.y; 

は、どのように私は、ループのこの種を並列化することができ、2Dブロックを使用していますか? C言語では非常に一般的ですが、それを行う方法を学ぶことは非常に便利です。

+0

答えは「... iとj ...を使用するコード」に完全に依存します。質問にさらなる詳細を追加し、有用な答えを得ることが可能かもしれません。あなたは、[このスレッド]を見つける価値がある(http://stackoverflow.com/questions/5643178/cuda-how-to-get-grid-block-thread-size-and-parallalize-non-square-matrix-calcul)あまりにも。 – talonmies

答えて

2

2Dはループのこれらの種類を分割する一つの最良の方法は、一次元ブロックとグリッド

dim3 blocks(MAXj, 1); 
dim3 grids(MAXi, 1); 

kernel<<<grids, blocks, 1>>>() 

__global__ kernel() 
{ 
    int i = blockIdx.x; 
    int j = threadIdx.x; 

    ...code that uses i and j.... 

} 

ブロックに内側ループスレッドに分割され、外側のループが分割される(2Dブロック)

を使用することによるものです

MAXjとMAXiが非常に大きな値である場合、それを小グループに分けて計算する必要があります。コードはこのthreadに投稿されたコードと非常に似ています。

関連する問題