2014-01-11 26 views
1

函数nppiDotProd_8u64f_C1R导致cudaErrorUnknown。我能够编译和正确运行boxFilterNPP和histEqualizationNPP,所以我假设我的系统是健康的。我在Windows7上运行GTX470(计算能力2.0),CUDA 5.5和VS2012 x64。我还在两个系统上运行了许多变体,并且遇到同样的问题。这里是代码:CUDA NPP图像点产品有cudaErrorUnknown

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

调用结果参数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; 

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

你显然需要复制如果你需要点产品的结果返回给主机。

+0

这就是问题所在。非常感谢 !! (该文件对此不太清楚) – Simon