优化算法和页命中率

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

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

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

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

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

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

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

 

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

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

 

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

 

 

转载于:https://www.cnblogs.com/mengxipeng/archive/2012/08/27/2658851.html

一、课程设计目的 通过请求式管理方式中面置换算法的模拟设计,了解虚拟存储技术的特点,掌握请 求式存储管理中的面置换算法。 容 二、课程设计内容 模拟实现 OPT(最佳置换)、FIFO 和 LRU 算法,并计算缺率。 示 三、要求及提示 本题目必须单人完成。 1、首先用随机数生成函数产生一个“指令将要访问的地址序列”,然后将地址序列变换 成相应的地址流(即访问序列),再计算不同算法下的命中率。 2、通过随机数产生一个地址序列,共产生 400 条。其中 50%的地址访问是顺序执行的, 另外 50%就是非顺序执行。且地址在前半部地址空间和后半部地址空间均匀分布。具体产 生方法如下: 1) 在前半部地址空间,即[0,199]中随机选一数 m,记录到地址流数组中(这是 非顺序执行); 2) 接着“顺序执行一条指令”,即执行地址为 m+1 的指令,把 m+1 记录下来; 3) 在后半部地址空间,[200,399]中随机选一数 m’,作为新指令地址; 4) 顺序执行一条指令,其地址为 m’+1; 5) 重复步骤 1~4,直到产生 400 个指令地址。 3、将指令地址流变换成地址(号)流,简化假设为: 1) 面大小为 1K(这里 K 只是表示一个单位,不必是 1024B); 2) 用户虚存容量为 40K; 3) 用户内存容量为 4 个框到 40 个框; 6 4) 用户虚存中,每 K 存放 10 条指令,所以那 400 条指令访问地址所对应的地 址(号)流为:指令访问地址为[0,9]的地址为第 0 ;指令访问地址为[10, 19]的地址为第 1 ;……。按这种方式,把 400 条指令组织进“40 ”,并 将“要访问的号序列”记录到地址流数组中。 4、循环运行,使用户内存容量从 4 框到 40 框。计算每个内存容量下不同面置换 算法的命中率。输出结果可以为: 框数 OPT 缺率 FIFO 缺率 LRU 缺率 [4] OPT:0.5566 FIFO:0.4455 LRU:0.5500 [5] OPT:0.6644 FIFO:0.5544 LRU:0.5588 …… …… …… …… [39] OPT:0.9000 FIFO:0.9000 LRU:0.9000 [40] OPT:1.0000 FIFO:1.0000 LRU:1.0000 注 1:在某一次实验中,可能 FIFO 比 LRU 性能更好,但足够多次的实验表明 LRU 的平均性能比 FIFO 更好。 注 2:计算缺率时,以框填满之前和之后的总缺次数计算。
设计一个虚拟存储区和内存工作区,并使用下列算法计算访问命中率. (1) 进先出的算法(FIFO) (2) 最近最少使用的算法(LRU) (3) 最佳淘汰算法(OPT)(4) 最少访问面算法(LFU) (5) 最近最不经常使用算法(NUR) 命中率=1-面失效次数/地址流长度 本实验的程序设计基本上按照实验内容进行。即首先用 srand()和 rand()函数定 义和产生指令序列,然后将指令序列变换成相应的地址流,并针对不同的算法 计算出相应的命中率。相关定义如下: 1 数据结构 (1)面类型 typedef struct{ int pn,pfn,counter,time; }pl-type; 其中 pn 为号,pfn 为面号, counter 为一个周期内访问该面的次数, time 为访问时间. (2) 面控制结构 pfc-struct{ int pn,pfn; struct pfc_struct *next;} typedef struct pfc_struct pfc_type; pfc_type pfc_struct[total_vp],*freepf_head,*busypf_head; pfc_type *busypf_tail; 其中 pfc[total_vp]定义用户进程虚控制结构, *freepf_head 为空面头的指针, *busypf_head 为忙面头的指针, *busypf_tail 为忙面尾的指针. 2.函数定义 (1)Void initialize( ):初始化函数,给每个相关的面赋值. (2)Void FIFO( ):计算使用 FIFO 算法时的命中率. (3)Void LRU( ):计算使用 LRU 算法时的命中率. (4)Void OPT( ):计算使用 OPT 算法时的命中率. (5)Void LFU( ):计算使用 LFU 算法时的命中率. (6)Void NUR( ):计算使用 NUR 算法时的命中率. 3.变量定义 (1)int a[total_instruction]: 指令流数据组.(2)int page[total_instruction]: 每条指令所属的号. (3)int offset[total_instruction]: 每装入 10 条指令后取模运算号偏移 值. (4)int total_pf: 用户进程的内存面数. (5)int disaffect: 面失效次数.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值