将一个大小为100byte的数组Buffer放在共享内存中,使用core0对buffer的前50个byte进行处理,使用core1对buffer的后50byte进行处理。想要保证处理结束之后,共享内存里面的数组为处理结束的值。
cache的文档里面说L1D的line大小为64k,因此write back等操作最小单元是一个line,那么对于这样小数组,如何保证core0 维护一致性的时候不会覆盖掉core1处理好的数据?
Brighton Feng:
L1D line size 是64 bytes. 最简单的办法是用两个64 bytes的buffer,而且保证它们按64 bytes对齐.
littleWhite:
回复 Brighton Feng:
这样的话如果我用8个core就要用8个buffer,太浪费资源了,有没有办法可以让buffer的cache功能禁止掉,所有core访问buffer的时候都直接访问存储器。
Brighton Feng:
回复 littleWhite:
每个核最多浪费64 bytes,不算多吧。
可以禁掉cache,但会影响效率。
littleWhite:
回复 Brighton Feng:
可以专门禁止某一个数组的cache吗,其他地方继续使用cache
YUCHAO WANG:
回复 littleWhite:
很遗憾,共享内存的cache是不能禁止的。
通常这种情况下,在核间分配任务时都会考虑到这一点,从而每个核分配的内存长度应当是2的幂次倍(64 128 256),我认为核0和核1分别分配50性这里是不合理的。
如果不能改变这种算法的话,要保证cache的一致性只能设法确保各个核不能在同一时刻对该段内存进行操作,比如利用信号量:
core n:
#define SEM_NUM 0
while ( ! CSL_semIsFree(SEM_NUM) );
CSL_semAcquireDirect(SEM_NUM);
InValidcache( … )
写入内存
Writebackcache( … )
CSL_semReleaseSemaphore(SEM_NUM)
Brighton Feng:
回复 YUCHAO WANG:
任何存储空间都可以被禁止通过cache访问。
下面的培训材料里有多核共享存储空间的一些信息:
http://www.deyisupport.com/cfs-file.ashx/__key/telligent-evolution-components-attachments/00-53-01-00-00-16-31-32/C6678.pdf
YUCHAO WANG:
回复 Brighton Feng:
Mr Feng您好:
在C6678 CorePac中明确指出:
MAR0-255用于配置内存的可cache性;
MAR12对应MSMC,而Table 4-20附言里说:MAR 12-15 are partially read-only and partially writeable
在4.4.5末尾更提到:To support MSMC, the L2 memory controller forces the MAR.PC bit corresponding to the MSMC memory to 1….This makes the MSMC memory always cacheable within L1D when accessed by its primary address range.
这不就代表了MSMC的cache不可能被禁止吗?
Brighton Feng:
回复 YUCHAO WANG:
MSMC RAM可以被重新映射到其它地址空间,比如映射到0x40000000,然后你就可以通过MAR64控制它是否通过cache访问.
JerryWan:
回复 Brighton Feng:
Hi,您好
有没有关于66Ak2H 其DSP和ARM数据交互最简单的例程,比如arm作为master发送简单的字符串,dsp作为slave接收这个简单的字符串,打印出来
Adam Yao94020:
回复 JerryWan:
最简单的方法,就是在ARM和DSP之间定义一块共享内存(MSMC或者DDR上面),然后ARM向这块共享内存写,DSP再去读。
TI的例程是基于IPC的,相对要复杂很多。