簡體   English   中英

在 cuda GPU cudamalloc 中將 3D 數組轉換為 1D

[英]convert 3D array to 1D in cuda GPU cudamalloc

我的問題是:我有一個 3D 數組,我不能使用 malloc3D,我需要在 GPU 上轉換和操作一維數組。 但我不知道怎么做。 在這一刻我正在使用

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

定義矩陣數組.. 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 出現在其他矩陣中而不是在 u[0][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]

為什么在你的 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;
     }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM