2014-01-11 2 views
1

Функция nppiDotProd_8u64f_C1R вызывает cudaErrorUnknown. Я могу скомпилировать и запустить правильно boxFilterNPP и histEqualizationNPP, поэтому я предполагаю, что моя система работоспособна. Я работаю с GTX470 (вычислительная способность 2.0), CUDA 5.5 и VS2012 x64 на Windows7. Я также запускаю множество вариаций на двух системах и имею ту же проблему. Вот код:CUDA NPP image dot product 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

Смежные вопросы