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

CUDA 配列ではなく、デバイス ポインターを NPP に渡す必要があります。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 に答える