C++ CUDA NPP-GPU错误检查时出现未知错误
我正在尝试对图像中的所有像素求和,并使用CUDA NPP库获得所有像素的平均值。我的图像是尺寸为w256 x h1024的C++ CUDA NPP-GPU错误检查时出现未知错误,c++,cuda,npp,C++,Cuda,Npp,我正在尝试对图像中的所有像素求和,并使用CUDA NPP库获得所有像素的平均值。我的图像是尺寸为w256 x h1024的8位无符号字符灰度图像。我已经尝试遵循声明指针和将相应的NPP类型指针传递给NPP函数的所有必需规则 然而,当我对我的代码执行GPU错误检查时,我得到了一个未知错误。我试着调试它,但是,我似乎不知道我哪里出错了,我想要一些帮助吗 除此之外,我还使用OpenCV进行处理,因此会出现一些OpenCV代码 编辑:代码已更新 #define gpuErrchk(ans) { gpuA
8位无符号字符灰度图像。我已经尝试遵循声明指针和将相应的NPP类型指针传递给NPP函数的所有必需规则
然而,当我对我的代码执行GPU错误检查时,我得到了一个未知错误。我试着调试它,但是,我似乎不知道我哪里出错了,我想要一些帮助吗
除此之外,我还使用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));
#定义gpuerchk(ans){gpuAssert((ans),uuuu文件,uuu行uuu)}
内联void gpuAssert(cudaError\u t代码,char*文件,int行,bool abort=true)
{
如果(代码!=cudaSuccess)
{
fprintf(标准,“GPUassert:%s%s%d\n”,cudaGetErrorString(代码)、文件、行);
if(abort)getchar();
}
}
//在此处理图像
//设备指针初始化
无符号字符*设备输入;
无符号字符*设备输出;
size\u t d\u ipimgSize=input.step*input.rows;
size\u t d\u opimgSize=output.step*output.rows;
gpuErrchk(cudamaloc((void**)和设备输入,d_ipimgSize));
gpuErrchk(cudamaloc((void**)和设备输出,d_opimgSize));
gpuErrchk(cudaMemcpy(设备输入,输入.数据,d_ipimgSize,cudaMemcpyHostToDevice));
//中值滤波在这里输入图像
// .......
//开始对所有像素求和
Npp64s*partialSum=0;
partialSum=(Npp64s*)malloc(sizeof(Npp64s));
int bytes=input.cols*input.rows;
Npp8u*scratch=nppsMalloc_8u(字节);
int ostep=input.step;
NppiSize imSize;
imSize.width=input.cols;
imSize.height=input.rows;
//将处理后的图像数据复制到源指针中
无符号字符*odata;
odata=(无符号字符*)malloc(sizeof(无符号字符)*input.rows*input.cols);
memcpy(odata、output.data、sizeof(无符号字符)*input.rows*input.cols);
//计算所有像素的和
nppiSum_8u64s_C1R(odata、OSTP、imSize、划痕、部分划痕);
//打印金额
printf(“\n总计cuda%d\n”,*partialSum);
gpuErrchk(cudaFree(设备输入));// nppiSum_8u64s_C1R
中的partialSum
参数应为设备分配内存
此外,还可以根据图像大小分配暂存缓冲区。有一个名为nppiSumGetBufferHostSize_8u64s_C1R
的函数,它为您提供了暂存缓冲区的确切大小,该大小可能大于图像本身(不太可能是简单的求和,但可能是)
还要经常检查NPP和Cuda的返回值<代码>nppiSum_8u64s_C1R
在您的情况下可能不会返回NPP_NO_ERROR
。在哪里声明和分配了设备输入
和设备输出
变量?您能显示该代码吗?@RobertCrovella I更新了代码,以显示设备输入
和设备输出
的声明和定义。在调试过程中,我试图更改字节
、ostep
、imSize
和odata
的声明,以使用openCV输出
结构(如输出.step
,输出.rows
,输出.cols
),看看是否可以消除错误。但是,这似乎也不起作用。我如何检查NPP返回错误?我的gpuerchk
函数不提供Nppstatus
的返回类型。我尝试按照此线程的方法分配暂存缓冲区内存。但是,当我使用nppsReductionGetBufferSize_8u
时,我得到了一个标识符未定义的
错误。另外,应该在设备上分配暂存缓冲区吗?根据NPP原语库,它是。有关于核电站的文件。这里回答了您的大部分问题。我刚刚检查过,在4.2版中,缓冲区大小是通过nppiReductionGetBufferHostSize_8u_C1R检索的。