具有cudaErrorUnknown的CUDA NPP图像点积

时间:2014-01-11 15:23:54

标签: cuda npp

函数nppiDotProd_8u64f_C1R导致cudaErrorUnknown。我能够正确编译和运行boxFilterNPP和histEqualizationNPP,所以我认为我的系统是健康的。我在Windows7上运行GTX470(计算能力2.0),CUDA 5.5和VS2012 x64。我还在两个系统上运行了很多变种并遇到了同样的问题。这是代码:

NppGpuComputeCapability capability = nppGetGpuComputeCapability();

NppiSize sizeROI;
sizeROI.width = 640;
sizeROI.height = 480;

int nBufferSize = 0;
NppStatus status = nppiDotProdGetBufferHostSize_8u64f_C1R(sizeROI,&nBufferSize);
if(status != NPP_SUCCESS) return status;

unsigned char *pDeviceBuffer;
cudaError_t err = cudaMalloc((void**)&pDeviceBuffer,nBufferSize);
if(err != cudaSuccess) return err;

int stepByte1 = 0;
Npp8u * buf1 = nppiMalloc_8u_C1(sizeROI.width, sizeROI.height, &stepByte1);
status = nppiSet_8u_C1R(1,buf1,stepByte1,sizeROI);
if(status != NPP_SUCCESS) return status;

int stepByte2 = 0;
Npp8u * buf2 = nppiMalloc_8u_C1(sizeROI.width, sizeROI.height, &stepByte2);
status = nppiSet_8u_C1R(1,buf2,stepByte2,sizeROI);
if(status != NPP_SUCCESS) return status;

err = cudaDeviceSynchronize();
if(err != cudaSuccess) return err;

double dp = 0;
status = nppiDotProd_8u64f_C1R(buf1,stepByte1,buf2,stepByte2,sizeROI,&dp,pDeviceBuffer);
if(status != NPP_SUCCESS) return status;

err = cudaDeviceSynchronize(); // return cudaErrorUnknown
                // CUDA memchecker gives me "OutOfRangeStore" exception
if(err != cudaSuccess) return err;

printf("result: %f\n", dp);

nppiFree(buf1);
nppiFree(buf2);
cudaFree(pDeviceBuffer);

对我的问题有任何想法吗?

非常感谢!!

1 个答案:

答案 0 :(得分:1)

nppiDotProd调用中的结果参数必须是设备指针,而不是主机指针。您可以通过在设备上为dp分配内存来修复它,例如:

double * dp ;
cudaMalloc((void **)(&dp), sizeof(Npp64f) * 1);
status = nppiDotProd_8u64f_C1R(buf1,stepByte1,buf2,stepByte2,sizeROI,dp,pDeviceBuffer);
if(status != NPP_SUCCESS) return status;

[免责声明:用浏览器编写,未编译或测试,使用自己的风险]

如果需要,您显然需要将点积的结果复制回主机。