2011-06-25 54 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內核?有兩個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

,做這樣一來,我就不得不調用內核呀? - >內核<<< Nblock,Nthreads_per_block >>>例如,我可以說內核<<<20,16> >>?有沒有一種更清潔,更有效的方式來調用該內核?對不起,我很新...並感謝Anycorn。 – Manolete

+0

@人見更新。另請注意,並行強度取決於您的具體情況。以上是*只是*示例 – Anycorn

+0

我知道它並不能真正改善,但我的第一個目標是讓它在GPU上正確運行。優化將進入第二階段。我會先嚐試理解你的答案,然後我會盡力提高速度。你知道我在哪裏可以學習所有這些「技巧」嗎?我已經閱讀了幾乎所有的NVIDIA手冊和書籍,但它總是與矩陣有關,而不是循環或算法... – Manolete