3D数组表示CUDA

时间:2011-09-06 16:01:42

标签: cuda

我有一个3D图像。我需要通过使用指针将该图像复制到cuda的GLOBAL MEMORY。 目前我正在做如下..在下面的实现中,数组是线性1D数组。

   float *image = new float[noOfVoxels];
   readImage(image) //one D linear array
   int sizef = noOfVoxels*sizeof(float);
   float *devI;
   cudaMalloc((void**)&devI, sizef);
   cudaMemcpy(devI, image,sizef, cudaMemcpyHostToDevice);

如何在设备内存中分配3D数组?

    3D array
    float image[][][];

3 个答案:

答案 0 :(得分:1)

最好使用cudaMallocPitch()。它仍然将内存分配为单个块,即1d,您必须通过在3d子目录和1d索引之间进行转换来访问它,但好处是它以优化数据类型对齐的方式分配内存。

或者cudaMalloc3D()也会返回指向设备内存的指针

答案 1 :(得分:1)

请注意,PC的内存不是3D内存。这只是可视化问题,因此您可以将3D图像转换为单个指针。那么为什么不将表单中的3D图像保存在主机端的单个指针上呢。

accessing image3D[i][j][z] is same as image3D[ i*cols+j + rows*cols*z];

现在将单指针image3D送到CUDA。

答案 2 :(得分:1)

您计划如何在GPU上访问数据?

如果您正在进行大量随机访问并且会受益于空间局部性,那么您应该使用cudaMalloc3D并将其绑定到3D纹理。

如果你正在进行可预测的,合并的访问,那么你现在拥有的线性内存索引非常棒。