2

我目前正在开发一个项目,我在其中进行大量视频处理。该项目使用 C++、openGL 和 glsl。最近我向它添加了一些 CUDA 例程,以进行一些更高级的图像处理工作。我设法在 cuda 中使用 openGL 纹理,但是现在我正在尝试使用带有 openGL 纹理作为输入的一些 cuda 的 npp 函数(没有成功)。

例如我想计算平均值和标准差。预处理输入openGL纹理的偏差:

//I first connect the cudaGraphicsResource to a cudaArray 
//cudaGraphicsResource_t inputImage is input passed from openGL framework
cudaGraphicsMapResources(1,&inputImage);
cudaArray* inputImgArray = NULL;
cudaGraphicsSubResourceGetMappedArray(&inputArray, inputImage,0,0);

//Next I do some preparationwork and cast the cudaArray to a Npp8u* and give
//it as an input source imagebuffer to the npp routine.
NppiSize roi={imgwidth, imgheight};
int bufferSize = 0;
nppiMeanStdDev8uC1RGetBufferHostSize(roi,bufferSize);
double mean = 0;
double stdDev = 0;
Npp8u* scratch =  nppsMalloc_8f(bufferSize);
int stepSize = imgWidth * sizeof(unsigned char);
NppStatus status = nppiMean_stdDev_8u_C1R((Npp8u*)inputImgArray, stepSize, roi, scratch,&mean,&stdDev);

//cleanup
nppsFree(bufferSize);
cudaGraphicsUnmapresources(1,&inputImage);

nppiMean_stdDev_8u_C1R 函数总是返回错误代码:NPP_MEMCPY_ERROR。我到处查看手册,但找不到这是否是使用 NPP 和 opengl 纹理的正确方法。我在互联网上也找不到任何东西。我不敢相信我是第一个试图用 NPP 做这些事情的人。也许我只是错过了一份重要文件中的一个重要章节:-)。

4

1 回答 1

2

您需要将设备指针传递给 NPP,而不是 CUDA 数组。所以在你的情况下,我认为你想使用cudaGraphicsResourceGetMappedPointer而不是cudaGraphicsSubResourceGetMappedArray.

例如:(免责声明:此代码是在浏览器中编写的,未经测试,未经验证。)

//I first connect the cudaGraphicsResource to a cudaArray 
//cudaGraphicsResource_t inputImage is input passed from openGL framework
cudaGraphicsMapResources(1,&inputImage);
unsigned char* inputPtr = NULL; // to hold device pointer to input image
size_t inputSize;
cudaGraphicsResourceGetMappedPointer((void**)&inputPtr, &inputSize, inputImage);

//Next I do some preparation work and cast the device pointer to a Npp8u* and give
//it as an input source imagebuffer to the npp routine.
NppiSize roi={imgwidth, imgheight};
int bufferSize = 0;
nppiMeanStdDev8uC1RGetBufferHostSize(roi, &bufferSize); // note & missing from original!
double mean = 0;
double stdDev = 0;
Npp8u* scratch =  nppsMalloc_8f(bufferSize);
int stepSize = imgWidth * sizeof(unsigned char);
NppStatus status = nppiMean_stdDev_8u_C1R((Npp8u*)inputPtr, stepSize, roi, scratch, &mean, &stdDev);

//cleanup
nppsFree(bufferSize);
cudaGraphicsUnmapresources(1,&inputImage);
于 2012-09-19T00:09:07.020 回答