Я хочу скопировать часть 3D-памяти с устройства на хост.Тем не менее, я сталкиваюсь с проблемами с использованием cudamemcpy для этого.По сути, я выделяю большой блок памяти на устройстве (белый) и копирую только синий квадрат в центр его.
Размеры белого квадрата в следующем коде: xDim, yDim, zDim,Я копирую на устройство один размер синего квадрата, а я с устройства другой размер синего квадрата.К устройству относятся: numXRes, numYres, zDim.С устройства есть: outputImageX, outputImageY.
Мой код cudaMalloc3D:
// Cuda Malloc 3D Array
cudaExtent extent = make_cudaExtent(xDim * sizeof(cufftComplex), yDim, zDim);
cudaPitchedPtr devPitchedPtr;
cudaMalloc3D(&devPitchedPtr, extent);
//Pitched pointer for 3D malloc
cufftComplex* devPtr = (cufftComplex*) devPitchedPtr.ptr;
size_t pitch = devPitchedPtr.pitch;
size_t slicePitch = pitch * yDim;
По существу пытается заменить kspacedevice и xdimс devPtr и pitch из моей предыдущей реализации, где я использовал одномерные массивы.Однако он выдает ошибку и не может правильно копировать.
Моя предыдущая реализация с массивом 1D:
// Cuda Malloc 1D Array
cufftComplex* kspaceDevice;
err = cudaMalloc((void**)&kspaceDevice, xDim*yDim*zDim * sizeof(cufftComplex));
if (err != cudaSuccess){
fprintf(stderr, "Cuda error: Failed to cuda malloc 1\n");
exit(EXIT_FAILURE);
}
// filling with zero - line by line
err = cudaMemset(kspaceDevice, 0, xDim*yDim*zDim* sizeof(cufftComplex));
if (err != cudaSuccess){
fprintf(stderr, "Cuda error: Failed to Mem Set \n");
exit(EXIT_FAILURE);
}
//memcopy - 1D
int incre = (xDim- numXRes);
int side_1 = (xDim- numXRes) / 2;
int side_2 = (yDim - numYRes) / 2;
for (int currentChannel = 0; currentChannel < numChannels; currentChannel++)
{
for (int y = 0; y < numYRes; y++)
{
subArrayHostToDevice = temp(Range::all(), y, currentChannel);
err = cudaMemcpy(kspaceDevice + (side_2*xDim + side_1) + y * xDim+ currentChannel* yDim*xDim, &subArrayHostToDevice(0), numXRes * sizeof(cufftComplex), cudaMemcpyHostToDevice);
if (err != cudaSuccess){
fprintf(stderr, "Cuda error: Failed to cuda memcpy 2\n");
exit(EXIT_FAILURE);
}
}
}
// DO SOME CALCULATIONS ON DEVICE
for (int currentChannel = 0; currentChannel < numChannels; currentChannel++)
{
err = cudaMemcpy(reinterpret_cast<cufftComplex*>(&outputImageSpace(0,0,currentChannel)), kspaceDevice + (yDim-xDim)/2 * xDim + currentChannel*yDim*xDim, outputImageX * outputImageY * sizeof(cufftComplex), cudaMemcpyDeviceToHost);
if (err != cudaSuccess){
fprintf(stderr, "Cuda error: Failed to mem cpy 3\n");
exit(EXIT_FAILURE);
}
}