2015-01-15 2 views
2

일부 코드를 기입하지 않는 경우 찾기 최대 노력 메신저 :NPP 기능은 출력 값

// 1) 
    // compute size of scratch buffer 
    int nBufferSize; 
    auto status = nppiMaxGetBufferHostSize_32f_C1R(size(img), &nBufferSize); 
    // status - No_Errors, nBufferSize - computed 

// 2) 
    // device memory allocation for scratch buffer 
    Npp8u * pDeviceBuffer; 
    auto res = cudaMalloc((void **)(&pDeviceBuffer), nBufferSize); 
    // result - cudaSucces 

//3) 
    // call nnp function 
    // where: 
    // - img is npp::ImageNPP_32f_C1 from UtilNPP (npp pointer wrapper for memory management) 
    // - size(img) valid NppiSize value 
    Npp32f max_ = 13; 
    status = nppiMax_32f_C1R(img.data(), img.pitch(), size(img), pDeviceBuffer, &max_); 
    // status = No_Errors, but output value max_ not changed! 

// 4) 
    // free device memory for scratch buffer 
    cudaFree(pDeviceBuffer) 

모든 함수 반환 0 (오류없이). 그러나 출력 값 max_은 계산되지 않았습니다. Im은 스크래치 버퍼를 필요로하는 다른 통계 함수를 시도하고 같은 결과를 얻습니다. CUDA 6.5를 사용하고 스크래치 버퍼와 함께 함수를 사용하는 방법에 대한 NPP 문서의 코드를 참조하십시오. 누군가 아이디어가 있습니까?

답변

2

nppiMax_32f_C1R 및 기타 모든 변형은 입력 및 출력 메모리 포인터를 장치에 할당해야합니다. 따라서 max_이 장치에 있어야합니다. 위의 예를 적용하려면 다음을 수행하십시오.

Npp32f max_ = 13; 

Npp32f* d_max_; //Device output 
cudaMalloc(&d_max_, sizeof(Npp32f)); 

status = nppiMax_32f_C1R(img.data(), img.pitch(), size(img), pDeviceBuffer, d_max_); 

cudaMemcpy(&max_, d_max_, sizeof(Npp32f), cudaMemcpyDeviceToHost); 
cudaFree(d_max_); 
+0

감사합니다. 그것은 작동 :) – Anatoly