我刚开始使用CUDA编程,与普通CPU相比,我感到很困惑。但是,我现在正在以简单的逻辑考虑运行。我在设备代码中,我有4D检查。我创建了一个常量变量,我使用atomicAdd通过设备代码在每次迭代中添加。
//get global counter
int global_index = atomicAdd(&counter, 1);
然后我考虑4D音量,并尝试将线性索引映射到4D音量。我知道对于2D广告3D,有一种从1D索引转换为3D映射的有效方法。但是,我不知道这种方法如何扩展到更高的维度。
int x = gcfg->dimlen.x;
int y = gcfg->dimlen.y / x;
int z = gcfg->dimlen.z / gcfg->dimlen.y;
int photons = numberofphotons[1];
这是我的4个尺寸长度。所以,重申我遇到的问题:我有一个索引,我想映射到4D数组,长度由上述4个维度(x,y,z,numberofphotons)指定
答案 0 :(得分:1)
我不确定我是否已理解您问题中变量的含义,但以下代码适用于第一个维度长度(x
)==第二个维度长度(y
)==第三维长度(z
)== 4
。它将线性索引i
转换为每个维度的索引:first_index
,second_index
,third_index
,fourth_index
。
int main()
{
int x = 4;
int y = 4;
int z = 4;
for (int i = 0; i < 100; i++) {
int fourth_index = i / (x * y * z);
int third_index = i % (x * y * z) / (x * y);
int second_index = i % (x * y * z) % (x * y) / x;
int first_index = i % (x * y * z) % (x * y) % x;
printf("%d: (%d, %d, %d, %d)\n", i, first_index, second_index, third_index, fourth_index);
}
}
或者你可以反过来。
int main()
{
int x = 4;
int y = 4;
int z = 4;
for (int i = 0; i < 100; i++) {
int first_index = i % x;
int second_index = i / x % y;
int third_index = i / x / y % z;
int fourth_index = i / x / y / z;
printf("%d: (%d, %d, %d, %d)\n", i, first_index, second_index, third_index, fourth_index);
}
}