有direct,2WAY.3WAY.4WAY多种模式。为什么要这样分?优缺点是什么?
jp chao:
回复 King Wang:
谢谢解答。这样的话,多WAY方式在非连续数据访问中比同等容量的direct方式效率高,如果是连续数据的访问,两者效率一样,这样理解对不对?
另外我看资料上写的决定多路CACHE中使用哪一路,是用的“最近使用的最少地址位”,没搞明白。
King Wang:
回复 jp chao:
jp chao 您好:
连续访问也是多way的效率要好。其实cache的效率可以理解为cache miss的概率和cache conflict的概率。假如是cold cache的连续数据,那么多way和direct的cache miss率是一样的,但是cache conflict的概率是direct的要高。如果发生了冲突,那么dirty的cache line需要被刷回内存,这也会引起CPU的stall。
关于“最近使用的最小地址位”(也称为LRU),则是cache替换的一种方法。它的意思是,系统每隔一段时间自动记录每个way中的每行cache line的访问次数。当某一行cache line需要被替换时,它就会找使用次数最少的那个way进行替换。
Jason miller:
回复 King Wang:
同问King Wang ,我使用的是6437。我测试发现数据(20000byte)全部放在L2中运行的效率只是全部放在DDR2(设置了MAR cacheability)的1.3倍左右,这样我使用EDMA的pingpong结构将数据搬到L2中去运算,可想而知效率也没得大幅提升。
是不是我的与测试代码有关系,只是简单的for(){ dst[i] = src[0][i]/src[1][i]; dst[i] = dst[i]/2; dst[i] = dst[i]*2; } 按照这样形式访问数据,是不是在开了cacheability DDR2中的cache命中率本身就比较高。
另外片外DDR2的cacheability片区设置为多大才好呢?
King Wang:
回复 Jason miller:
Jason 你好:
这个与测试代码有些关系,比如你的代码如果从优化的角度来说,只有src会进入到cache中,因此cache的miss次数可以估算出来,即用总得src长度去除以每个cache line的长度。
DDR的效率一般为1个cache miss 需要stall 90-100 cycle,L2的cache miss 需要stall 10cycle的样子,所以差别就可以理论推算出来。
至于DDR的cache片区,一般由用户自己确定。我们推荐针对连续的大块数据有规则的访问的可以进行cache操作,而且特别是连续的数据我们建议在使用之前先用touch函数将数据块导入cache。另外,DDR的cache设置还需要考虑cache一致性问题,所以需要综合考虑具体情况确定。
谢谢!
Jason miller:
回复 King Wang:
感谢King Wang 的指导,不知道能否告诉我您的工作邮箱,我的是kehuicat@126.com,希望能得到您的来访,谢谢!
Jason miller:
回复 King Wang:
再问King Wang,你说的:DDR的效率一般为1个cache miss 需要stall 90-100 cycle,L2的cache miss 需要stall 10cycle的样子,所以差别就可以理论推算出来。
首先我想问你下你说的这个是在不开DDR2 cacheability还是开DDR2 cacheability的效率比较。
我通过测试在不开DDR2 cacheability情况下,其片内L2的效率的确可达到DDR2中的9-10倍,但是开DDR2 cacheability会提升很小(如上述提到的1.3倍)。开了DDR2 cacheability与L2效率相比理论上有几倍?难道是你说的这个意思?不知道我有没理解错,我想问下开DDR2 cacheability与不开DDR2 cacheability在数据访问上到底有什么区别,难道不开DDR2 cacheability不会被L1D cache、 L2 cache(我的是64x+)cache到,其读取速度是如此的缓慢。
谢谢!
King Wang:
回复 Jason miller:
Jason你好:
你的问题分两步来解释:
1)DDR开启Cache和不开启Cache的区别:
DDR如果开启了Cache,那么DSP就直接从Cache(L1Cache,L2Cache)里面取数,如果不开Cache,那么DSP就从DDR里面取数。
关于效率可以用实例来说明:
读取4个byte的DDR数据如果在开启Cache时,那么第一次访问会有cache miss,导致90~100cycle的stall,但是如果以后还用这个数据,DSP就直接从Cache里面获取,也就是不会再有stall。 如果不开Cache,DDR的第一次访问也会有90~100cyle的stall,与开启cache类似。但是后面的访问每一次DSP都会有90~100的stall,也就是说,后面的读取会很低效。
从另一个角度来说,如果连续64byte的数据,每次使用4byte,总共读16次,如果不开启Cache,那么会有16个90~100的stall,如果开启了Cache,在读取第一个4byte的同时,cache就会一次把全部64byte都读入cache中(cache line是64byte,这里假设数据地址按照Cache Line对齐),那么16次读取就只会有1个90~100的stall。
因此我们通常建议频繁使用、连续的memory设置为cache,使用越频繁,Cache提升效率越明显。
2)DDR开启Cache和数据放在L2的区别
这里设定一个前提,Cache只开启了L1 Cache,方便分析说明。
这时效率就像我上面提到的,每一次cache miss都分别会有90~100cycle(DDR),10cycle(L2)的stall。这时的效率就取决于应用。比如代码主要就是完成数据读取操作,那么这时差别就比较大,因为每多一次cache miss,DDR就需要更多的时间来等待数据;但是有时候代码不仅仅完成读取操作,而主要是计算操作(加减乘除等),这时L2的高效性就不会那么明显。所以这时跟代码关系比较大。
对于你的代码,你要看编译后的汇编情况如何。不过有个地方比较明显,比如你使用了除法,除法会有很大的消耗。因为定点里面做除法是很复杂的,如果是仅仅测试,建议使用其他操作。
另外,我的邮箱king-wang@ti.com,在德州仪器我们有一整个团队来支持产品在各个领域的应用!谢谢!
Jason miller:
回复 King Wang:
谢谢King 详尽的解释,基本上明白了它们的区别。谢谢!