请教:
在当前基于C6678的大型项目开发中,在cache的维护上遇到了一些问题,为此希望建立一些基本的维护规则。在应用中,变量可以认为有以下3种:仅核自身用到的变量;多核共享的标志变量(用于核间传递信息);核与外设交互的数据。cache只使用L1D,L2不作cache用。
考虑采用下述原则:
1、核自身用到的变量,定义于L2上,并不作任何一致性维护;
2、多核交互变量,定义于共享内存,任何核写入后均立刻writeback,读出前Invalid;变量定义全部对齐到cache line大小(以避免对一个变量的回写和无效影响其它变量)
3、核与外设交互的数据,当其定义于L2或MSMC上时,分别参照第1条和第2条。
根据大家的开发经验,这些原则是否正确和全面?希望有开发经验的同学能分享经验。
Allen35065:
原则上没有问题,在C6678上请关闭MSMC的Prefetch,详见C6678 silicon errata Advisory 28.
如果在刷Cache时使用mfence指令,一个mfence是不可靠的,需要用连续两个,详见 Advisory 27.
ZQ:
回复 Allen35065:
Allen Yin 您好!
最近在C6678上遇到cache的问题,我使用DMA将数据从cache非使能区拷贝到cache使能区(先无效化cache),在cache使能区计算完毕后又把结果存放到cache非使能区(先回写cache),DMA操作遵循cache维护一致性,但是还是偶尔出现了cache导致的数据错误,请问跟你说的这两个勘误有关吗?(Advisory 27和Advisory 28)
另外,csl库里cache回写的函数最后会有一个mfence操作的语句,你的意思是这个函数是不可靠的?需要再加一个mfence语句??
YUCHAO WANG:
回复 ZQ:
建议你使用keystone库里的writebackcache和invalidcache代码吧,CSL代码有些确实不可靠
Allen35065:
回复 ZQ:
s是这样的,必须连续调用两次mfence才能有效,一个mfence可能会出问题。
ZQ:
回复 Allen35065:
好的,谢谢回复,我也的确看到一些例程里在cache操作的函数后又调用了如下语句:
CSL_XMC_invalidatePrefetchBuffer();
_mfence();
_mfence();
就是对应你说的那两个勘误信息。
另外我想确认我如下做法是否正确可靠???????
前提:L1cache 32kL2 cache256k
无效化cache调用CACHE_invL1d()以及上面三条语句+CACHE_invL2()以及上面三条语句
回写cache同上手机写的排版可能有些奇怪,请见谅,谢谢关注!
Allen35065:
回复 ZQ:
是的;
cache回写应该调用writeback或者invalidatewriteback;invalidate只做无效化。
6678最好关闭MSMC的prefetch buffer防止数据错误,这一点就是在Advisory 28里提到的。
ZQ:
回复 Allen35065:
好的,非常感谢!
xinxin lai:
你好 ,请问多核共享的标志变量你是怎么做的,我现在也在用这个,但是不是很理解,你能具体说下吗,还有那些cache的函数在那个文件,谢谢
Zhan Xiang:
回复 xinxin lai:
建议新开一个帖子提问题,把这个帖子的链接贴到新帖里提问。
多核共享标志变量就是把全局变量通过cmd文件指定到DDR或SL2中的特定位置,所有core都能访问该共享内存。cache的函数在csl_cacheAux.h
Gangping Li:
回复 Zhan Xiang:
zhan xiang 你好!我觉得基于sys/bios的工程使用CMD比较麻烦,容易与CFG文件相冲突;请问针对基于sys/bios的工程如何去把全局变量定义到共享内存中呢?谢谢你