在Nvidia Performance Primitives (NPP)的CUDA SDK distribution图像处理示例中,图像通常作为ImageCPU
个对象存储在CPU上,图像作为ImageNPP
个对象存储在GPU上。
boxFilterNPP.cpp是CUDA SDK中使用这些ImageCPU
和ImageNPP
个对象的示例。
使用像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
对象的激励示例。ImageCPU
对象,因为nppiFilterBox
是使用内置高斯平滑滤镜的nppiFilter
的特例(可能像[1 1 1; 1 1 1; 1 1 1])。答案 0 :(得分:1)
为像素/矩阵指定值:
hostKernel.pixels(0,0)[0].x = -1;
答案 1 :(得分:1)
你说:“当使用像nppiFilter这样的过滤器(卷积)函数时,将过滤器定义为ImageCPU对象是有意义的。”
这是错误的,也是个坏主意。图像数据通常以“行填充”格式存储,NPP的CUDA SDK样本附带的图像类确实使用专用的2D内存分配器,在每行的末尾添加填充字节。这样,每行的第一个像素落在64字节对齐的地址上。这样做是出于性能原因(在CPU和GPU上)。
另一方面,用于像nppiFilter这样的原语的内核数组需要紧密包装。这就是为什么显示的代码不起作用的原因。
答案 2 :(得分:0)
对于1通道(例如32f_C1
),此方法有效:
hostKernel.pixels(0,0) = -1;