免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4498 | 回复: 3
打印 上一主题 下一主题

memory barrier的用法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-01-17 13:45 |只看该作者 |倒序浏览
内核提供了几种barrier,来保证指令的执行顺序:
barrier
xmb
smp-xmb
mmiowb

一直搞不清楚,这些barrier的设计目的分别是什么,在什么情况使用。
有人了解的话,麻烦给讲解讲解。

我看了一下这些barrier在x86和arm下的实现。
x86:
barrier    内联汇编中用"volatile""memory"参数,告诉编译器不要优化
xmb       执行xfence指令
smp-xmb    在SMP下等同与xmb,在UP下等同与barrier
mmiowb     等同于barrier

论坛徽章:
0
2 [报告]
发表于 2012-07-19 21:32 |只看该作者
barrier     内联汇编中用"volatile""memory"参数  ---->>使得在这个宏之前的指令按照它们本来的顺序来执行,不要优化它们的执行顺序;
mmiowb  (以mips为例)#define mmiowb() asm volatile ("sync" ::: "memory")  ---->>sync是使得store这个保存操作必须完成,才继续往下执行,所以mmiowb相当于综合了这两种功能,即先不要优化执行顺序,按照原来的指令执行顺序执行,还要保证这些指令执行完之后再往后运行。

论坛徽章:
0
3 [报告]
发表于 2012-07-19 23:02 |只看该作者
barrier是保证指令执行熟悉的
举个例子来说,比如在一个核上执行, a = 3 ; b = 2; flag = 1;
在另一个核上,你判断 if(flag == 1) { c = a + b;}

目的是想等a和b的值赋值成功后通过flag进行标志,但是在编译器优化后,可能在a和b尚未赋值的时候,flag的值已经赋值为1,这个时候另一核上的逻辑就是错的。
对于这样的情况,就需要在a、b的赋值语句与flag的赋值语句之间增加barrier,内存屏障,从而保证顺序

论坛徽章:
0
4 [报告]
发表于 2012-07-23 10:39 |只看该作者
cpu为了提高性能,会乱序执行那些密友依赖的 读写内存的操作指令。

内存屏障就是确保这样的乱序不会发生,不让乱序打乱程序的逻辑。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP