CUDA-cudaMalloc3D копировать часть памяти 3D - PullRequest
0 голосов
/ 15 мая 2018

Я хочу скопировать часть 3D-памяти с устройства на хост.Тем не менее, я сталкиваюсь с проблемами с использованием cudamemcpy для этого.По сути, я выделяю большой блок памяти на устройстве (белый) и копирую только синий квадрат в центр его.

Размеры белого квадрата в следующем коде: xDim, yDim, zDim,Я копирую на устройство один размер синего квадрата, а я с устройства другой размер синего квадрата.К устройству относятся: numXRes, numYres, zDim.С устройства есть: outputImageX, outputImageY.

enter image description here

Мой код 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); 
            }
        }
...