2011-02-18 73 views
1

我想將以下函數轉換爲CUDA。如何爲此編寫CUDA全局函數?

void fun() 
{ 
    for(i = 0; i < terrainGridLength; i++) 
    { 
     for(j = 0; j < terrainGridWidth; j++) 
     { 
      //CODE of function 
     } 
    } 
} 

我寫的函數是這樣的:

__global__ void fun() 
{ 
    int i = blockIdx.x * blockDim.x + threadIdx.x; 
    int j = blockIdx.y * blockDim.y + threadIdx.y; 

    if((i < terrainGridLength)&&(j<terrainGridWidth)) 
    { 
      //CODE of function 
    } 
} 

我宣佈雙方terrainGridLength和terrainGridWidth爲常數和分配值120到兩個。和我打電話的功能就像

樂趣< < < 30,500 >>>()

,但我沒有得到正確的輸出。

我寫的代碼是否正確?我對代碼的執行沒有太多的瞭解。請解釋一下代碼是如何工作的,如果我犯了什麼錯誤,我會糾正錯誤。

回答

4

您使用y維度,這意味着你使用的二維數組中的線程,所以你不能只調用內核:

int numBlock = 30; 
int numThreadsPerBlock = 500; 
fun<<<numBlock,numThreadsPerBlock>>>() 

調用應該是:(請注意,現在阻止有2D線程)

dim3 dimGrid(GRID_SIZE, GRID_SIZE); // 2D Grids with size = GRID_SIZE*GRID_SIZE 
dim3 dimBlocks(BLOCK_SIZE, BLOCK_SIZE); //2D Blocks with size = BLOCK_SIZE*BLOCK_SIZE 
fun<<<dimGrid, dimBlocks>>>() 

參考CUDA Programming Guide進一步的信息,並且如果你想要做二維數組或3D,你最好使用cudaMalloc3D或使用cudaMallocPitch

由於您代碼,我認爲這會工作(但我沒有嘗試,但希望你可以抓住這個想法):

//main 
dim3 dimGrid(1, 1); // 2D Grids with size = 1 
dim3 dimBlocks(Width, Height); //2D Blocks with size = Height*Width 
fun<<<dimGrid, dimBlocks>>>(Width, Height) 

//kernel 
__global__ void fun(int Width, int Height) 
{ 
    int i = blockIdx.x * blockDim.x + threadIdx.x; 
    int j = blockIdx.y * blockDim.y + threadIdx.y; 

    if((i < Width)&&(j<Height)) 
    { 
      //CODE of function 
    } 
}