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