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.

关于Cache回写进入内存的问题



我现在要做的是八个核都共享同一片数据区,不过每个核负责处理的数据区域是不同的。

核0是主核,除了本身处理一块数据外,还负责通知其他核开始处理,及收到其他核完成处理的通知。

在核0收到其他完成处理的通知后,打开共享内存,读取所有核的处理结果

我的问题是:

1. 数据本来是存放在共享内存中,各核处理的数据结果只会暂时存放在Cache中么?如果需要放入内存中,是需要用Cache_wb写回么?

2. 如果是这样的话,八个核中应该如何调用Cache函数,使得最后所有的数据结果都能存入内存中呢?比如Cache_wb和Cache_disable函数都如何安排?

我的尝试:

1. 各核调用处理函数前都先调用Cache_disable,处理函数后再调用Cache_wb,结果只用核0的数据成功存入内存中了。

2. 在主核读取所有处理结果后面添加了一段

Cache_disable(Cache_Type_ALL);
Cache_inv(outBuf,sizeof(outBuf),Cache_Type_ALL,TRUE);
Cache_wait();

发现其他核的结果都可以读取,而主核的结果却没有了!>_<

  • 1.  每个核处理完毕了之后,需要cache_WB,才能把cache中结果push到内存

    2.  core1-7,处理完毕自己的数据块后做Cache_wb,
         core0, 在集中处理数据块之前,做Cache_Inv 

  • 我的代码大概是这个样子的

    主核0:

    // 初始化共享区域的数据
    Cache_wbAll();
    // 通知其他核处理数据
    Cache_disable();
    // 主核处理它这部分的数据,并把结果放在内存中
    Cache_wbAll();
    // 等待其他核完成处理
    Cache_inv();
    Cache_wait();
    // 主核读取存入结果的内存区域
    
    

    从核代码

    // 获得主核通知
    Cache_disable();
    // 从核处理数据
    Cache_wbAll();
    // 通知主核处理完成

    最后的结果还是只有主核数据被正确存入了!

  • 这里cache disable应该是不需要的。

    同时各个核处理的数据段都必须做到cache line对齐,如果数据放在MSMC上,L1D上的cache line是64字节,如果数据放在DDR上同时打开了L2 cahce,cache line是128字节。