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");
父主题: 代码移植注意事项