使用CUDA并行化四个或更多嵌套循环 我正在编写一个编译器,生成并行C++代码。我对CUDA编程很陌生,但我正在尝试C++代码与CUDA的并行化。 当前,如果我有以下顺序C++代码: for(int i = 0; i < a; i++) { for(int j = 0; j < b; j++) { for(int k = 0; k < c; k++) { A[i*y*z + j*z + k*z +l] = 1; } } }

使用CUDA并行化四个或更多嵌套循环 我正在编写一个编译器,生成并行C++代码。我对CUDA编程很陌生,但我正在尝试C++代码与CUDA的并行化。 当前,如果我有以下顺序C++代码: for(int i = 0; i < a; i++) { for(int j = 0; j < b; j++) { for(int k = 0; k < c; k++) { A[i*y*z + j*z + k*z +l] = 1; } } },c++,loops,parallel-processing,cuda,C++,Loops,Parallel Processing,Cuda,因此,每个循环嵌套映射到一个维度,但并行四个或更多嵌套循环的正确方法是什么: for(int i = 0; i < a; i++) { for(int j = 0; j < b; j++) { for(int k = 0; k < c; k++) { for(int l = 0; l < d; l++) { A[i*x*y*z + j*y*z + k*z +l] = 1;

因此,每个循环嵌套映射到一个维度,但并行四个或更多嵌套循环的正确方法是什么:

for(int i = 0; i < a; i++) {
    for(int j = 0; j < b; j++) {
        for(int k = 0; k < c; k++) {
            for(int l = 0; l < d; l++) {
                A[i*x*y*z + j*y*z + k*z +l] = 1;
            }
        }
    }
}
for(int i=0;i
有没有类似的方法?值得注意的是:所有循环维度都是并行的,迭代之间没有依赖关系

提前谢谢


编辑:目标是将所有迭代映射到CUDA线程,因为所有迭代都是独立的,可以并发执行。

您可以保持外部循环不变。另外,最好使用
.x
作为最内部的循环,这样您就可以


但是要小心,计算i,j,k,l可能会带来很多开销,因为整数除法和mod在GPU上速度很慢。或者,您可以将
i、j
映射到
.z
.y
,并以类似方式从
.x
中仅计算
k、l
和更多维度。

对于N个嵌套循环,使用N个维度。你不必坚持CUDA提供的3维,只需计算你自己的索引。你能为我的示例提供一个包含四个嵌套循环的解决方案吗?这个解决方案很简单,但是这个文本输入字段太小了。也许你可以写一个答案?还是这太费劲了?非常感谢!谢谢你的回答,但我不想在我的内核中有任何循环,因为所有迭代都是独立的,可以并发执行。@siebenschlaefer有足够大的blockDim和gridDim,你可能已经有足够的并行性了。保持循环是可以的。这是事实,但我测试的所有源程序都不是这样。事实上,在某些情况下保持循环可能会增加每个线程的工作量,这可以提高性能,而不是只给每个线程少量的工作量。实际上,通过增加每个线程的工作量而不是增加更多线程的工作量,您可以公开更多可用的并行性。如果所有循环迭代都是独立的,那么您可以展平或“折叠”循环。这一概念并非cuda独有;它可以在普通的C/C++代码中完成。如果希望每个线程执行一次循环迭代,那么在宿主代码中折叠循环,并为内核执行到网格的转换。
for(int i = 0; i < a; i++) {
    for(int j = 0; j < b; j++) {
        for(int k = 0; k < c; k++) {
            for(int l = 0; l < d; l++) {
                A[i*x*y*z + j*y*z + k*z +l] = 1;
            }
        }
    }
}
__global__ void kernelExample() {
    int _cu_x = ((blockIdx.x*blockDim.x)+threadIdx.x);
    int _cu_y = ((blockIdx.y*blockDim.y)+threadIdx.y);
    int _cu_z = ((blockIdx.z*blockDim.z)+threadIdx.z);
    for(int i = 0; i < a; i++) {
        A[i*x*y*z + _cu_z*y*z + _cu_y*z + _cu_x] = 1;
    }
}
__global__ void kernelExample() {
    int tid = ((blockIdx.x*blockDim.x)+threadIdx.x);
    int i = tid / (b*c*d);
    int j = tid / (c*d) % b;
    int k = tid / d % c;
    int l = tid % d;

    A[i*x*y*z + j*y*z + k*z + l] = 1;
}