基于嵌入式系统内存规划方法的研究
扫描二维码
随时随地手机看文章
针对有内存管理单元(MMU)的处理器设计的一些桌面操作系统(如Windows、Linux)都使用了虚拟存储器的概念,虚拟内存地址被送到 MMU。在这里,虚拟地址被映射为物理地址,实际存储器被分割为相同大小的页面,采用分页的方式载入进程。一个程序在运行之前,没有必要全部装入内存,而是仅将那些当前要运行的部分页面装入内存运行。大多数嵌入式系统是针对没有MMU的处理器设计的,因此不能使用处理器的虚拟内存管理技术,而采用实存储管理策略,从而对内存的访问是直接的。它对地址的访问不需要经过 MMU,而是直接送到地址线上输出,所有程序中访问的地址都是实际的物理地址。而且,大多数嵌入式操作系统对内存没有保护,各个进程实际上共享一个运行空间。一个进程在执行前,系统必须为它分配足够的连续地址空间,然后全部载入主存储的连续空间。从编译内核开始,开发人员必须告诉系统,这块开发板到底拥有多少内存;在开发程序时,必须考虑内存的分配情况并关注应用程序需要运行空间的大小。另外,由于采用实存储器管理策略,用户程序同内核以及其他用户程序在一个地址空间,程序开发时要保证不侵犯其他应用程序的地址空间,不破坏系统的正常工作,使程序正常运行。因而对内存操作要格外小心。由此可见,开发者不得不参与系统的内存管理,否则系统的效率和性能都不能令人满意。开发者可以用一个内存管理器来帮助管理内存,可以借鉴流行操作系统对内存池(pool)中块(block)进行管理的思想。访问时先寻找对应的块,然后对物理地址进行页的解码,进而是行解码,最后是列解码和根据图像处理系统处理大量数据的特点,对数据在内存中的布局进行规划。即同一块中使连续访问的数据在同一页;在同一页的数据,尽量安排在同一行,减小内存访问延迟,以便对性能进行改善。同时,内存块间相对位置也用同样的方法进行规划,使得块间的转换也尽快完成。本文采用遗传算法,同时对内存数据存储进行页、行、列的规划,对块间相对位置也进行了规划。
1 内存规划
流行的操作系统对内存访问的基本方式是支持快速缓存,执行的过程是把要访问的地址整行拷贝到缓存区,先进行页解码和行解码,然后进行列解码并根据读写信号进行选择。目前嵌入式系统中使用的DRAMs都支持高效内存访问模式,还特别支持流行的页(page)访问模式和区间(burst)访问模式(相当于以列为主的访问)。这种访问模式消耗的能量低于随机访问方式,例如,IBM′s Cu-11 Embedded DRAM macro支持的随机访问时间是10ns,而块中页访问的时间是5ns,电流分别是60mA/MB和13mA/MB。所以,充分利用内存访问模式的特点可以改变嵌入式系统的性能。
为了说明本文的规划思想,假设内存中有如图1所示的变量a,b,c,d,e,f,g,h。若要访问内存中变量的次序为 acacebdbefgfdah,则根据图1中内存存放的次序,可以计算出访问延迟的时间。如果页间访问延迟时间是5个时钟周期,记为Delay(P)= 5cycles,则在同页中行间访问延迟Delay(R)=3cycles,同行中列间访问延迟Delay(C)=1cycles。根据图1(a)和图1 (b)中两种存储模式,可以分别计算出如图2所示的两种内存存储方式下内存访问延迟时间:Latency(a)=47cycles,Latency(b) =29cycles。
同样,将相互访问频率较高的内存块,如三个数组A、B、C分别存放在不同的内存块,数组A和数组C是经常要进行元素间计算的,则把分别存储A和C的块放在相邻的位置上,这样,既可以减小地址总线的负担,也可以提高访问时间和减少访问次数。
2 规划算法
使系统内存访问延迟最小的内存规划应该从变量和要申请的内存块在内存中存储的相对位置的角度来寻找。其前提条件是变量和内存块的访问顺序已知,申请的块的信息也可以得到。根据嵌入式系统应用的特点,例如图像处理系统,经过对程序的预处理,这个条件可以满足。处理过程可分为二步:第一步进行块间的规划;第二步对块内变量进行规划。问题的描述如下。
在嵌入式系统中,设内存块大小为S,某段时间内内存块个数为T,块中每页的大小为p*q*w,其中p为行数,q为列数,w为每个字的位数。在某个应用中有N个变量{ni,i=1,……,N},已知变量被访问的次序为njnknl……nm,则首先寻找块存储的相对位置,使得内存访问延迟函数 Latency1最小(假设两个块相邻,访问需要1个时钟周期;相隔1个块,访问需要2个时钟周期;第i个块和第j个块间访问需要i-j个时钟访问延迟):
Latency1={Sum|∑z*(i-j)/z,z=1....m} (1)
其中:z是访问顺序表中内存块的位置,如第3个位置(z=3)访问的是bi,下一个位置存放的是bj,i和j是内存块访问顺序中相邻块标号,是块在内存中存储的相对位置,m是访问内存块的顺序排列长度。其次寻找N个变量在内存块内的存储相对位置的一种规划{nxnynz……nt},使得内存访问延迟函数Latency2最小,块内规划目标函数为:
Min:Latency2=5*#P+3*#R+#C (2)
其中:#P是规划中访问的页间转换的次数,#R是行间转换的次数,#C是列间转换的次数。N 个变量的排列方法的数目共有N!种,要在如此多的情况下寻找某种最优的排列,这是NP问题。解决这类优化问题有很多方法,如模拟退火算法、演化算法等一些启发算法,也可以用曲线图划分问题(graph partitioning problem)的方法来解决此问题。本文采用了最近几年发展很快的遗传算法来解决此规划问题。遗传算法是解决NP问题的有效方法。本文的研究目的在于内存规划的意义,而不是遗传算法,所以采用经典遗传算法[8],以此来验证内存规划的有效性。本文的算法可记为LBP(LBP-Layout of Block and Page)。
2.1 算法的前提条件
在解决问题之前,要给出解决问题的前提。
(1)对块内访问时,通常是先寻找页,再找到行,最后找列,则对页访问的耗时(一般称为内存访问延迟)大于对同页中的行,行访问耗时大于同行中的列。同时在相距较远的块间访问耗时大于相邻块间访问。
(2)减少内存访问中块和页的转换次数,可以减少延迟和节省能量。
(3)在页/行/列之间转换没有优先级,也就是从1~3页和从1~2页耗时是相同的。
(4)内存单元阵列是矩形,p和q代表内存块单元的行数和列数,w代表内存字的长度,则p*q*w代表了内存的大小。
(5)数据访问顺序是已知的。
(6)每个数据都分配给独立的内存单元,基本单元的大小与要分配的数据刚好匹配。
前面四个假设是解决问题的必要条件,而后面两条假设是为了简化解决的问题。如果没有特别的说明,这些假设在本文都是适用的。
2.2 遗传算法
遗传算法的基本步骤是确定适应度函数,然后对问题进行编码和寻找最优解。下面给出解决块内规划问题算法第二步的基本步骤。第一步与第二步相似,本文省略。
(1)适应度函数是目标函数,即Latency。依据假设,如果页访问模式延迟时间是5个时钟周期,记为Delay(P)=5cycles,则行延迟Delay(R)=3cycles,列延迟Delay(C)=1cycles,适应度函数为:latency(cycles)=#P*5+#R*3 +#C*1。
(2)解决的问题是内存变量的存放次序,由于字母的数目有限,所以可用十进制编码来表示变量(如把图1中abcdefgh编码为12345678)。
(3)杂交过程选择同一代中的某些位进行交换,不同代的交换容易产生非法个体, 所以在某代个体内部进行交换,可以提高算法的有效性。选取某代杂交的概率为Pc=0.08。
(4)算法的终止是在某两代适应度函数之间相对误差小于0.001时,程序终止,并给出最优的内存规划方法。如果内存单元数目有p*q个,则取串中每q个为一行(分为一组),间隔n*(q-1)为一列,存放在内存中供程序使用。
2.3 实验结果
图像处理系统的处理对象是象素,处理过程中使用大量的内存,造成了嵌入式系统图像处理应用中的瓶颈。经过近几十年的发展,图像处理算法也有很多成熟的算法。可以把这些算法经过改造,使之适应嵌入式系统体积小、容量小的特点。本文算法的提出是针对使用大量内存,同时处理步骤相对简单的系统设计的。本文采用一些标准(benchmark)系统,提高嵌入式系统有限的内存资源的利用率。基于内存的规划算法,用几个内存访问序列验证内存规划对嵌入式系统性能的改变。实验中使用IFA(Image Flip Algorithm)、GSR(Gauss-Seidel formula)、CA(Compress Algorithm)、BIQUAD(Biquad_one_section)和FIR。后两个例子是为了验证非图像处理的系统使用本算法的情况,说明算法的应用具有一定的普遍意义。
表1和表2是用随机访问方法和本文的访问方法进行实验的结果。从表中可以看出,规划后的延迟时间都缩短了,另外还验证了规划内存方法的使用减少了嵌入式系统能耗。能耗的计算采用文献[2]中的算法,如图3(a)所示。
文献[1]中的算法是对页进行规划时,寻找页访问次数最大,对列进行规划时,寻找列访问次数最大。在具体应用中,只能用一种方法。而本文同时对内存中页和行进行规划,所以对系统性能的提高更有效。图3(b)是与文献[1]算法的结果比较(仅给出能量消耗图),前者平均能量提高了大约10%。
把本文的算法应用于自行开发的嵌入式图像处理系统中,获得了良好的系统性能。
3 结论和展望
本文提出了一个通过减少对内存访问时块间和块内页间交换的次数和行间转换的次数,使嵌入式系统内存和能量资源能够有效利用的方法。该方法可以直接应用到嵌入式系统的内存管理器中。因为随着用户需求和功能的增加,越来越多的嵌入式系统需要处理大量的数据,所以对嵌入式系统的内存采取管理是必要的。尤其对一些不带MMU单元的操作系统来说,应用中加入内存管理程序对系统性能的提高起到很大的作用。本文给出的内存规划策略能有效地减轻嵌入式系统负担。本文是针对非数组的变量来讨论的,但是也可以应用到数组变量中。尽管使用的算法有可能没有找到系统的最优解,但使用这个算法,一定可以提高系统的性能。
本文提出的算法不但可以应用到嵌入式系统中的DRAMs,也可以应用到其他支持行和列内存访问的存储设备上,如flash存储器。虽然目前一些多组SRAM的系统还不支持此算法,但是在将来的基于功耗设计的系统中,这种访问模式是会被支持的。
本文方法同流行操作系统内存管理相比更简单,更加适合嵌入式系统,同时弥补了现用嵌入式操作系统CLinux等在内存管理方面的不足。