使用线性索引映射到4D数组

时间:2017-06-05 12:02:42

标签: arrays cuda

我刚开始使用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)指定

1 个答案:

答案 0 :(得分:1)

我不确定我是否已理解您问题中变量的含义,但以下代码适用于第一个维度长度(x)==第二个维度长度(y )==第三维长度(z)== 4。它将线性索引i转换为每个维度的索引:first_indexsecond_indexthird_indexfourth_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);
    }
}