Kopieren vom cuda 3D-Speicher in den linearen Speicher: Die kopierten Daten entsprechen nicht den Erwartungen

Hier ist mein Problem:

Ich habe eine 3D-Anordnung vonfloat3 auf meinem Gerät:

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

Dann arbeite ich damit und mache es voller herausragender Daten.

Danach möchte ich es auf einen 1D linearen Speicher auf meinem Host kopieren:

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

Ich vergleiche das Ergebnis in host_memory mit den Daten, die ich ursprünglich für tu geschrieben haberenderedVolume (my_data) und mit den Daten, die ich in meinem3DmemoryScheibe für Scheibe:

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:

Die erste Scheibe (i=0) ist in Ordnung, ich habe die gleichen Daten in host_memory,test1 undtest2.In der zweiten Scheibe habe ich die gleichen Daten intest1 undtest2. Ich sollte diese Daten jedoch in findenhost_memory+579072 (= Anzahl vonfloat auch pro scheibeheigth*pitch und ich finde es inhost_memory+577504. Es ist vorbei1568 Bytes, was nichts entspricht, was mir bekannt ist, und aus diesem Grund wäre ich sehr dankbar, wenn jemand von Ihnen eine Vorstellung davon hätte, woran das Problem in meinem Code liegen könnte?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage