在我的代码中,我定义了一个3D数组来在CUDA内核上存储日期.代码如下:
if(k<2642){
double iCycle[100], jCycle[100];
int iCycleNum = 0, jCycleNum = 0;
for(double i=0; i<=1; i+=a, ++iCycleNum){
iCycle[iCycleNum] = i;
for(double j=0; j+i<=1; j+=c, ++jCycleNum){
jCycle[jCycleNum] = j;
[...]
r=(int)color[indexOutput];
g=(int)color[indexOutput+1];
b=(int)color[indexOutput+2];
d_RGB[k][iCycleNum][jCycleNum].x=r;//int3 (*d_RGB)[100][100]
d_RGB[k][iCycleNum][jCycleNum].y=g;
d_RGB[k][iCycleNum][jCycleNum].z=b;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在每个循环中,都有一个r,g,b.我想存储r,g,b d_RGB[k][iCycleNum][jCycleNum],然后我需要将它们传递给主机.但是在这种情况下,每个k都有一个不同的iCycleNum和jCycleNum,我不知道它们的值,所以这里的3D数据是如此的空间,可能会带来一些bug.我想知道这是否是一种将3D阵列改为1D的方法:d_RGB[k+iCycleNum*x+jCycleNum*x*y].
对不起,我的英文不太清楚,所以如果你不明白我的意思,请添加评论.谢谢.
小智 5
实际上,"经典"3D阵列在存储器中被组织为一维阵列(因为存储器是面向一维的).
代码:
int aiTest[5][5][5] = {0};
int* piTest = (int*)aiTest;
for (int i = 0; i < 125; i++)
{
piTest[i] = i;
}
Run Code Online (Sandbox Code Playgroud)
没有任何内存违规 - 元素aiTest [4] [4] [4]的值为124.
所以答案是:只需将其转换为您需要的正确类型.