This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请教6000系列的Cache问题

有direct,2WAY.3WAY.4WAY多种模式。为什么要这样分?优缺点是什么?

  • Jp chao您好:

    cache的direct映射和2way等映射方式在一定程度上决定了cache的性能的。

    cache的作用就是将低端的内存(如DDR等)暂时保存到核内buffer中,提高访问效率。但是通常来说低端内存很大,比如DDR就有256MB或者更大,而cache通常很小,比如C6000的32K的L1D和L1P。这样就无法做到一一对应,只能说根据一定规则将许多的低端内存的地址映射到同一个cache地址,这就是cache的地址映射。

    direct映射方式就是多个DDR的地址只能映射到1个cache地址;2way就是多个DDR地址可以映射到2个cache地址。同样3way和4way分别就是3个cache地址和4个cache地址。

    direct映射的好处就是地址映射关系简单,地址转换快,但是缺点就是对cache利用率不高,即数据进cache时发生冲突的可能性很大。

    多way的映射就是当一个低端内存地址就能选择多个cache地址(这种选择通常是一种算法),它的好处就是能够提高cache利用率,避免频繁的刷出cache(也就是数据冲突),缺点就是地址转换比direct复杂。

    现在数据cache通常是用多way的方式。

    谢谢!

  • 谢谢解答。这样的话,多WAY方式在非连续数据访问中比同等容量的direct方式效率高,如果是连续数据的访问,两者效率一样,这样理解对不对?

    另外我看资料上写的决定多路CACHE中使用哪一路,是用的“最近使用的最少地址位”,没搞明白。

  • 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进行替换。

  •    同问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片区设置为多大才好呢?

  • 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一致性问题,所以需要综合考虑具体情况确定。

    谢谢!

  •     感谢King Wang 的指导,不知道能否告诉我您的工作邮箱,我的是kehuicat@126.com,希望能得到您的来访,谢谢!

  •      再问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到,其读取速度是如此的缓慢。

        谢谢!

  • 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,在德州仪器我们有一整个团队来支持产品在各个领域的应用!谢谢!

  •    谢谢King 详尽的解释,基本上明白了它们的区别。谢谢!