三维阵列表示CUDA



我有一个3D图像。我需要通过使用指针复制该图像到cuda的全局内存。目前我正在做的事情如下…在下面的实现中,数组是一个线性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[][][];

你打算如何访问数据,一旦它在GPU上?

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

如果你正在做可预测的合并访问,那么你现在拥有的线性内存索引是很好的。

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

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

现在将单指针image3D馈送给CUDA。

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

或者cudaMalloc3D()也将返回一个指向倾斜设备内存的指针

最新更新