中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助
鲲鹏小智

CPU内存屏障指令移植

在x86-64架构中,内存屏障指令主要分为sfence、lfence和mfence三类。

  • sfence指令前后的写入(store/release)指令,按照在sfence前后的指令序进行执行。从硬件上来说,保证store buffer数据全部被清空的时候才继续往后面执行。
  • lfence指令前后的读取(load/acquire)指令,按照在lfence前后的指令序进行执行。
  • mfence指令之前的写入(store/release)指令,都在该mfence指令之后的写入(store/release)指令之前(指令序,Program Order)执行。既确保写者能够按照指令序完成数据写入,也确保读者能够按照指令序完成数据读取。
例如,在x86上的代码段:
__asm__ __volatile__("sfence" : : : "memory"); 
__asm__ __volatile__("lfence" : : : "memory"); 
__asm__ __volatile__("mfence" : : : "memory");

在鲲鹏上分别替换为:

__asm__ __volatile__("dmb ishst" : : : "memory"); 
__asm__ __volatile__("dmb ishld" : : : "memory"); 
__asm__ __volatile__("dmb ish" : : : "memory");