大家好,欢迎来到IT知识分享网。
根据内存一致性模型,多核多线程的程序无约束执行的结果是不可确定的,因此为限制指令的执行顺序,便引入了特殊的存储器屏障指令(memory fence)。
FENCE指令用于屏障“数据”存储器访问的执行顺序。如果在程序中添加一条FENCE指令,则该FENCE能够保证“在FENCE前所有指令的数据访存结果”必须比“在FENCE后所有指令数据访存结果”先被观测到,即FENCE前的访存指令必须比FENCE后的访存指令先执行。
1. 不同存储模型下的用法
由于各个存储模型限制条件不同(各种内存一致性模型参见:计算机体系结构——多核处理器——存储一致性模型_KGback的博客-CSDN博客_松散一致性模型),fence的用法是不同的。
- 在TSO模型中
内存屏障只需要在store-load时需要(写内存屏障) - 在PSO模型中
内存屏障需要在store-load,store-store时需要(写内存屏障)。对于PSO、TSO模型,最简单的一种方式是保证store buffer被清空时才继续往后执行。这样就能保证,与SC模型执行顺序一样。 - 在RMO模型中
四种乱序情况都存在。此时读内存屏障就要保证前面的load指令要比后面的load/store指令先执行,不允许将对存储器的访存提前进行。
2. RISC-V指令集中实现
以RISC-V指令集RV32I指令格式为例。
- FENCE指令
fence指令用于顺序话其他RISC-V线程,外部设备或者协处理器看到的设备I/O和存储器访问,即屏蔽”数据”存储器执行的顺序。
如图,在所有前续集合(predecessor)执行到FENCE指令前的任何操作前,处于FENCE指令后的后续集合(successor)中的任何操作,都不能被其他任何RISC-V线程或者外部设备看到。即FENCE就像一个栅栏,FENCE之前所有的存储器操作、IO操作必须完成后,在FENCE指令之后的指令才能看到结果。 - FENCE.I指令
fence.i指令用于同步指令和数据流。RSIC-V并不能确保在同一条线程中,取指看得到前面对指令存储器的store,直到执行一条FENCE.I指令
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/137058.html