Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CUDA NPP-GPU错误检查时出现未知错误_C++_Cuda_Npp - Fatal编程技术网

C++ CUDA NPP-GPU错误检查时出现未知错误

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

我正在尝试对图像中的所有像素求和,并使用CUDA NPP库获得所有像素的平均值。我的图像是尺寸为w256 x h1024的
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检索的。