3

CUDA SDK 发行版中的Nvidia Performance Primitives (NPP)图像处理示例中,图像通常作为对象存储在 CPU 上,而图像作为对象存储在 GPU 上。ImageCPUImageNPP

boxFilterNPP.cpp是 CUDA SDK 中使用这些ImageCPUImageNPP对象的示例。

当使用类似的过滤器(卷积)函数nppiFilter时,将过滤器定义为对象是有意义的ImageCPU。但是,我看不到设置对象值的明确方法ImageCPU

npp::ImageCPU_32f_C1 hostKernel(3,3); //allocate space for 3x3 convolution kernel 

//want to set hostKernel to [-1 0 1; -1 0 1; -1 0 1]

hostKernel[0][0] = -1;   //this doesn't compile
hostKernel(0,0) = -1;    //this doesn't compile
hostKernel.at(0,0) = -1; //this doesn't compile

如何手动将值放入ImageCPU对象中?

笔记:

  • 我实际上并没有nppiFilter在代码片段中使用;我只是提到nppiFilter一个将值写入ImageCPU对象的激励示例。
  • boxFilterNPP.cpp示例不涉及直接写入对象ImageCPU,因为它是使用内置高斯平滑滤波器的nppiFilterBox一种特殊情况(可能类似于 [1 1 1; 1 1 1; 1 1 1])。nppiFilter
4

3 回答 3

1

为像素/矩阵赋值:

hostKernel.pixels(0,0)[0].x = -1;
于 2012-10-05T13:19:53.430 回答
1

你是说:“当使用像 nppiFilter 这样的过滤器(卷积)函数时,将过滤器定义为 ImageCPU 对象是有意义的。”

这是错误的,也是一个坏主意。图像数据通常以“行填充”格式存储,并且 NPP 的 CUDA SDK 示例附带的图像类确实使用专门的 2D 内存分配器,将填充字节添加到每行的末尾。这样,每行的第一个像素位于 64 字节对齐的地址上。这样做是出于性能原因(在 CPU 和 GPU 上)。

另一方面,用于像 nppiFilter 这样的原语的内核数组需要紧密打包。这就是显示的代码不起作用的原因。

于 2012-10-09T21:24:35.777 回答
0

对于 1 通道(例如32f_C1),此方法有效:

hostKernel.pixels(0,0) = -1;
于 2012-10-20T04:59:05.887 回答