Kopiowanie z pamięci cuda 3D do pamięci liniowej: skopiowane dane nie są tam, gdzie się spodziewałem

Oto mój problem:

Mam tablicę 3Dfloat3 na moim urządzeniu:

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

Następnie pracuję z nim i wypełniam go wybitnymi danymi.

Następnie chcę skopiować go do pamięci liniowej 1D na moim hoście:

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);

Porównuję wynik w host_memory z danymi, które początkowo napisałem turenderedVolume (my_data) oraz z danymi, które czytam w moim3Dmemory, plasterek po kawałku:

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);

Problem:

Pierwszy kawałek (i=0) jest w porządku, mam te same dane w host_memory,test1 itest2.W drugim plasterku mam te same danetest1 itest2. Powinienem jednak znaleźć te danehost_memory+579072 (= liczbafloat na kromkęheigth*pitch docelowego wskaźnika pitched) i znajduję gohost_memory+577504. Jest wyłączony przez1568 bajtów, co nie odpowiada niczemu, o czym jestem świadomy, i dlatego byłbym bardzo wdzięczny, jeśli któryś z was ma pojęcie o tym, jaki może być problem w moim kodzie?

questionAnswers(1)

yourAnswerToTheQuestion