我有一个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()也将返回一个指向倾斜设备内存的指针