我现在要做的是八个核都共享同一片数据区,不过每个核负责处理的数据区域是不同的。
核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();
发现其他核的结果都可以读取,而主核的结果却没有了!>_<
Adam Yao94020:
1. 每个核处理完毕了之后,需要cache_WB,才能把cache中结果push到内存
2. core1-7,处理完毕自己的数据块后做Cache_wb, core0, 在集中处理数据块之前,做Cache_Inv
Qian Tang:
回复 Adam Yao94020:
我的代码大概是这个样子的
主核0:
// 初始化共享区域的数据 Cache_wbAll(); // 通知其他核处理数据 Cache_disable(); // 主核处理它这部分的数据,并把结果放在内存中 Cache_wbAll(); // 等待其他核完成处理 Cache_inv(); Cache_wait(); // 主核读取存入结果的内存区域从核代码
// 获得主核通知 Cache_disable(); // 从核处理数据 Cache_wbAll(); // 通知主核处理完成最后的结果还是只有主核数据被正确存入了!
Adam Yao94020:
回复 Qian Tang:
这里cache disable应该是不需要的。
同时各个核处理的数据段都必须做到cache line对齐,如果数据放在MSMC上,L1D上的cache line是64字节,如果数据放在DDR上同时打开了L2 cahce,cache line是128字节。