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.

多核共享同一变量的问题



主要问题可以归纳为:

多核共享一个全局变量flag,flag存放在MSMC中。

core0同时发中断给core2、core3、core5,三个核对flag做更新。

cache一致性的问题已经考虑过应该没问题。

三个核同时操作同一变量也是通过信号量来实现的。

而且昨天程序的结果还是正确的。

今天对程序做了修改,程序就不行了,修改不涉及到上述内容(增加了些变量定义和初始化)。

以上为背景。

主要问题是:增加一个变量的定义后,结果就会有变化?不知道为什么会有这样的问题,一个变量的定义会造成这样的影响?

卡在这个地方了。。。

  • 已经解决,预取缓存的问题,还是属于cache一致性的问题吧。

  • bb qiuhua 你好,

    请教你是怎样解决多核共享同一变量问题的?cache coherence 问题我也考虑了,但就是不对,于是我将flag所在空间noncacheable了,这样就不存在cache coherence 问题了,但是结果依然不对。能否参考一下你具体怎么做的?感激不敬

  • huge q 你好,

    我也是刚刚接触DSP,很多东西仅仅是刚入门。

    我的共享变量是放在MSMC中,被L1D Cache。另外MSMC默认打开了预取功能。

    所以我需要考虑L1D Cache和MSMC预取两个部分(L2Cache在我程序中不需要考虑),关键代码贴出,希望对你有帮助,仅供参考~

    ① 读操作过程:

    CACHE_invL1d((void*)&fill_wait,64,CACHE_NOWAIT);                                   //读之前invalidate,保证读到的数据是从MSMC中取得

    CACHE_invL1dWait();  

    ② 写操作过程:

    CACHE_invL1d((void*)&fill_wait,64,CACHE_NOWAIT); //读之前invalidate,保证读到的数据是从MSMC中取得

    CACHE_invL1dWait();  

    CSL_XMC_invalidatePrefetchBuffer();                                                                  //使预取缓存失效

    fill_wait |= 0x2; //更新我的变量

    CACHE_wbInvL1d((void*)&fill_wait,64,CACHE_NOWAIT); //回写并invalidate,将更新后的值及时写回MSMC

    CACHE_wbInvL1dWait(); 

    论坛中很多帖子都讲这个,搜索一下吧。

    建议你单步调试下,先定位问题。

  • 谢谢bb qiuhua 的建议和帮助,新手上路不容易呀,