문제

nppiDotProd_8u64f_C1R 함수는 cudaErrorUnknown을 발생시킵니다.boxFilterNPP 및 histEqualizationNPP를 제대로 컴파일하고 실행할 수 있으므로 시스템이 정상이라고 가정합니다.저는 Windows7에서 GTX470(컴퓨팅 기능 2.0), CUDA 5.5 및 VS2012 x64를 사용하여 실행하고 있습니다.또한 두 시스템에서 다양한 변형을 실행했는데 동일한 문제가 발생했습니다.코드는 다음과 같습니다.

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

내 문제에 대해 아시나요?

매우 감사합니다!!

도움이 되었습니까?

해결책

그 결과 인수 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;

[부인 성명:브라우저에서 작성되었으며 컴파일 또는 테스트되지 않았으므로 위험을 감수해야 합니다.]

필요한 경우 내적 결과를 호스트에 다시 복사해야 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top