Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 使用线性索引映射到4D阵列_Arrays_Cuda - Fatal编程技术网

Arrays 使用线性索引映射到4D阵列

Arrays 使用线性索引映射到4D阵列,arrays,cuda,Arrays,Cuda,我刚刚开始使用CUDA编程,与普通CPU相比,我对速度感到困惑。然而,我现在开始在一个简单的逻辑考虑运行。我在设备代码中,我有4D要检查。我创建了一个常量变量,并使用atomicAdd在设备代码的每次迭代中进行添加 //get global counter int global_index = atomicAdd(&counter, 1); 然后我考虑一个4D音量,我试图把线性索引映射到4D音量。我知道,对于2D和3D,有一种有效的方法可以将一维索引转换为3D映射。然而,我不知道这种方

我刚刚开始使用CUDA编程,与普通CPU相比,我对速度感到困惑。然而,我现在开始在一个简单的逻辑考虑运行。我在设备代码中,我有4D要检查。我创建了一个常量变量,并使用atomicAdd在设备代码的每次迭代中进行添加

//get global counter
int global_index = atomicAdd(&counter, 1);

然后我考虑一个4D音量,我试图把线性索引映射到4D音量。我知道,对于2D和3D,有一种有效的方法可以将一维索引转换为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)指定==第二维度长度(
y
)==第三维度长度(
z
)==
4
。它将线性索引
i
转换为每个维度的索引:
第一个索引
第二个索引
第三个索引
第四个索引

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);
    }
}
intmain()
{
int x=4;
int y=4;
int z=4;
对于(int i=0;i<100;i++){
int第四指数=i/(x*y*z);
int第三指数=i%(x*y*z)/(x*y);
第二指数=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,第一个索引,第二个索引,第三个索引,第四个索引);
}
}
或者你可以走另一条路

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);
    }
}
intmain()
{
int x=4;
int y=4;
int z=4;
对于(int i=0;i<100;i++){
int first_index=i%x;
int第二个指数=i/x%y;
int第三个指数=i/x/y%z;
int第四指数=i/x/y/z;
printf(“%d:(%d,%d,%d,%d)\n”,i,第一个索引,第二个索引,第三个索引,第四个索引);
}
}

这正是我想要的!