将C / C ++ for循环转换为CUDA

时间:2011-07-07 15:30:09

标签: loops cuda

我想了解如何将基本的C / C ++循环转换为CUDA内核。让我们简单一点:

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

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

每一个我都需要计算MAXj元素。 对某些人来说这可能是非常基本的,但我真的在这里苦苦挣扎。 假设Maxj大约是一百万,MAXj = 1000000;并且我们希望所有线程都能工作。 我只使用内循环取得了成功:

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

使用2d块,如何并行化这种循环?它们在C中很常见,学习如何操作非常有用。

1 个答案:

答案 0 :(得分:3)

划分这些2D循环的一种最佳方法是使用1D块和网格

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中发布的代码非常相似。