Frage

Die Funktion nppiDotProd_8u64f_C1R verursacht einen cudaErrorUnknown.Ich kann boxFilterNPP und histEqualizationNPP ordnungsgemäß kompilieren und ausführen, sodass ich davon ausgehe, dass mein System fehlerfrei ist.Ich verwende eine GTX470 (Rechenfähigkeit 2.0), CUDA 5.5 und VS2012 x64 unter Windows7.Ich habe auch viele Variationen davon auf zwei Systemen ausgeführt und hatte das gleiche Problem.Hier ist der Code:

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

Irgendeine Idee zu meinem Problem?

Vielen Dank!!

War es hilfreich?

Lösung

Das Ergebnisargument darin nppiDotProd Der Aufruf muss ein Gerätezeiger und kein Hostzeiger sein.Sie können das Problem beheben, indem Sie Speicher zuweisen dp auf dem Gerät etwa:

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;

[Haftungsausschluss:im Browser geschrieben, nicht kompiliert oder getestet, Verwendung auf eigenes Risiko]

Sie müssen das Ergebnis des Skalarprodukts bei Bedarf natürlich zurück auf den Host kopieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top