飞腾CPU采用弱顺序内存模型,即允许访存操作序列的实际执行顺序和被第三方观察到的执行顺序不同于程序顺序。
这里说道,访存操作序列存在三种顺序,其中程序顺序就是编程代码中定义的顺序;实际执行顺序是在一个CPU流水线上真实发生的顺序,由于允许乱序执行、分支预测、指令相关约束等各种因素,访存操作真实发生的顺序很可能与程序顺序不一致;另外,在多核CPU中所有CPU和设备(例如GPU显卡、或具有DMA功能网卡)之间会共享内存,由于高速缓存等因素这些共享内存的第三方观察到的执行顺序也可能与程序顺序/实际执行顺序不一致。
上述所说的顺序不一致性,可能导致程序运行结果的错误;为了避免这些错误,飞腾CPU就需要提供一些保证访存顺序性的指令,从而在程序编程中,由软件开发人员根据具体情况来使用。
基本原则是:程序中大量使用保证访存顺序性指令,程序运行的结果正确性能得到很好保证,但是程序运行效率会降低;反之,程序中的顺序性指令比较少,程序的运行效率就会提升,但是正确性可能降低。
飞腾CPU把内存类型分为两大类来处理:一类是以系统主存为典型代表的常规内存类型;另一类就是以外设提供的寄存器为典型代表的设备内存类型。
从本质上来讲,针对常规内存进行读写操作,仅仅是对指定数据单元读写,而不会产生其他的控制影响;但是对设备内存进行读写操作,不是单纯的数据读写,而是会对设备产生其他的控制作用。因此,对设备内存的操作尤其要注意访存操作的顺序性。
常规内存操作默认支持写合并和读预取机制。
设备内存操作不支持读预取,并且对写合并、访问顺序和写确认进行控制使用。
这里要注意的是:某些设备软件驱动将设备内存当作常规内存来操作,这有可能导致在飞腾CPU平台上出现问题。