2

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

// 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_。我尝试了一些其他需要暂存缓冲区并获得相同结果的统计函数。我使用 CUDA 6.5 和我的代码,例如 NPP 文档中关于使用带有暂存缓冲区的函数的示例有人有什么想法吗?

4

1 回答 1

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_);
于 2015-01-16T09:11:39.847 回答