Pregunta

La función nppiDotProd_8u64f_C1R provoca un cudaErrorUnknown.Puedo compilar y ejecutar correctamente boxFilterNPP e histEqualizationNPP, por lo que asumo que mi sistema está en buen estado.Estoy ejecutando una GTX470 (capacidad de cálculo 2.0), CUDA 5.5 y VS2012 x64 en Windows7.También ejecuté muchas variaciones en dos sistemas y tuve el mismo problema.Aquí está el código:

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);

¿Alguna idea sobre mi problema?

¡¡Muchas gracias!!

¿Fue útil?

Solución

El argumento del resultado en ese nppiDotProd La llamada debe ser un puntero de dispositivo, no un puntero de host.Puedes solucionarlo asignando memoria para dp en el dispositivo, algo como:

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;

[descargo de responsabilidad:escrito en el navegador, no compilado ni probado, use su propio riesgo]

Obviamente necesitarás copiar el resultado del producto punto al host si lo necesitas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top