我的问题是:我有一个三维数组,但是我不能使用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向量。