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.

关于多核6678 cache一致性的问题



1.对于单核来说,没有cache无效/写回一说,因为无论在cache中还是在ram中值都是对应最新的值是吧?

2.在调试6678过程中,发现一个问题.。

   过程是:Core0与Core1双核运行,共享的数据放在一个结构体 X 中,然后放入MSCM内存中,

                (步骤1)首先Core0把数据存入结构体X中,

               (步骤2)Core1读取X中数据进行计算,并更新 X 中数据,

               (步骤3)运算完成后,Core0再读取 X 中数据。

                最开始不加入Cache无效/写回  的操作,会发现(步骤2)读到的X中数据不是Core0最新更新的数据。然后在(步骤3)后面加入无效

                并写回的操作后,整个计算过程完全正确。

3. 那么 问题来了:

           a, 问什么在(步骤1)后不用Cache写回的操作呢?

           b . 还有在(步骤3)读回X数据时也不用Cache无效的操作也正确。这到底是为什么呢?

这和cache无效/写回的原理好像不太对应,哪位大神或TI工作人员帮小弟解释解释,顺便讲讲cache无效/写回的原理机制到底是咋样????

多谢,多谢!!!

  • 单核时,只有本核进行数据的读写,肯定是可以意识到数据是否更新;如L1D cache是read allocate,写数时如果是cache miss,则直接向外部memory写;读数时,如果cache miss,则会从外部memory读数并建立映射关系,下次再读写时都是直接操作L1D cache,而不会再去操作实际的外部memory,也就是说数据更新一直是基于cache,外部memory不会同步更新。但是由于只有本core在操作,能够保证一直从L1D cache中取到新的数据。多核时,则需要收到维护cache一致性,保证其他core读到更新后的数据。

    回答你的问题,由于L1D cache是read allocate,所以在写的时候如果是cache miss,则直接写MSMC。根据你的测试如果是第一次操作MSMC,首次读写都是cache miss,所以步骤1是直接写MSMC,步骤2再去读的时候如果是第一次操作这块MSMC则也是cache miss,此时也可以读到更新的数据;但是注意由于是步骤2读之后就会建立映射关系,再写就是cache hit,就不会往MSMC写,此时需要刷cache。

    cache的原则就是:多核直接操作的共享memory,写之后要刷cache,读之前要invalid cache。

    cache原理及一致性维护可以看c66 corepac user guide。

  • Andy你好,

    我现在也在研究多核数据共享的问题,但是没有什么头绪,请问是否有这方面的例程可以参考?

  •       对不起,我好像描述的有点小问题。。

          现在我的程序(步骤1)到(步骤3)一直循环运行,起先都不加入cache无效/写回,(步骤2)获得数据不更新,然后不是在(步骤3)中加入cache无效/写回操作,而是在(步骤2)运算完毕之后加入cache无效/写回,这样整个运算都正常。

          我的意思是(步骤1)对结构体X 数据更新后,并没有 cache写回的操作,这时更新的数不应该是在Core0的cache中(而没有更新到MSMC中吗?),为什么(步骤2)中读出的数据X却是最新的数,不明白这里?那(步骤3)情况也属于一样的情况。您说,是不是(步骤1)写回的时候cache miss了,然后(步骤3)中也是属于cache miss的情况??

           那如果真是这样的话,我在(步骤1)和(步骤3)中没加入cache无效/写回的操作属于存在隐患问题是不是?应该加上??

  •      顺便我还想问一个问题:

         cache分为L1d cache L2 cache两种,L2 cache是read allocate吗?MSMC会经过L2 cache吗,还是只经过L1d cache? 读DDR3中数时,是对L1d cache和 L2 cache同时建立映射关系吗?

  • chen zhi 你好,

    我现在也在做多核之间数据交换,这块刚开始接触,那个最基本的先将核0的数据赋值给一个变量,变量分配在MSMC中,然后核1读取这个变量的值。这部分的实现代码不会写,请问可不可以把这部分的代码贴出来学习一下。

    谢谢!

  • 这个很简单啊,我现在电脑里没有我调试的代码,把数据放在MSMC里有两个方法:

    1.使用伪指令##pragma DATA_SECTION();指定一段空间,具体如何用你直接在ccs中help里寻找

    2.使用指针指向MSMC中的地址,。

    这样核0的数据就相当于放入MSMC中了,然后核也是一样同样的方法,就相当于可以读到MSMC中数据了,

    但是这里要注意CACHE的无效写回了,具体如何,可以参考前面的回答。

  • 顺便我还想问一个问题:

         cache分为L1d cache L2 cache两种,L2 cache是read allocate吗?MSMC会经过L2 cache吗,还是只经过L1d cache? 读DDR3中数时,是对L1d cache和 L2 cache同时建立映射关系吗?

    谢谢。。。