2011-07-07 84 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中發佈的代碼非常相似。