我想了解如何将基本 C/C++ 循环转换为 CUDA 内核。简单来说:
for (int i=0;i < MAXi;i++)
for(int j=0;j< MAXj;j++){
...code that uses i and j....
}
每个 i 都需要计算 MAXj 个元素。 对于某些人来说这可能是非常基本的,但我在这里真的很挣扎。 假设Maxj约为100万,MAXj=1000000;我们希望所有线程都能工作。 我仅使用内部循环就取得了成功:
int tid=threadIdx.x + blockDim.x*blockIdx.x + blockDim.x*gridDim.x*blockIdx.y;
使用 2d block ,如何并行化这种循环?它们在 C 语言中非常常见,学习如何做到这一点将非常有用。
最佳答案
划分此类 2D 循环的最佳方法是使用 1D block 和网格
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....
}
内循环分为线程,外循环分为 block (2D block )
如果 MAXj 和 MAXi 是非常大的值,那么您需要将其分成小组并进行计算。该代码与此 thread 中发布的代码非常相似.
关于loops - 将 C/C++ for 循环转换为 CUDA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6613106/