从“阿姆达尔定律”角度评价多核的发展趋势_多核时代的阿姆达尔定律-程序员宅基地

  在过去的很多年里,软件性能的提升很大程度上源自处理器速度的增长。软件工程师面对客户抱怨说软件运行得太慢的通常回答是:升级你的系统。
然而现在由于处理器速度逐渐逼近物理极限,继续提高处理器的时钟速度会导致发热量显著增加,甚至核心熔化。江郎才尽的硬件工程师想出了一个能保住自己饭碗的办法:既然不能提高单个核心的速度,那就在一个处理器里面封装多个核心。于是我们进入了多核处理器的时代。
今天,随着多核处理器的发展,计算领域正在发生具有革命性影响的转变。
一、多核处理器的产生
  CPU从诞生之日起,主频就在不断的提高,如今主频之路已经走到了拐点。桌面处理器的主频在2000年达到了1GHz,2001年达到2GHz,2002年达到了3GHz。但是处理器主频的提升速度已经放慢。电压和发热量成为最主要的障碍,导致在桌面处理器特别是笔记本电脑方面,Intel和AMD无法再通过简单提升时钟频率就可设计出下一代的新CPU。
面对主频之路走到尽头,Intel和AMD开始寻找其它方式用以在提升能力的同时保持住或者提升处理器的能效,而最具实际意义的方式是增加CPU内处理核心的数量。
  多核处理器指的是在一个处理器上集成多个运算核心,从而提高计算能力。同时,为充分发挥多核的优势,内存访问、中断处理、总线结构等相关单元也做了大量的修改,多核展现在人们面前的是一个全新的体系架构,在CPU处理、内存访问、IO总线、中端分配机制等方面都有了长足进步,加上多核与生俱来的并行能力正好满足更高性能、更多功能的需求。
  多核处理器最初的开发在很大程度上要归功于CMOS光刻印刷工艺的持续进步。众所周知,随着CPU 核心的尺寸/带宽的不断提升,很快就会造成投资回报的递减。因此,当核心的尺寸工艺收缩到一个小尺度上后,出于成本方面的考虑,芯片制造商通常的选择有如下三种:生产更小的芯片、增加大量缓存、增加更多核心。当然,增加更多内存带宽也是一种方法,但会导致处理器芯片之外的成本也会大幅增加,如修改主板(可能需要更多的PCB层)、增加DIMM插槽等。跟传统的单核CPU相比,多核CPU带来了更强的并行处理能力、更高的计算密度和更低的时钟频率,并大大减少了散热和功耗。目前,在几大主要芯片厂商的产品线中,双核、四核甚至八核CPU已经占据了主要地位。
  通过划分任务,线程应用能够充分利用多个执行内核,并可在特定的时间内执行更多任务。多核处理器是单枚芯片(也称为“硅核”),能够直接插入单一的处理器插槽中,但操作系统会利用所有相关的资源,将它的每个执行内核作为分立的逻辑处理器。通过在两个执行内核之间划分任务,多核处理器可在特定的时钟周期内执行更多任务。多核架构能够使目前的软件更出色地运行,并创建一个促进未来的软件编写更趋完善的架构。
多核处理器本身是单核系统达到物理极限而出现的,但是多核处理器本身也有性能提升的限制因素。这个限制因素又引导着多核技术发展的趋势。充分发掘多核处理器的潜力,提升多核处理器的性能,必须使这个限制因素的影响降到最低。
二、阿姆达尔定律指示的限制因素
  现在犯难的就是软件工程师了:没有了处理器速度不断提升的免费便车,接下来不得不面对的问题就是如何有效地利用处理器里面的多个核,也就是并行计算。
  然而多核面对一个似乎无法回避的难题:阿姆达尔定律(Amdahl's Law)。
阿姆达尔定律告诉我们:系统中某一部件由于采用某种更快的执行方式后整个系统性能的提高与这种执行方式使用频率占总执行时间的比例有关。由于采用特殊的方法所能获得的加速比为:
 
  在多核处理器中加速比是衡量并行程序性能的一个重要参数,定义为Speedup=使用单处理器执行时间/使用多处理器执行时间。根据阿姆达尔定律: 
 
  其中,s是系统中串行执行部分占整个系统的比例,n是多核处理器中核的数目。当s=5%时,8核的加速比为5.93倍,16核的加速比为9.14倍,与理想状态的8倍、16倍有不小的差距。当s=30%时,8核的加速比仅有2.58倍,16核的加速比仅有2.91倍,完全没有发挥多核的优势。更加糟糕的是,实际情况往往比Amdahl定律给出的结果更差。考虑到核间交互带来的额外开销,核间同步影响整个系统的并发处理,设计糟糕的系统在多核下甚至比单核下的性能还要低得多。 
  当n趋近于无穷大时(即假设我们有无穷多个核心),速度提升的上限是 1/s,即速度提升的上限取决于程序不能被并行计算的部分。
这个定律的结果就是,即便我们能够有效地并行计算一个程序的95%,剩下 5%只能串行计算的部分限制了这个程序的运行速度最多能提升1/5%=20倍。而现有的程序中很少能够做到95%以上部分的并行计算。
而且,如果你想在一个并行、线程化的应用中使用不只一个内核,就需要某种通信/同步,而且,对于一个固定的工作负载,通信/同步开销是作业所用 CPU 内核数量的单调递增函数。由此,我们需要对阿姆达尔定律做些简单修改:
 
  其中,T为解决某计算问题所需的总时间,Ts是完成串行工作所需的时间,Tp 是完成所有并行工作所需的时间,N是并行工作中所使用的处理器数量,To是每颗处理器的通信与同步开销。T正是传统阿姆达尔定律公式中所没有的——随着处理器的增多,总开销也会增加。
在没有引入通信/同步开销的传统标准模型中,总时间T就是处理器数N的一个单调递减函数,会逐渐接近于Ts。而在修改后的公式中,我们很清楚地看到,由于存在通信开销,随着处理器数N的增加,在达到某一临界点后,总时间T就会开始增加。因此,对于一个完全并行的应用 (即Ts=0)来说,其所需处理器的最优数量是:
 
  因此,能否有效降低串行执行比例和降低交互开销决定了能否充分发挥多核的性能,其中的关键在于:合理划分任务、减少核间通信。这正是当今多核处理器的发展趋势。
三、多核的发展趋势
根据阿姆达尔定律,我们知道为了提升多核处理器的性能,合理划分任务和减少核间通信是关键点。
  1.合理划分任务
  整个系统任务可以按数据、功能等多个维度划分为若干子任务,分别由不同的核来执行这些子任务。 
数据分解,把不同的数据报文交给不同的核处理。比如,可以按照接收数据报文的接口来划分任务,不同接口的数据报文由不同的核处理,可以避免不同网段的流量竞争处理器资源,也可以用来保障核心业务。另一种可能的方案是按协议类型来区分,由一到多个核处理HTTP协议,其它核处理其它协议。 
  功能分解,把不同的功能交给不同的核处理。比如,其中一个核专门负责加解密报文处理,另一个核专门负责病毒扫描等。 
静态调度,相同的核永远处理相同的任务。静态调度算法不涉及到任务切换,因此系统开销较小,但存在任务分配不公平的情况。 
动态调度,同一个核可能处理不同的任务。采用动态调度算法的系统可以根据每个核的实际负载情况动态分配任务,这样可以最大限度的利用每个核的处理能力。 
  合理的任务分解方案使得不同任务相对独立,既降低了串行执行比例,也减少了核间通信的需求。
2.减少核间通信
  减少核间通信的技术主要包括异步并行、无锁编程等技术。 
异步并行技术与同步并行技术相对应。后者是同步处理的一般模式,指的是一个核执行任务到某个时刻必须与其它核进行数据交换,然后才能继续进行;前者是对同步处理的优化,数据交换不必严格在某个时刻进行,可以集中进行数据交换,从而减少交互的次数和时间。 
无锁编程是减少核间通信的另一个思路,通过精心设计的数据结构,两个核可以完全不进行任务同步,同时又能协同进行工作。
四、多核处理器对软件设计的挑战
  实际上阿姆达尔定律存在的问题是只假定并行系统处理一个固定规模的问题,在这种情况下,再增加处理器当然没有意义。但如果把问题规模随着机器规模一起变大,加速比仍然可以变大。
  多核处理器的出现实际上是一次计算方式的革命。为了顺应多核处理器的性能,增加程序的并行性是提升系统性能的有效手段。我们不得不面对并发和并行操作这些通常是并行计算的专业人员和高端用户才需要面对的问题。
现在才不过几个核,大家还不必太害怕,将来我们可能会面临几百个核,简直是核的海洋,这种情况甚至连搞并行计算的专家都感到害怕和麻烦。一个机器里那么多核,怎么去很好的利用?这肯定是大家首先冒出来的一个问题。本来并行计算就很难了,再放那么多核就更困难了。
其实90年代末就已经有人在做多核处理器的研究,其思路是把功能简单的处理器用网络连接起来,互相协作来解决延迟的问题。比较早的是RAW处理器,由美国MIT大学开发,是我们目前称为Tile结构处理器的先驱。
  现在比较热的一个Tile结构处理器研究项目叫TRIPS,其目标是实现单处理器一个周期达到万亿次操作且可靠、智能自适应的目标。但Trips所采用的体系结构与传统的冯•诺依曼体系有所不同,不是目前流行的指令流驱动,而是数据流驱动(显示数据图执行EDGE),以数据的到达作为指令执行的触发标志,而不是根据用户或编译器预先规定好的指令顺序来执行。该处理器每周期可以调度一个包含128条指令的指令块映射到执行单元的网格上执行,且可以通过多态重组合的功能挖掘包括指令级并行、线程并行和数据并行等多层次的并行,从而适应不同的应用需求。该处理器2006年已经推出原型系统,是目前比较被看好的未来处理器的一个发展方向。
  一般来说,并行程序设计模型主要分两大类,一类是共享存储模型,一类是消息传递模型。共享存储模型主要是采用多线程,其主要程序开发环境是已经成为事实工业标准的OpenMP和早期的Posix Threads,目前主要是商业编译器如Intel等的C++和Fortran编译器提供对该语言的支持,而gcc等开源编译器尚不能支持OpenMP。
  对于多核来说,马上可以用的标准程序设计环境恐怕就是OpenMP了。而虽然可用但对一般用户来说比较困难的是消息传递开发环境包括MPI和PVM(目前以很少使用)等,此类开发环境是开源的,可以免费下载。其中最常用的两个MPI标准实现是MPICH(目前是MPICH2,是MPI 2.0标准的实现,用以取代MPI 1.0版本)和LAM/MPI。其中的LAM/MPI也在从MPI1.0版本向MPI 2.0版本,其下一代软件的名称为Open MPI,已经发布了正式版本。此外,由于现有机器体系结构层次非常复杂,还可以把上面几种并行设计环境和向量并行等混合使用,充分挖掘机器的性能潜力,我们通常称之为混合并行。
  实际上,并行算法的设计目标是挖掘问题求解过程中的并行性,寻求并行算法与并行机器体系结构的最佳匹配和映射,合理组织并行任务,减少额外消息传递和数据移动开销。总体来说,开发一个并行程序可以有三种途径,一个途径是串行程序自动并行化。这条路目前还没走通,大家认为更为实际的目标应该是人机交互的自动并行化。
第二条途径是设计全新的并行程序设计语言。但它有一个致命的缺点就是需要全部改写原来的程序,对用户来说就很痛苦了,成本和风险也很高,且效率没有保证。但是,随着多核的出现,如果面向大众推广并行计算环境的话,就必须有一种新的大众容易接受的程序设计语言,否则很难推广普及。目前国际上正在研究几种新的并行程序设计语言。
第三条途径就是串行语言加并行库或伪注释制导语句的扩展,实际上就是增加一个库或一些新的制导语句来帮助进行消息传递和并行。这正是MPI和OpenMP所采取的途径。目前也是比较容易被接受且性能高的途径。但其程序开发效率很低,难度也比较大。
随着处理器体系结构变得越来越复杂,从语言到机器硬件的鸿沟越来越大了,需要程序设计语言对底层体系结构进行高度抽象,使用户的程序设计变得简单高效,同时又不损失过多性能。编译器就需要做很多工作来弥补这个鸿沟。
实际上并行不是目标,我们并不愿意去并行,而是一种无奈的妥协。并行程序设计不但困难而且容易出错。
我们什么时候能不需要并行呢?当然最好是继续增加处理器的主频,我们看到IBM公司的Power6处理器就突破了4GHz的主频限制,在2007年发布时,其主频达到5GHz,并支持十进制运算(实际上,当计算机将十进制转换成二进制进行计算,然后再将计算结果转换成十进制时,就会出现计算精度问题;但目前十进制计算的速度仍然不及二进制),为继续通过提高主频提升性能打开了突破口;还有一个途径就是出现革命性的新的计算技术如量子计算等。
实际上,当前并行计算的现状是部分程序员可以进行并行编程,且大部分程序是MPI程序,OpenMP有一定比例。服务器程序大部分采用多线程。但大部分普通应用都还是串行的。
当前国际上对新一代并行程序设计语言的研究正日渐升温。其中美国HPCS项目(高生产率计算系统)资助开发的新的高生产率并行编程语言有三种,分别属于三个公司,包括IBM的X10、SUN公司的Fortress和Cray公司的Chapel。这三个语言目前还处在原型开发阶段,大规模推广还需要时间。
此外,还有一类称为分割全局地址空间系统(PGAS)的并行程序设计语言,包括UPC(Unified Parallel C,C语言的扩展)、CAF(Co-Array Fortran,Fortran的扩展)和Titanmin(Java的扩展),目前已经开始在部分实际项目中得到应用,且效果不错。
五、多核处理器的性能优化 
多核性能优化的方法:收集数据分析数据、设计方案、实现方案、测试方案、收集数据……如此循环往复。
多核性能优化是个长期过程,不可能一蹴而就。首先,需要对系统进行全面的分析,弄清楚系统瓶颈到底在哪里:处理器瓶颈,内存瓶颈,还是IO瓶颈。进一步确定是任务划分不合理还是同步处理不合适等,设计相应的方案,再次测试,逐步优化。
应对多核处理器的软件开发,可以有几种解决思路,包括硬件隐藏、自动并行、OpenMP多线程、MPI优化、新并行语言等。一些新的高生产率和支持全局地址空间的并行程序语言已经出现了,而且正在快速发展,对我们应对多核处理器的挑战提供了可能的最终解决途径。
六、总结
    多核处理器思路的出现源自CPU主频和功率等的物理极限。通过阿姆达尔定律可以十分清楚地知道多核处理器的性能受到那些因素的限制,即串行执行比例和交互开销。所以多核处理器的发展趋势是合理划分任务、减少核间通信以及加强程序的并行性。这几个方面都已经有一些成果,但总体上还处于探索之中。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u010233403/article/details/8814412

智能推荐

Java中创建对象的几种方式以及破坏单例模式的验证_java new出来对象不是单例-程序员宅基地

文章浏览阅读119次。java中创建对象的方式大致分为四种吧。分别是1、通过new关键字2、通过反射机制3、通过克隆方式4、通过序列化方式之前学过单例模式的时候了解到,反射,克隆,序列化等方式会破坏单例模式,因为通过这种方式获取到的对象和原来的对象根本不是同一个。下面我们来检测一下。这里仅供测试使用,采用了饿汉式的单例模式,本案例未应用多线程,所以这里写的比较简单Student类import java.io.Serializable;/** * @author: xuzhi * @date: 2020/1_java new出来对象不是单例

配置jndi数据源以及数据库密码加密-程序员宅基地

文章浏览阅读812次。 闲来无事觉得以前用过的一些东西过一段时间会忘记,所以开始想着发博文,第一次发博文,如有问题大家请多多指正。 1,首先在application.xml里面配置数据源12345 <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBea..._jndi 数据源配置密码加密

Datawhale 集成学习 Task06:掌握分类问题的评估及超参数调优_scoredf = list() sc=clf.score(x_test, y_test) scor-程序员宅基地

文章浏览阅读148次。超参数调优,主要有GridSearchCV和RandomizedSearchCV,主要是因为上一个task代码少,我就和之前的写在一起了。回忆一下,Grid和Randomized共用了param_range和param_grid,其他的和回归中的很相近,都是先fit,然后就可以输出best_score_,以及best_params_这一节呢,主要是两个实操练习,一个是https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cance_scoredf = list() sc=clf.score(x_test, y_test) scoredf=scoredf.append(sc)错误

SpringBoot:JMX的基本使用-程序员宅基地

文章浏览阅读2.3k次。1. 声明当前内容主要为学习和使用SpringBoot注册JMX的操作,主要方便管理需要的类当前内容来源:SpringBoot官方文档主要内容为:使用SpringBoot注册JMX中的MBean使用jconsole查看和修改属性基本的pom依赖<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</art

mod_jk(Apache+mod_jk+tomcat)详细配置方法_apache tomcat connectors mod_jk-程序员宅基地

文章浏览阅读1.2k次。首先虽然这个mod_jk已经过时,但还是放出来大家一起学习一下,文章主要分三部分内容:1.第一部分:说明主要配置过程2.第二部分:贴出我的httpd.conf文件3.第三部分:对mod_jk代码讲解(来源百度) 第一部分:配置1. 准备环境:操作系统:windows7httpd-2.2.21-win32-x86-no_ss_apache tomcat connectors mod_jk

如何屏蔽grep命令本身_grep 屏蔽自身-程序员宅基地

文章浏览阅读1.8k次。我们经常会使用grep来过滤一些进程,但是grep的结果中总是包含grep本身命令,如下面所示:node74:~ # ps -ef |grep monitorwatchvms 10356 1 0 09:17 ? 00:00:00 /bin/sh ./monitorwatch.shroot 10974 10810 0 09:18 pts/1_grep 屏蔽自身

随便推点

小白编程-初次体验_体验编程-程序员宅基地

文章浏览阅读328次。初次体验编程工具在开始编程之前必须得有工具,就像“说话”你得用嘴编程需要三个工具:编辑器、编译器、控制台!!!前提:你有个电脑,装有windows系统注意:请不要问为什么叫编辑器、编译器、控制台,小白就叫小白了啊,不需要理由,请暂时务必不求甚解编辑器用于编写程序的软件,把一条条程序指令通过编辑器撰写好保存成文件,供编译器使用编辑器有很多,初期我们选用windows自带的"记事本"为什么用记事本?不需要你了解,等以后你学会编程了,你想怎么选就怎么选,非要理由的话:简单粗暴够不_体验编程

Weblogic基线检查-程序员宅基地

文章浏览阅读1.7k次。账号系统启动账号限制weblogic的启动账号检查方法:ps -ef|grep -i weblogic要求执行账号不可以是root和nobody,否则不符合安全要求账户锁定策略要求账号..._weblogic基线核查

VS2013+qt 编译Cef3 库_cef源码怎么导入vs2012-程序员宅基地

文章浏览阅读4.4k次,点赞2次,收藏6次。Vs2013+qt 编译Cef库1下载cef源码http://opensource.spotify.com/cefbuilds/index.html根据自己的编译版本选择对应的cef源码包2.下载cmakehttp://www.cmake.org/3安装cmake并加入到path路径下(也可直接下载压缩包,不用安装)4使用cmake编译c_cef源码怎么导入vs2012

Java向Excel文件写入数据_java excel 写内容-程序员宅基地

文章浏览阅读1.8k次。Java向Excel文件写入数据_java excel 写内容

阿里云centos7mysql 5.6 的安装步骤记录_centos7 mysql5.6 there is no such grant defined fo-程序员宅基地

文章浏览阅读339次。阿里云centos7操作命令记录阿里云centos7mysql 5.6 的安装步骤记录列出所有被安装的rpm package# rpm -qa | grep mariadb查看是否安装mariadbrpm -qa | grep mariadbrpm -qa | grep mariadb-server查看安装的mysql rpm -qa | g_centos7 mysql5.6 there is no such grant defined for user 'slave1' on host

ie6 offsetWidth/offsetHeight无效-程序员宅基地

文章浏览阅读232次。ie6 offsetWidth/offsetHeight无效可采用手动获取:offsetWidth=parseInt(node.style.width)+parseInt(node.style.paddingLeft)+parseInt(node.style.paddingRight);offsetHeight=parseInt(node.style.height)+parseInt(node.s..._ie6 offsetwidth