在cuda GPU cudamalloc中将3D数组转换为1D

时间:2012-11-15 19:21:36

标签: c cuda gpu

我的问题是:我有一个3D数组和我不能使用malloc3D,我需要在GPU上转换和操作1D数组。但我不知道怎么做。在这一刻我正在使用

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

定义matriz数组.4个矩阵,6行,8列,索引为i,j,k。

u[i][j][k]

我声明:

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出现在其他matriz中,而不是u [0] [0] [1],我不知道如何索引偏移量内的所有变量记住我必须以这种方式进行1D向量

1 个答案:

答案 0 :(得分:1)

如果你有一个array3D [HEIGHT] [WIDTH] [DEPTH]那么你可以把它变成array1D [HEIGHT * WIDTH * DEPTH]。

将你的内核转换为3D转换为1D阵列

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]

为什么不只是你的一个方面?

__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;
     }

}