这是我的问题:
我的设备上有一个 3D 数组float3
:
int size[3] = {416,464,512};
cudaExtent extent = make_cudaExtent(size[0]*sizeof(float3),size[1],size[2]);
cudaPitchedPtr renderedVolume;
int ret = cudaMalloc3D(&renderedVolume, extent);
size_t pitch = renderedVolume.pitch; //pitch = 5,120
size_t slicePitch = pitch * size[1]; //slicePitch = 2,375,680
然后我使用它,让它充满优秀的数据。
之后,我希望将其复制到主机上的一维线性内存中:
float *host_memory = (float*)malloc(size[0]*size[1]*size[2]*sizeof(float3));
cudaMemcpy3DParms p = {0};
p.srcPtr = renderedVolume;
p.dstPtr = make_cudaPitchedPtr(host_memory,size[0]*sizeof(float3),size[0],size[1]);
p.extent = make_cudaExtent(size[0]*sizeof(float3),size[1],size[2]);
p.srcPos = make_cudaPos(0,0,0);
p.dstPos = make_cudaPos(0,0,0);
p.kind=cudaMemcpyDeviceToHost;
cudaMemcpy3D(&p);
我将 host_memory 中的结果与我最初写入 tu renderedVolume
( my_data
) 的数据以及我在 my 中读取的数据3Dmemory
逐个切片进行比较:
float* test1 = (float*)malloc(size[0]*size[1]*sizeof(float3));
cudaMemcpy(test1, myData, size[0]*size[1]*sizeof(float3) , cudaMemcpyDeviceToHost);
float* test2 = (float*)malloc(size[0]*size[1]*sizeof(float3));
cudaMemcpy(test2,(char*)renderedVolume.ptr + slicePitch * i,size[0]*size[1]*sizeof(float3), cudaMemcpyDeviceToHost);
问题:
- 第一个切片 (
i=0
) 没问题,我在 host_memory 中有相同的数据,test1
并且test2
. - 在第二个切片中,我在
test1
和中有相同的数据test2
。但是,我应该在host_memory+579072
(=float
每个切片的数量,也是heigth*pitch
目标倾斜指针的数量)中找到这些数据,并且我在host_memory+577504
. 它是按1568
字节关闭的,这与我所知道的没有任何关系,这就是为什么如果你们中的任何人知道我的代码中可能存在什么问题,我将非常感激?