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.

MSM的cache一致性维护问题



专家您好:

       最近在调试过程中发现:通过Pcie传送来的数据数据大到一定范围cache inv操作就不起作用了。导致程序运行错误。

      1. csl库中的cache操作分两种,一种直接对L1、L2进行inv和writebak操作,一种是对内存地址依照大小进行cache维护操作,测试时发现有些csl中的cache语句

没有起到相应的作用。对内存地址进行cache操作超过一定范围就会失效。

      请问:

      1.对于用共享接受外设数据的cache维护有何需要注意的地方,比如地址128byte字节对齐,大小128byte字节对齐。cache维护有无大小限制?

      2.如果更新的数据量比较大,对整个L1cache无效和依照内存地址进行cache无效有何区别?

      3.csl库的cache维护代码,需不需要其他相关配置,为何有些语句不起作用?

      4.观察memery brower发现MSM中的数据可能出现在L2cache中,但是L2的cache大小设置为0?

谢谢!!!

  • 1. 无大小限制,应与cache line大小对齐;

    2. L1最大32K,也就是最多缓存32K的数据,写不下的就先回写原来的;

    3. 不需要,可能是回写还没有完成,需加上两次_mfence()语句保证回写完成;

    4.不可能,0x0C000000开始的SL2内容不会出现在L2 cache,一定是别的地方搞错了。

  • 谢谢您的回答:

           单独测试时没出现inv32k不起作用的情况,我们现在依照地址8k byte大小inv cache数据大了也起作用了,问题可能不在清cache本身。

  • Allen Yin 说:

    1. 无大小限制,应与cache line大小对齐;

    2. L1最大32K,也就是最多缓存32K的数据,写不下的就先回写原来的;

    3. 不需要,可能是回写还没有完成,需加上两次_mfence()语句保证回写完成;

    4.不可能,0x0C000000开始的SL2内容不会出现在L2 cache,一定是别的地方搞错了。

    请问Allen,如果L1D cache大小设置为32K,L2cache设置为0;我在LL2中处理所得数据为48K,也就是说我的缓存数据大于32K,那么cache该如何缓存我的这48K的数据呢?是超出32K的这16K部分覆盖之前缓存的cache内存么?

    如果需要将48K的处理数据writeback写回L2内存中,即调用cache的writeback语句可以实现48K的写回么?

    谢谢!

  • 外部memory地址与cache是有映射对应关系,超过cache大小,会进行cache替换,将之前的数据回写后再重新映射读入cache,软件回写只需向cache寄存器写入基地址及长度48k即可,或者调用csl cache函数即可。可以参考cache、corepac user guide关于cache的映射及一致性维护。

  •  好的,谢谢

  • Andy,希望继续向你请教一些问题,还望多多指教;

    在6678的多核访问中,

    1. core1要对core0的L2中的内容进行更新操作时,core0的L2控制器会根据被更新数据的地址判断相应的地址 是否在core0的L1D CACHE中,如果在L1D CACHE中,硬件会自动将更新的数据拷贝一份到L1D CACHE中。当Core0重新对L2中的这部分数据进行处理的时候,如果要读取的数据已经在L1D CACHE中,Core0可以直接从L1D CACHE中得到更新过的数据。如果要读取的数据不在L1D CACHE中,L1D控制器会自动从L2加载数据,Core0也可以得到更新后的数据。         
    2. 当core1要对core0  L2中的内容进行读操作的时候,L2控制器会判断要读取的数据地址是否在L1D CACHE中,对于在L1D CACHE中的数据,硬件会自动从L1D CACHE中读取最新的数据送给core1。对于不在L1D CACHE中的数据,说明core0  L2中的数据已经是最新的数据,可以直接从L2中读取。    
    3.  这样的分析对吧?core1对core0的L2是直接进行内存写操作的么,不经过cache的写操作;而对L2进行读操作时,则考虑cache的存在???

  • Andy,当数据在L2存储器中时,虽然存在CACHE的一致性问题,但可以硬件自动维护;

    那么为什么当代码在L2存储器中时,所存在CACHE的一致性问题必须由软件维护而不能像数据那样硬件自动维护呢?

    期待你的解答。

    谢谢!

  • 同一个核自身的L1和L2之间是自动维护的;

    不同核之间的L1和L2的一致性需要手动维护。

  • Allen Yin 说:

    同一个核自身的L1和L2之间是自动维护的;

    不同核之间的L1和L2的一致性需要手动维护。

    Andy,同一个核自身的L1和L2之间是自动维护的;这个知道的。

    只是在一份资料中看到:当代码在L2存储器中时,所存在CACHE的一致性问题必须由软件维护而不能像数据那样硬件自动维护.。

    难道代码在L2中的一致性不是系统自动维护的么???

    谢谢!

  • 是的,因为代码段一般不会被修改;因此L1P和L2之间的一致性不会自动维护,详见corepac user guide 4.3.8节。