3

私の問題はこれです:私は3Dの配列を持っていて、malloc3Dを使用できず、GPUで1D配列を変換して操作する必要があります。しかし、私はそれをどのように行うのかわかりません。この瞬間、私は使用しています

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

matriz配列を定義します。インデックスi、j、kの8列の6行の4つの行列。

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は、u [0] [0][1]ではなく他の行列に表示されます。オフセット内のすべての変数にインデックスを付ける方法がわかりません。この方法で1Dベクトルを実行する必要があることを覚えておいてください。

4

1 に答える 1

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]

なぜあなたのcudaの1つの次元だけではないのですか?

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

}
于 2012-11-15T21:17:36.793 に答える