CUDA NPP -打印输出错误
CUDA NPP - Error on printing output
遵循我之前的帖子:CUDA NPP - GPU错误检查时出现未知错误
我尝试用CUDA NPP库将图像中的所有像素相加,在一些开发人员的帮助下,我终于编译了我的代码。然而,当我尝试通过将其复制到double
变量(与CUDA v4.2的NPP指南一致)来打印存储在partialSum
中的值时,我得到了这个错误:
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 %dn", 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
这里的问题似乎是基本的指针误用(我说似乎是因为我们有不完整的,不可编译的代码,所以很难确定)。
这个应该可以工作:
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);
这假定不完整代码中的其他内容都是正确的。我把找出这三种变体之间的区别留给读者作为练习。
相关文章:
- 输出错误,问题是找到总和5000位数字cpp
- 使用复制构造函数的程序输出错误
- 异或字符串加密/解密输出错误
- 在linux上使用g++输出错误,在windows上更正
- 使用递归函数 (c++) 将长字符串转换为整数时输出错误
- ECDSA 密钥对生成输出错误
- fscanf() 输出错误的值
- 输入 1024 后十进制到二进制转换的输出错误?
- 输出错误命令的条件语句
- cuSparse (cusparseDcsrgemm) 中的矩阵乘法输出错误的结果
- 为什么 du -sh 输出错误大小的内存映射文件
- VS2017 的输出错误,但 mingw 有效
- 如何使FFMPEG C 代码不输出错误消息
- 乘以时输出错误.这是我编译器中的错误吗?C
- 输出错误:两个不同编译器上的不同输出:Prime Cryptarithm USACO
- 为什么输出错误崩溃
- C++输入/输出错误
- 尝试用 c++ 制作一个简单的加法器.编译成功,但输出错误
- 当我使用此合并排序代码运行时,输出错误
- 递归功能输出错误的值