如何将3D阵列转换为1D阵列?

时间:2014-04-23 13:05:37

标签: c++ c arrays cuda

在我的代码中,我定义了一个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;

        }                   
    }   
}

在每个周期中,都有一个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]

抱歉,我的英语不太清楚,所以如果你不明白我的意思,请添加评论。谢谢。

2 个答案:

答案 0 :(得分:5)

实际上是&#34;经典&#34; 3D阵列在存储器中被组织为一维阵列(因为存储器是面向一维的)。

守则:

int  aiTest[5][5][5] = {0};
int* piTest = (int*)aiTest;

for (int i = 0; i < 125; i++)
{
    piTest[i] = i;
}

不会造成任何内存违规 - 元素aiTest [4] [4] [4]的值为124.

所以答案是:只需将其转换为您需要的正确类型。

答案 1 :(得分:0)

 int arr[5][6][7];
 int resultant_arr[210];
 int count=0;
 for(int i=0;i<5;i++)
 {
  for(int j=0;j<6;j++)
  {
   for(int k=0;k<7;k++)
   {
    if(count<210)
     {
       resultant_arr[count]=arr[i][j][k];
       count++;
     }
    }
   }
  } 
相关问题