具有暂存缓冲区的 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_);
我试图找到最大值的一些代码:
// 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_);