求教:无cache的SMP架构数据一致性问题
之前接触的SMP情况都是各个cpu有一个cache,然后有一个模块保证各个cache的数据一致性,这部分工作由硬件完成,软件透明,我们软件上层只对soc上的非cache访问的外设进行互斥访问。最近,搭档的IC部门想用两个无cache的cpu搞一个无cache的SMP架构,目前还在验证阶段,他们的观点是保证写一致性就可以,貌似是通过控制总线来实现的。。。个人不是很懂啊,在fpga上搞了好久,还是各种问题,虚心求教,像这类的架构数据一致性问题在硬件和软件层一般都怎么保证。PS:我们是用arm968搭的,代码放在itcm,数据放在dtcm/sram/dram,tcm是两个core共享,sram和dram都是通过ahb总线访问。
dualcore共享dataram,需要软件保证写互斥。光总线仲裁是不够的。
比如两个core 同时执行i+,+ 。执行结果就不确定。
是的,数据共享区域需要保证两个cpu写访问互斥,可以做个硬件控制的Semaphore 寄存器。
每个寄存器来控制一段共享区域的写互斥或者直接软件做spinlock也可以。
你的数据一致性是指coherence还是consistency呢?
如果是coherence, 你的处理器没有cache,所有访问都经过内存的话
数据是天然coherence的
如果是consistency的话, armv7以上是weak consistency, 很麻烦
armv7以下没有支持smp的系统吧,所以也没有consistency的定义
你们自己定义好了
cache一致性是硬件做,硬件会广播要修改的数据地址,让其他core invalid 自己的cache
中对应条目。。
就我的经验soc中共享ram一般是软件设置信号量。
很少硬件做信号量。
这两个汉语都叫一致性
顺序一致性和数据一致性
建议按照“顺序一致性”(SC:Sequencial Consistency) 或者 Total Store Order(TSO) 来设计。
SC:访存序为全序(可通过总线仲裁保证全序),且各个处理器的访存序在这个全序中符合自身的程序序;(该方式最符合单核编程的思路)
TSO:与SC类似,但允许 Write Buffer 的行为。但在编程上需有额外的 barrier 来保证程序的正确性。
但在实际中,由于单核编译器仅检测单个处理器中的数据依赖性,所以编译器可能会对访存操作做出顺序上的调整,需要避免此类情况发生;
另外处理器流水级也有可能会改变访存顺序,你们用的 ARM968 出现这种操作的可能性不大,但还是需要通过手册来确定。
最后,Memory Controller 也不能对访存重排序。
看起来比较头大了。。目前我们的代码是放在itcm中,关键数据放在dtcm中,后期和外设交互的数据放在sram中,上层处理的数据在dram。目前看起来这四个memory都存在这个问题,我们有rtos,这个rtos是完善支持cortex dual core的,我们porting的过程中除了数据一致性,其他的问题基本都解决了。现在的状况是,我们将所有的task都通过系统的tick进行调度,同时增加task中的工作量,可以正常运行,但是这样的话task的调度频率会很低。如果将部分task不通过系统tick来调度,比如创建守护task这类的,就会出现问题,凭感觉是切换次数过多就会导致问题,问题的结果可能是直接异常也可能是死锁,有时候会出现处于suspend状态的task在运行而ready的task没法运行的状况,因为出现问题的点随机,尝试单步,偶然跟到过一些怪现象,比如写一个memory地址,利用swp原子操作,发现memory的值被读出来的,但是外面的值没写进去,同时有时候发现对地址A写值会被写到A+4的地址去。
弱弱的问一句:这种情况下,访问memory,对于可能两个core同时访问的数据是不是都要像访问外设那样加锁?如果这样的话,我们的rtos中很多全局的数据结构看起来会比较难处理了。
感觉你自己对你的问题还不是很清楚
前面已经说了汉语一致性对应于英语中的两个概念
你到底想问的是哪一个概念?
确实一般都是软件实现的信号量。
针对基于AMBA的SOC其实就是做了一个ARM架构下的global monitor(ARM L1 cache中的是local montior),用来实现对atomic operation(LDEX.STEX)的支持。这样硬件实现的好处是比纯软件的方式要高效一些。可以利用shareable ram来实现。