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的使用

下图为我的一段代码,在MSM中定义了一个数组menxian[7],用于存储0~6核所求的门限值;

按照程序,1~6核会先求出各个核自己的门限值,由于程序中打开了CACHE,所以在求出门限值之后,

在各个核中执行CACHE_wbL1d ((void *) &menxian[DNUM], 64, CACHE_WAIT);

将计算的门限值写回到MSM内存中。

我的疑问就是:每个核都会CACHE 64字节的空间,那么0核在将menxian[0]写回到MSM的同时,

会不会对已经存在于MSM中的menxian[DNUM]再写回一次,即将0值写回,覆盖已存储的正确值,导致错误????

各个核的写回、无效操作会互相影响么?

  • 你这样的操作是会存在覆盖问题,因为每次回写都是cache line对齐,后写的core会覆盖前面core的内容,如果要这样定义的话,数据量不大的话可以定义在noncache memory,就不会存在cache一致性维护问题;如果一定要定义在cache区,则需要将每个core的结果定义变量地址间隔为cache line的整数倍,保证在cache一致性正确。

  • Andy,非常感谢你对我这几个问题的解答。

    也就是说,如果我一定要定义在cache区,就需要将每个core的结果单独定义变量,令其地址间隔均为cache line的整数倍,保证在cache一致性正确。

    还想问一下:不管CACHE_inv还是CACHE_wb,作用的大小必须是cache line的整数倍么?即使我对要CACHE的变量的定义的大小并没有cache line那么大。

  • 是的,必须保证长度是cache line的整数倍,因为cache write back及invalidate的单元都是cache line,如果非cache line对齐操作,可能覆盖后面的数据。这些c66x cache user guide中都有说明。

  •  好的,谢谢Andy.