当前位置: 首页 > news >正文

北京 做网站 公司爱站网关键词排名

北京 做网站 公司,爱站网关键词排名,北京平面设计公司,大数据培训多少钱目录 一、概述 二、指令乱序 2.1 为什么要乱序 2.2 如何实现乱序 2.3 乱序执行带来的副作用 三、memory barrier 3.1 memory consistency model 3.2 memory barrier 3.3 锁 参考 一、概述 memory barrier 产生的原因要深入理解体系结构,这篇文字有点敷于…

目录

一、概述

二、指令乱序

2.1 为什么要乱序

2.2 如何实现乱序

2.3 乱序执行带来的副作用

三、memory barrier

3.1 memory consistency model

3.2 memory barrier

3.3 锁

参考


一、概述

memory barrier 产生的原因要深入理解体系结构,这篇文字有点敷于表面,记录一个分析的思路

二、指令乱序

2.1 为什么要乱序

在按照program order执行命令的cpu上,考虑到程序之间有的指令存在指令相关,这种指令的相关性会造成性能的下降,考虑下面的指令:

1.   load  r1, (r0)             // r1 = [r0]
2.   add   r1,  r2              // r2 = r1 + r2
3.   store r3, (r4)             // [r4] = r3

在顺序执行条件下,假如指令1的load指令产生了cache miss,由于指令1,2是相关的,2需要等待1的结果(r1),这会造成流水线stall,尽管3指令和1,2都不相关,但是由于顺序执行的要求,这里也无法得到执行。

考虑这样一种方式,我们通过指令调度,将3在安排在1后执行,这样等到2开始执行时,1中r1的结果已经可用了,这样就可以掩盖流水线的stall,提高指令执行效率。这样的执行行为其实打破了顺序执行的规则,事实上指令进行了乱序执行。

所以,乱序执行可以提高性能。

2.2 如何实现乱序

          可以通过两个方法实现指令乱序:

  1. 利用编译器实现(compile time),称为指令的静态调度
  2. 利用硬件(runtime),称为动态调度

一般的,编译器乱序是可以观察到的——通过对比不同优化等级的汇编指令可以看出。而硬件的乱序执行我们无法直观的看到,这些可以通过了解一些微架构的实现理解其原理。

2.3 乱序执行带来的副作用

尽管乱序执行可以带来性能上的提升,但在某些情况下,尤其是多核下,会造成一些问题,考虑如下代码:

void foo(void)
{a = 1;b = 1;
}void bar(void)
{while (b == 0) continue;assert(a == 1);
}

假如foo在cpu0执行,bar在cpu1执行,在cpu0看来a = 1, b = 1指令是无关的,因此foo在执行时有可能先执行b=1,再执行a=1。然而我们看到在bar中,如果前面所说的顺序执行,assert会失败。失败的原因在于a,b没有按照program order执行,编译器和cpu没有看到bar中a,b中逻辑关系的能力,这时候就需要程序员通过显式的指定a,b执行的顺序,即memory barrier。

三、memory barrier

本节主要针对的是内存操作——load/store乱序说明,两个操作数都是寄存器的指令不在考虑范围内。

3.1 memory consistency model

简称memory model,在我们只考虑load,store两种执行的情况下,乱序的情况只有以下四种:

不同体系结构通过允许上述四种乱序中的某几种来构成自己的memory model,如在x86中,只允许store load乱序,不允许其他形式的乱序(实际上x86在一些情况下也存在store-store order Does it make any sense to use the LFENCE instruction on x86/x86_64 processors?,lfence没有作用,sfence代表store-store barrier,mfence代表full barrier,sfence+lfence也可以是full barrier)。

3.2 memory barrier

我们可以通过memory barrier指示编译器或者cpu不对指令进行乱序,如两条不相关的load store指令:

load

load-store-barrier

store

由于每种cpu的memory model不同,它提供的memory barrier原句也不同,可能一条指令可以是避免上述一种或者几种乱序的组合。如读屏障一般是load-load barrier 和load-store barrier组合:

  • read barriers             load-load barrier
  • write barriers            store-store barrier
  • acquire barriers        load-load barrier + load-store barrier
  • release barriers        load-store barrier + store-store barrier
  • full barrier                 all 4,so acquire + release  != full

3.3 锁

我们一般使用锁的方式为:

lock

critical section

unlock

那么我们考虑,在乱序执行的条件下,锁是如何避免critical section的语句没有提前到lock之前,也没有滞后unlock执行的呢?

事实上,在memory model种有Acquire和Release语义的概念。

Acquire是说,在Acquire之后的读写指令都不能和Acquire之前的read指令乱序

Release是说,在Release之后的write指令都不能和Release之前的读写指令乱序

这样,如果一个锁的实现保证lock aquire 和unlock release的,那么我们上面提到的乱序执行就不会发生:

那么如何保证呢?使用memory barrier,我们看下图:

即使用load-load barrier和load-store barrier保证Lock Acquire,使用load-store barrier和store-store barrier 保证Unlock Release。

可以看到没有用到store-load barrier,而x86刚好只有store load乱序,因此cpu天然为我们保证了Lock Acquire和Unlock Release。

 

参考

【1】Is Parallel Programming Hard, And, If So, What Can You Do About It?

【2】Memory Barriers Are Like Source Control Operations

【3】Acquire and Release Semantics

【4】并发编程系列之一:锁的意义

 

 

 

 

 

 

 

 

 

 

 

http://www.yayakq.cn/news/686986/

相关文章:

  • 阿里云服务器可以访问国外网站吗河北邢台手机网站建设
  • 推广网站平台免费中国建设网官方网站济宁国泰
  • 网站代码快捷键门户网络是什么
  • 导航网站怎么做复旦学霸张立勇做的网站
  • 如何制作营销网站模板如何建设谷歌网站
  • 如何自己做电影网站大连网络备案做网站
  • 厦门做网站的公司阿里巴巴外贸平台怎么样
  • 网站运营方案 网站建设多用户自助建站系统
  • 企业网站建设效益分析桂林市工程建设项目招标网站
  • 网站做数据监测qq互联网站备案号
  • 哪里有网站设计公司wordpress如何采集
  • 医药网站前置审批黄骅港招聘
  • wordpress如何看主题网站建设优化现状图表
  • 培训公司网站源码wordpress logo在哪里改
  • 网销网站建设流程西城富阳网站建设
  • 华为云速建站做导航网站赚钱
  • 网站做多长时间才会有流量高大上企业网站
  • 福州建设工程协会网站查询系统如何在云主机上搭建wordpress
  • 哪里有免费建设网站做响应式网站
  • 网页设计与网站建设文档品牌学习网站
  • 有教做鱼骨图的网站吗外贸seo关键词
  • 展厅设计素材网站用jsp做的网站在不同浏览器显示效果差异很大如何解决
  • 网站打开空白页黄石商城网站建设
  • 郑州网站顾问百度小程序入口
  • 朱能源做网站做竞价要会做网站吗
  • 英文免费注册网站郑州做网站推广资讯
  • 保定电子商务网站建设一流的扬中网站建设
  • 中国网站为什么要备案嘉兴做网站优化的公司
  • 网站内链wordpress插件网络架构种类
  • 重庆建设建设工程信息网站企业融资的40种方式