将3D数组转换为1D在CUDA GPU CudaMalloc中

3

我的问题是:我有一个三维数组,但是我不能使用malloc3D,并且我需要在GPU上转换和操作1D数组。但我不知道该如何做。目前我正在使用:

#define nx  8
#define ny  6
#define nz  4

定义一个矩阵数组,包括4个矩阵,每个矩阵有6行8列,索引为i、j、k。

u[i][j][k]

and I declaration of:

cudaMalloc( (void**)&dev_u, ny * nx * nz * sizeof(float) ) ;
cudaMemcpy( dev_u, u, ny * nx * nz * sizeof(float), cudaMemcpyHostToDevice );
dim3 dimBlock(nx,ny,nz);
dim3 dimGrid(1,1);
FTCS3D<<<dimGrid, dimBlock>>>( dev_u );
cudaMemcpy( u, dev_u, ny * nx * nz * sizeof(float), cudaMemcpyDeviceToHost );

GPU内部:

__global__ void FTCS3D( float *u )
{
    int i = threadIdx.y+blockDim.y*blockIdx.y;
    int j = threadIdx.x+blockDim.x*blockIdx.x;
    int k = threadIdx.z+blockDim.z*blockIdx.z;
    int offset = i * nx + j + ny * nx * z;
    int totid=nx*ny*nz;

    if (offset < totid)
    {
        if ( offset ==1 )
           u[offset]=5.0;
   }
}

数字5出现在其他矩阵中,而不是u [0] [0] [1]中,我不知道如何索引偏移量内的所有变量,请记住我必须按照这种方式进行1D向量。


这个问题能帮到你吗? https://dev59.com/EEbRa4cB1Zd3GeqP5f2N - LtWorf
1个回答

1
如果您有一个三维数组 [HEIGHT][WIDTH] [DEPTH],那么您可以将其转换为一维数组 [HEIGHT * WIDTH * DEPTH]。
在内核外部,您可以将三维数组转换为一维数组。
for (int x = 0, k=0; x < HEIGHT; x++)
  for (int y = 0; y < WIDTH; y++)
     for (int z = 0; z < DEPTH; z++)
        a1D[k++] = a3D[x][y][z]

为什么你的CUDA只有一个维度?
__global__ void FTCS3D( float *u,int HEIGHT, int WIDTH, int DEPTH)
{   
    int x = threadIdx.x+blockDim.x*blockIdx.x;
    int totid = HEIGHT * WIDTH * DEPTH;

    if (x < totid)
    {
       if (x==1 )
          u[x]=5.0;
     }

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接