我有一个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[][][];
答案 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纹理。
如果你正在进行可预测的,合并的访问,那么你现在拥有的线性内存索引非常棒。