我想了解如何将基本的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中很常见,学习如何操作非常有用。
答案 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中发布的代码非常相似。