我刚开始使用CUDA程序,我对与普通CPU相比的速度感到困惑。然而,我现在以一个简单的逻辑考虑来运行。我在设备代码中,我要检查4D。我创建了一个常量变量,并使用atomicAdd通过设备代码在每次迭代中添加。
//get global counter
int global_index = atomicAdd(&counter, 1);然后考虑一个4D卷,并尝试将线性索引映射到4D卷。我知道对于2D广告3D,有一种从一维索引转换到三维映射的有效方法。然而,我不知道这种方法如何扩展到更高的维度。
int x = gcfg->dimlen.x;
int y = gcfg->dimlen.y / x;
int z = gcfg->dimlen.z / gcfg->dimlen.y;
int photons = numberofphotons[1];这是我四个维度的长度。因此,为了重申我所面临的问题:我有一个索引,我想映射到一个4D数组,它的长度由上面的4个维(x,y,z,数字光子)指定。
发布于 2017-06-05 14:30:44
我不确定我是否理解了问题中变量的含义,但是下面的代码适用于第一维长度(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);
}
}https://stackoverflow.com/questions/44368525
复制相似问题