【发布时间】:2019-08-10 21:13:58
【问题描述】:
假设一个通用的滑动算法在内核上执行一些函数,如图像处理中的均值滤波器(average-filter)或绝对差之和算法。当内核滑到下一个位置时,将会有一些冗余的内存读取,因为新内核所包含的数据会与之前的数据有些重叠。
让我用一个实际的例子来解释......假设你想对一个内核(窗口)大小为 3x3 的大型 2D 矩阵执行中值滤波。内核的第一个位置(下图中的红色)将以 (1,1) 为中心,第二个位置(绿色)将以 (1,2) 为中心。注意黄色区域是如何重叠的,现在需要从内存中重新加载这些值。
我的具体问题是 3D 均值滤波器,因此重叠更大(3D 为 3^3-3^2 = 18,2D 为 3^2-3 = 6)。
我确定这是一个常见问题...有谁知道如何有效地实现诸如此类的算法以消除冗余内存查找,或利用现代架构上 CPU 缓存的空间和时间局部性(例如2路关联缓存)?
我在 3D 中的具体问题只取最近 6 个邻居(不是对角线邻居)的平均值,并在 C 中实现如下:
for( i = 0; i <= maxi; i++ ) {
for( j = 0; j <= maxj; j++ ) {
for( k = 0; k <= maxk; k++ ) {
filteredData[ i ][ j ][ k ] =
ONE_SIXTH *
(
data[ i + 1 ][ j ][ k ] +
data[ i - 1 ][ j ][ k ] +
data[ i ][ j + 1 ][ k ] +
data[ i ][ j - 1 ][ k ] +
data[ i ][ j ][ k + 1 ] +
data[ i ][ j ][ k - 1 ]
);
}
}
}
【问题讨论】:
-
+1 提出一个清晰且说明良好的问题
-
这是一个包含整数或浮点值的矩阵吗?对于整数,计算通常是精确的,所以当从 (1,1) 转移到 (1,2) 时,您从 (1,1) 处计算的结果开始,减去红色列的总和,然后加上绿色列。对于浮点值,这并不准确,错误会开始累积。
标签: c performance optimization cpu