【发布时间】:2016-10-09 01:15:23
【问题描述】:
我正在研究生成并行 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 代码:
__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);
A[_cu_x*y*z + _cu_y*z + _cu_z] = 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;
}
}
}
}
有没有类似的方法?值得注意的是:所有循环维度都是并行的,迭代之间没有依赖关系。
提前致谢!
编辑:目标是将所有迭代映射到 CUDA 线程,因为所有迭代都是独立的并且可以同时执行。
【问题讨论】:
-
对于 N 个嵌套循环,您使用 N 个维度。您不必拘泥于 CUDA 提供的 3 个维度,只需计算您自己的索引即可。
-
能否为我的示例提供一个包含四个嵌套循环的解决方案?
-
解决方案很简单,但是这个文本输入字段太小了。
-
也许你写一个答案?还是这太努力了?将不胜感激!
标签: c++ loops parallel-processing cuda