具有暂存缓冲区的 NPP 函数不填充输出值

NPP functions with scratch buffer doesn't fill output value

我试图找到最大值的一些代码:

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

所有函数return 0(无错误)。但是输出值max_没有计算出来。 我尝试了一些其他需要暂存缓冲区的统计函数并获得相同的结果。 我使用 CUDA 6.5 和我的代码,例如 NPP 文档中关于将函数与暂存缓冲区一起使用的示例 有人有什么想法吗?

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