После моего предыдущего поста здесь: 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
Я только угадываю здесь, но я надеюсь, что это поможет вам. Странно от очень поверхностного POV, что вы смешиваете память GPU и переменные памяти RAM. Попробуйте напечатать «Hello World». Если все в порядке, следуйте дальше. Если ваш встроенный код проходит через конвейер GPU (или использует много SIMD), то ваш% s,% d укажет на память GPU вместо RAM-памяти, в то время как fprintf будет использовать kernell (который обращается к RAM-памяти). – MichaelCMS
Вы никогда не выделяли память для 'dev_result' на хосте, что приводит к тому, что cudaMemcpy повреждает стек и разбивает вашу программу. Я голосовал, чтобы закрыть это, я думаю, что разумно ожидать отладки и анализа до того, как приступить к публикации вопроса [SO]. – talonmies
@talonmies Я узнал, что раньше не делал 'malloc dev_result', и поэтому я его выделил. Он по-прежнему бросает мне ту же ошибку. Я пробовал все, и все же он не распечатывает результат. Очевидно, я пытаюсь отлаживать свой ответ перед публикацией; в противном случае вся концепция меня, изучающая АЭС CUDA, будет недействительной. – Eagle