АЭС CUDA — неизвестная ошибка при проверке ошибок графического процессора

Я пытаюсь суммировать все пиксели в изображении и получить среднее значение всех пикселей с использованием библиотеки CUDA NPP. Мое изображение 8-bit unsigned char grayscale изображение измерения w256 x h1024, Я пытался следовать всем необходимым правилам объявления указателей и передачи соответствующих указателей типа АЭС функциям АЭС.

Тем не менее, я получаю unknown error когда я выполняю проверку ошибок графического процессора в моем коде. Я пытался отладить его, но я не могу понять, где я иду не так, и мне нужна помощь, пожалуйста?

Я использую OpenCV в дополнение к этому для выполнения своей обработки, и, следовательно, будет присутствовать некоторый код OpenCV.

РЕДАКТИРОВАТЬ: Код был обновлен

#define gpuErrchk(ans) { gpuAssert((ans), __FILE__, __LINE__); }
inline void gpuAssert(cudaError_t code, char *file, int line, bool abort=true)
{
if (code != cudaSuccess)
{
fprintf(stderr,"GPUassert: %s %s %d\n", cudaGetErrorString(code), file, line);
if (abort) getchar();
}
}

// process image here

// device_pointer initializations
unsigned char *device_input;
unsigned char *device_output;

size_t d_ipimgSize = input.step * input.rows;
size_t d_opimgSize = output.step * output.rows;

gpuErrchk( cudaMalloc( (void**) &device_input, d_ipimgSize) );
gpuErrchk( cudaMalloc( (void**) &device_output, d_opimgSize) );

gpuErrchk( cudaMemcpy(device_input, input.data, d_ipimgSize, cudaMemcpyHostToDevice) );

// Median filter the input image here
// .......

// start summing all pixels
Npp64s *partialSum = 0;
partialSum = (Npp64s *) malloc(sizeof(Npp64s));

int bytes = input.cols*input.rows;

Npp8u *scratch = nppsMalloc_8u(bytes);

int ostep = input.step;
NppiSize imSize;
imSize.width = input.cols;
imSize.height = input.rows;

// copy processed image data into a source_pointer
unsigned char *odata;
odata = (unsigned char*) malloc( sizeof(unsigned char) * input.rows * input.cols);
memcpy(odata, output.data, sizeof(unsigned char) * input.rows * input.cols);

// compute the sum over all the pixels
nppiSum_8u64s_C1R( odata, ostep, imSize, scratch, partialSum );

// print sum
printf( "\n Total Sum cuda %d \n",  *partialSum) ;

gpuErrchk(cudaFree(device_input));   // <--- Unknown error here
gpuErrchk(cudaFree(device_output));

1

Решение

partialSum аргумент в nppiSum_8u64s_C1R должно быть выделено устройство памяти.

Далее вы размещаете рабочий буфер размера вашего изображения. Там есть функция под названием nppiSumGetBufferHostSize_8u64s_C1R это дает вам точный размер для буфера очистки, который может быть больше, чем само изображение (не очень вероятно для простого суммирования, но возможно).

И всегда проверяйте возвращаемые значения в АЭС, как и для Cuda. nppiSum_8u64s_C1R вероятно не вернется NPP_NO_ERROR в твоем случае.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]