Копирование из трехмерной памяти cuda в линейную память: скопированные данные оказались не там, где я ожидал

Вот моя проблема:

У меня есть 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

Затем я работаю с ним и делаю его полным выдающихся данных.

После этого я хочу скопировать его в 1D линейную память на моем хосте:

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 с данными, которые я изначально написалrenderedVolume (my_data) и с данными, которые я прочитал в моем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 байтов, что не соответствует ни одному из моих знакомых, и поэтому я был бы очень признателен, если бы кто-нибудь из вас имел представление о том, в чем проблема может быть в моем коде?

Ответы на вопрос(1)

Ваш ответ на вопрос