Domanda

La funzione NPPIDOTPROD_8U64F_C1R provoca un cudaerrorunkNown.Sono in grado di compilare ed eseguire correttamente boxfilternpp e histequalizzazionenpp quindi presumo che il mio sistema sia sano.Sono in esecuzione con una GTX470 (Compute Capability 2.0), CUDA 5.5 e VS2012 x64 su Windows7.Ho anche gestito molte varianti su di esso su due sistemi e avendo lo stesso problema.Ecco il codice:

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

Qualche idea del mio problema?

Grazie mille !!

È stato utile?

Soluzione

L'argomento dei risultati in quella chiamata nppiDotProd deve essere un puntatore del dispositivo, non un puntatore host.È possibile risolverlo allocando la memoria per dp sul dispositivo, qualcosa del genere come:

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

[Disclaimer: scritto nel browser, non compilato o testato, utilizzare un rischio personale]

Ovviamente dovrai copiare il risultato del prodotto Dot Torna all'host se ne hai bisogno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top