2014-03-21 3 views
-1

После моего предыдущего поста здесь: CUDA NPP - unknown error upon GPU error checkCUDA АЭС - ошибка на выходе печати

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

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

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

Код:

#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 
+0

Я только угадываю здесь, но я надеюсь, что это поможет вам. Странно от очень поверхностного POV, что вы смешиваете память GPU и переменные памяти RAM. Попробуйте напечатать «Hello World». Если все в порядке, следуйте дальше. Если ваш встроенный код проходит через конвейер GPU (или использует много SIMD), то ваш% s,% d укажет на память GPU вместо RAM-памяти, в то время как fprintf будет использовать kernell (который обращается к RAM-памяти). – MichaelCMS

+0

Вы никогда не выделяли память для 'dev_result' на хосте, что приводит к тому, что cudaMemcpy повреждает стек и разбивает вашу программу. Я голосовал, чтобы закрыть это, я думаю, что разумно ожидать отладки и анализа до того, как приступить к публикации вопроса [SO]. – talonmies

+0

@talonmies Я узнал, что раньше не делал 'malloc dev_result', и поэтому я его выделил. Он по-прежнему бросает мне ту же ошибку. Я пробовал все, и все же он не распечатывает результат. Очевидно, я пытаюсь отлаживать свой ответ перед публикацией; в противном случае вся концепция меня, изучающая АЭС CUDA, будет недействительной. – Eagle

ответ

1

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

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

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); 

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

+0

Спасибо за проголосовать. Я заслуживаю его за доступ к значениям мусора путем разыменования 'dev_result', когда никакие значения не были записаны ему процессом' cudaMemcpy'. Для этого я заслуживаю рэп на голову; дурак я. : | – Eagle