代码改变世界

优化算法和页命中率

2012-08-27 16:58  Meng Xipeng  阅读(1039)  评论(0编辑  收藏  举报

    前几天, 一直在优化一个图像处理的算法,是一个二值化的算法, 有好几步运算, 都是卷积运算, 原来的程序是用c写的。 

首先计算方差有快速算法,看了matlab中一些图像处理函数的代码,明白了快速算法的方法, 改写了一下,速度提升很快。

然后每个卷积运算要分解, 分成垂直运算和水平运算, 虽然要分成两部进行, 但是运算量减少很多, 速度又提升了, 接下来的提升非常的艰难, 

看到了网上的一些例子,   要先做水平运算, 再做垂直运算, 做水平运算的同时存放结果的时候做个转置, 这样 下来的垂直运算就变成了水平运算,

当然最后存放结果的时候依然要做个转置, 不然结果图片的方向就不对了。 水平运算中循环内部的运算又会小一点, 真是细节出真知。从道理上讲, 按照

这个方法, 速度应该会有提升, 但是结果,发现速度尽然十分的慢。 为什么呢?

   我用的是台普通的台式机,内存只有512M ,   用的是linux 操作系统, 琢磨了几天, 终于明白了问题之所在, 认识到还有个页命中率这个概念

 

   首先操作系统换页操作十分耗费时间, 可能需要个几百ms, 如果算法想在很短时间内完成, 这个换页时间就是个很大的障碍。

   所以优化算法就是要提高页命中率, 所以好的算法有个局部化原则:  下一步要访问的程序和数据最好不要离这一步访问的太远, 不然可能就要换页, 其实仔细想想, 计算机系统中的cache 技术也是这个原则为前提的。  很不巧我的测试图片都比较大, 虽然是灰度图, 但是尺寸都是2000多乘2000多, 一幅图片起码也有个4M多字节, 再加上中间结果, 整个要操作的数据都要10几M了, 现在的操作系统大多都是2k一个页, 做转置运算, 不论如何优化, 总会有个指针要跳得很快, 而且还要在整个图片数据区里跳很多次, 这样不可避免的 换页操作就多了, 所以慢了, 网上说linux 可以调节操作系统参数, 增加页大小, 没有试, 应该会有所改善吧。处理之前先判断图片大小, 根据图片大小做不同的处理

 

   猛然想到, 对于matlab 为什么对矩阵要列优先一直没想通, 现在好像觉得和这个有点关系, 图片大多会宽大于高, 用列优先存放,应该在很多情况下 避免换页。 似乎有一定道理, 可能还有更深层次原因。