CUDA передает c массив GpuMat ядру - PullRequest
0 голосов
/ 18 декабря 2018

Я новичок в CUDA и C, и я мог бы использовать некоторую помощь в следующем: я хочу передать массив C GpuMats в ядро ​​CUDA:

Вот код моего ядра:

__global__
    void disparityFromDiffMapsKernel(cuda::PtrStepSzi* differenceMapsArray,
                                 int arraySize,
                                 cuda::PtrStepSzi disparityMap){
    int x = blockIdx.x * blockDim.x + threadIdx.x;
    int y = blockIdx.y * blockDim.y + threadIdx.y;



    //check if thread is inside the image
    if(x > differenceMapsArray[0].cols || y > differenceMapsArray[0].rows){
        return;
    }

    //do stuff

}

А вот код, где я инициализирую массив и вызываю ядро:

cuda::PtrStepSzi diffMaps[diffMapsSize];
for(int i = 0; i <= offset; i++){
    cuda::GpuMat diffMap(leftImageGPU.size(),CV_32SC1);
    cuda::PtrStepSzi diffMapPtr = diffMap;
    diffMaps[i] = diffMapPtr;
}

disparityFromDiffMapsKernel<<<numBlocks,threadsPerBlock>>>(diffMaps,diffMapsSize,disparityImageGPU); //gpu mat is initialized before

Когда я запускаю этот код, я получаю следующую ошибку opencv:

OpenCV(3.4.1) Error: Gpu API call (an illegal memory access was encountered)

Буду очень признателен за любую помощь!

1 Ответ

0 голосов
/ 18 декабря 2018

Я нашел решение своей проблемы, переместив массив в память GPU через cudaMalloc и cudaMemcpy (спасибо @sgarizvi за подсказку)

Вот окончательный код, на случай, если кто-тоимеет похожую проблему:

// reserve memory for the diffmap ptrs arrays
cuda::PtrStepSzi* cpuDiffMapPtrs;
cpuDiffMapPtrs = (cuda::PtrStepSzi*) malloc(diffMapsSize * sizeof(cuda::PtrStepSzi));

cuda::PtrStepSzi* gpuDiffMapPtrs;
cudaMalloc(&gpuDiffMapPtrs, diffMapsSize * sizeof(cuda::PtrStepSzi));

//fill cpu array with ptrs to gpu mats
for(int i = 0; i< diffMapsSize; i++){
    cuda::GpuMat diffMap(leftImageGPU.size(),CV_32SC1);
    //do stuff with the gpu mats
    cpuDiffMapPtrs[i] = diffMap;
}

//copy cpu array to gpu
cudaMemcpy(gpuDiffMapPtrs,cpuDiffMapPtrs,diffMapsSize * sizeof(cuda::PtrStepSzi), cudaMemcpyHostToDevice);



disparityFromDiffMapsKernel<<<numBlocks,threadsPerBlock>>>(gpuDiffMapPtrs,diffMapsSize,halfKernelSize,disparityImageGPU);

// free the allocated memory
cudaFree(gpuDiffMapPtrs);
free(cpuDiffMapPtrs);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...