如何为此编写CUDA全局函数?

时间:2011-02-18 17:49:35

标签: 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。而我正在调用类似

的功能

乐趣&LT;&LT;&LT; 30500&GT;&GT;&GT;()

但我没有得到正确的输出。

我写的代码是否正确?。我对代码的parellel执行情况了解不多。请解释代码如何工作并纠正我如果我犯了任何错误。

1 个答案:

答案 0 :(得分:5)

您使用y维度意味着您正在使用2D数组线程,因此您不能仅使用以下内容调用内核:

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,如果您想进行2D阵列或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
    }
}