带暂存缓冲区的NPP函数不会填充输出值

时间:2015-01-15 21:17:04

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

1 个答案:

答案 0 :(得分: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_);