请教一个与C6678多核操作DDR3时一致性相关的问题。
情景:多核应用,core0将数据通过共享DDR3给core1~7处理,并将结果通过pcie传出,
对16MB的数据,在内存中进行如下的复制操作:
1、通过PCI-E将数据从外部复制到0x81000000,
2、core0将数据从0x81000000复制到0x90000000,
3、core1~7将数据从0x90000000复制到0x84000000,
4、core0将数据从0x84000000到0x83000000,
5、通过PCI-E将数据从0x83000000复制到外部,
导出后跟原始16MB数据对比发现数据不完全一致,但是同样的操作完全由Core0进行就不会出现错误。
最开始内存复制用的memcpy:
void copyDDR(int *src, int *dst, unsigned size) {
memcpy(dst,src,size);
}
后来想到了可能是缓存一致性造成的错误,就增加了L2的write-back和invalidate操作,代码如下,但是还是会出错:
void copyDDR(int *src, int *dst, unsigned size) {
CACHE_invL2 ((void *)src,size,CACHE_WAIT);
_mfence();
memcpy(dst,src,size);
CACHE_wbL2((unsigned int*)dst, size, CACHE_WAIT);
_mfence();
}
请教一下是由于别的原因内存数据出错还是我们缓存一致性的解决方式不对。
Shine:
代码中对L2做回写和invalid,那你对L1, L2做cache使能了吗?是否有观察过L2里的内容?