АЭС CUDA — Ошибка при выводе на печать

После моего предыдущего поста здесь: АЭС CUDA — неизвестная ошибка при проверке ошибок графического процессора

Я попытался суммировать все пиксели в изображении с помощью библиотеки CUDA NPP, и с помощью некоторых разработчиков я наконец получил свой код для компиляции. Тем не менее, когда я пытаюсь распечатать значение, которое хранится в partialSum скопировав его в double переменная (в соответствии с руководством по NPP для CUDA v4.2), я получаю эту ошибку:

Unhandled exception at 0x00fdf7f4 in MedianFilter.exe: 0xC0000005: Access violation reading location 0x40000000.

Я пытался избавиться от этого, но до сих пор мне не удавалось. Пожалуйста помоги! У меня есть этот небольшой кусок кода около двух дней.

Код:

#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();
}
}

// processing image starts 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
// .......// allocate data on the host for comparing the sum of all pixels in image with CUDA implementation

// 1st argument - allocate data for pSrc - copy device_output into this pointer
Npp8u *odata;
gpuErrchk( cudaMalloc( (void**) &odata, sizeof(Npp8u)*output.rows*output.cols ) );
gpuErrchk( cudaMemcpy(odata, device_output, sizeof(Npp8u)*output.rows*output.cols, cudaMemcpyDeviceToDevice) );

// 2nd arg - set step
int ostep = output.step;

// 3rd arg - set nppiSize
NppiSize imSize;
imSize.width = output.cols;
imSize.height = output.rows;

// 4th arg - set npp8u scratch buffer size
Npp8u *scratch;
int bytes = 0;
nppiReductionGetBufferHostSize_8u_C1R( imSize, &bytes);

gpuErrchk( cudaMalloc((void **)&scratch, bytes) );

// 5th arg - set npp64f partialSum (64 bit double will be the result)
Npp64f *partialSum;
gpuErrchk( cudaMalloc( (void**) &partialSum, sizeof(Npp64f) ) );

//                 nnp8u, int, nppisize, npp8u, npp64f
nppiSum_8u_C1R( odata, ostep, imSize, scratch, partialSum );

double *dev_result;
dev_result = (double*)malloc(sizeof(double)); // EDIT
gpuErrchk( cudaMemcpy(&dev_result, partialSum, sizeof(double), cudaMemcpyDeviceToHost) );
//int tot = output.rows * output.cols;
printf( "\n Total Sum cuda %f \n",  *dev_result) ;   // <---- access violation here

-1

Решение

Проблема здесь, кажется, заключается в неправильном использовании указателей (я говорю, кажется, потому что у нас есть неполный, некомпилируемый код, поэтому трудно сказать наверняка).

Это должно работать:

double *dev_result = (double*)malloc(sizeof(double));
gpuErrchk( cudaMemcpy(dev_result, partialSum, sizeof(double), cudaMemcpyDeviceToHost) );
printf( "\n Total Sum cuda %f \n",  *dev_result);

это также должно работать:

double dev_result;
gpuErrchk( cudaMemcpy(&dev_result, partialSum, sizeof(double), cudaMemcpyDeviceToHost) );
printf( "\n Total Sum cuda %f \n",  dev_result);

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

1

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

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

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