DIY编程器网
标题:
怎样使用DSP的cache
[打印本页]
作者:
liyf
时间:
2012-1-27 14:06
标题:
怎样使用DSP的cache
处理器中的cache是存放于处理器附近的高速存储器,它可以用来保存运算处理时的一些共有的指令,从而加速运算的速度。
在本文中,将比较cache存储器和系统中的普通的存储器,随后将介绍cache的一些基本理论和基本术语,以及在高速处理器结构中cache的重要性。以TI的TMS320C64x DSP结构为基础,将着重向开发者介绍cache是如何工作,如何配置,以及如何正确使用cahce,本文将以cache的一致性贯穿全文。
存储器结构
在图一中,左边的模块介绍了普通的存储器系统结构,CPU和内部存储器均工作在300MHZ。当CPU访问外部存储器时,将不会发生存储器访问禁止的情况。并且当访问内部存储器时也不会发生访问延迟的情况。
当CPU的时钟增加到600MHZ时,只有当存储器的速度也增加到600MHZ时才不会发生访问等待的状态。很不幸,对于大多数情况下同样频率工作在600MHZ的内部存储器价格将十分昂贵。而300MHZ的也不是好的选择,因为将大幅降低CPU的频率。设想一个算法需要在每个周期访问存储器,每一次对存储器的访问需等待一个周期,加倍了访问周期从而抵消了CPU的双倍工作频率。
图二:位置原则
当计算下一个输出y[1]时,五个抽样值(x[1]-x[5]) 将被再次使用,只有一个抽样值(x[6])是新的。所有的抽样值已经提取到cache中,CPU不会发生任何的延迟。这个早先使用过的数据在数据处理中再次被用到的例子很好的说明了时间位置原则。
cache是以局部时间地和空间地访问数据为基础的。因此极大的降低了对低速率的存储器访问,绝大多数数据访问都由高速cache存储器以CPU的工作频率服务于CPU。
存储器数率:
cache系统代表性的包括三种级别
1、第一级cache (L1)位于CPU芯片上并且运算于CPU工作频率。
2、第二级cache(L2)也位于芯片上比L1速度慢而体积大。
3、第三级cache(L3)位于CPU外部,是速度最慢体积最大的存储器。
每一级别的cahce相应执行的因素决定于cache距离处理器的距离。表一中体现了一个有代表性的各自相应的时间。
图四:TMS320C64x Cache 存储器结构
Cache的数据更新
因为cache也是主存储器中的一部分备份,因此cache是否能实时反映主存储器的数据显得至关重要。当cache里的数据改变,而主存储器内的数据未能改变时,cache里的数据被称为“脏”数据。当数据在主存储中改变,而cache中未能实时改变,cache里的这个数据被称为“延迟”数据。
cache控制器采用一系列的技术来维持cache的一致性从而保证cache里存储的都是有用的信息而不是延迟数据。“监测”和“写回”操作便是两种保持cache一致性的办法。”监测“指的是用来允许cache在主存储器中是否进行影响cache地址的传输。如果cache探测到有这样的传输发生,它将及时更性自己从而匹配主存储器。这个在主存储器中复制数据的过程称为”写回“操作。
因为cache比主存储器体积小,因此经常会被填充满。当此种情况发生时,所有搬到cache里面的新数据将会取代已经存在的数据。这里有多种决定数据取代的方法。例如随机取代法、先入先出取代法、最近最少使用取代法。大多数的处理器采用的都是最近最少使用取代法。这样可以是的最新的数据取代最近最少使用的数据。这种方法来源于时间位置法则。
直接映射cache
cache存储器可以被设置为“直接映射”或者“联合方式”。为了解释这些术语,我们以图四所示的C64X的L1Pcache为例,这些cache由512列32字节组成。每一排映射到一些固定的具有相识的存储器地址上。比如:
从0000h 到 0019h的地址经常被cache安排在第0列
从0020h 到 0039h的地址经常被cache安排在第1列
从3FE0h 到 3FFFh 的地址经常被cache安排在第511列。
因此一旦我们需要获得地址4000h,由于cache的容量被用尽了,因此从4000h 到 4019h的地址需要从新从第0列开始。
为了保持数据,L1Dcache的每一列包含以下:
一个最近最少使用位用来指示哪些路最近很少被使用(这个在L1P中未被使用);
一个脏数据位,用来指示cache列是否匹配主存储器的容量(这个在L1P中未被使用);
一个有效数据位,用来指示cache列中包含的是否是有效数据;
一个标记位,等价于地址的高18位;
一个设置数据,等价于地址的5到13位。
命中和不命中决定的方式和直接映射cache方式是一样的。不同的是此时需要两个标记位,一个标记位记录是哪一路的请求数据。如果是第0路的数据被命中,则第0路的列中的数据被访问,如果是第1路的数据被命中,则第1路的列中的数据被访问。
如果两路均不命中的话,数据将从内存中被指派。一个最近最少使用位将决定数据如何分配类似于一个开关操作。如果被指派的第0列的最近最少使用位被设置为0,那么将把此数据分配于第一列。无论对这个cache列是读还是写的访问,都将改变这个最近最少使用标记位。例如:如果第0路的列被读取,则最近最少使用位将切换到1。由于最近最少使用位只记录不命中操作,但是它的状态每次都会更新,无论对列访问是命中还是不命中,读或者写。
对于L1P来说,L1D是一个读分配的cache,不管新数据在内存中申请时读操作是命中或者不命中。在一个写不命中操作时,数据从写存储器传递到内存中,绕过L1Dcacee。在一个写命中操作时,数据写入cache中而不是立即写入内存。当数据被CPU写访问改变时,cache里的内容将提交给一个写回cache,随后数据将被写入内存中。
脏数据位指示当cache里面的数据被写操作修改时,而修改后的新数据还未被写入到主存储器中。最初脏数据位将被赋值为0。一旦当CPU对某列进行写操作时,脏数据位将变为1。当此列被逐出cache时,这个数据将被写回主存储器中。当发生读不命中操作时新数据将从脏数据列中申请,这种情况才会发生。一个写回命令将传递给cache控制器从而产生一个写回操作,只是这种情况并不经常发生。
优化cache性能
这里有三种不命中的情况:
必然不命中(也叫首次不命中):这种不命中发生在当数据第一次放入cache中,为了和下面两种不命中方式区分开来,它们可以被避免。
冲突不命中:不命中发生在在该列在被重复使用之前被取代。
容量不命中:这种方式发生在当cache容量被耗尽时,容量不命中是冲突命中的一种方式。
对于每一种不命中方式,控制器在将数据从存储器放入cache中时都会产生延迟。为了得到更高的性能,每一列中的内容在被取代之前应该尽可能的被重复利用。重复使用某列以此来获得不同的位置能够改善空间位置的访问,而重复使用某列可以改善时间位置的访问。这就是优化cache存储
性能的一个最基本的准则。
例如,当cache存储器经常被访问时,cache的性能是比较高的。这种访问模式在对下一列访问之前将重复对上一列的访问。例如,下面的代码就
如果某一列被从cache里驱除而又需要重新访问,这一列必须重新写入cache。因此,如何避免这种驱除就变得非常重要,确定这种不命中的原因可以帮助我们避免下一次的不命中。
正如上面所说,容量不命中产生的原因是因为cache的容量小于主存储器。如果发生容量不命中,最简单的办法就是加大cache的容量。例如,
C64x DSP上的L2cache可以被配置为cache和SRAM的混合体。如果有很多的容量不命中的情况,编程者可以将L2存储器更多的申请为cache。另一种
解决办法就是减少所需要的数据量。
如果产生冲突不命中,关键在于重新编排数据的排列方式,从而使得最近时间数据能够映射到其他路中。(对于直接映射方式,这个类似于将数据映射对应于不同的行中)改变存储器的排列方式,可以使得数据位于存储器中的不同位置,从而不会产生冲突。作为可选择的,从一个硬件设计的角度,多设置方式可以产生多列的方式。因此,存储器中映射于相同设置的两列都可以在cache中被申请,而不会发生冲突。
转载,信息来自维库电子市场网(www.dzsc.com)
欢迎光临 DIY编程器网 (http://www.diybcq.com/)
Powered by Discuz! X3.2