原标题:计算机的极限与并行计算

在摩尔定律还适用的时候(包括现在), 提高芯片的性能有如下两种方法: 1.在有限面积内加入更多的场效应管, 或者提高时钟。但是这两种办法都会带来功耗的极速增大。

由于功耗的非线性增长,很多芯片厂商被迫开发多核芯片,通过多核来解决单核的时钟频率增加所带来的功耗问题。但是此种方案忽略了一个很重要的问题。要讲清楚这个问题,我们先来讲个故事。

从前有个地主,雇了一个长工耕田。这个长工非常能吃苦,随着时间的推移,技术也越来越好,耕田也越来越快。但有一天这个劳工达到了体能极限,不能更快了。于是地主就琢磨着他这块田怎么能再快点耕完。终于有一天地主下了个血本从市场上又买了另外三个技能相当的长工扔到了田里,并满心希望之前一天能耕完的地现在六个小时就能搞定。于是地主六个小时之后去地里一看,瞬间后悔了。因为刚买来的三个长工也不知道自己该做什么,就坐在边上看着原先的那位苦逼工作。

讲到这里,可能有的读者已经发现了多核处理的问题。就是在此之前的绝大多数程序都是按照串行算法开发的,而这些程序还不能很好地在多核芯片上并行执行。因此在大部分时间里,很多核都是空闲着的。

于是学术界和工业开始了又一波对并行化的研究。他们一部分人希望通过设计新的编程语言,让程序员人工提高程序的并行度。另一部分人则希望通过对编译器的优化,让编译器自动识别程序中可并行的部分并生成可并行的二进制码。然而双方的成效都非常有限。可并行的编程语言需要程序员有并行的编程思想,然而这多多少少有违人类本身的逻辑思维方式。同时,并行语言为程序调试带来了很大的挑战。使得大规模的并行程序开发变得相当困难。与此同时,编译器能在程序中找到的可并行部分也相当有限,这也使得自动并行化的效率非常之低。

这么看来多核芯片真的是一个好的决定吗?程序的并行极限又在哪里呢?要解释这个问题,我们便不得不提到计算机科学界的另一个经验法则——阿姆达尔定律。

阿姆达尔定律于1967年由IBM360系列机的主要设计者吉因恩·阿姆达尔(Gene Amdahl)首先提出。它代表了处理器并行运算之后效率提升的能力。该定律首先将一个程序分成了可并行和不可并行两部分,并指出程序中对某一部份进行并行后所能获得的系统性能改进程度,取决于并行部分被使用的频率,或所占总执行时间的比例。换句话说,在并行计算中用多核处理器对单个程序的加速受限于该程序所需的串行时间百分比。比如一个程序中如果有一半是不能被并行的,那么即便是有无限核数的处理器,该程序能得到的最大加速比也只是两倍。

阿姆达尔定律给出了下面这一个核心公式,speedup=1/(s+(1-s)/n)。该公式计算了一个程序并行化之后所能带来的最大加速比。其中s 为程序串行部分(或不可并行部分)所占比例;1-s 则为程序可并行部分所占比例;n为并行处理节点的个数,可以大致理解为处理器的核数。所以如果一整个程序都是可并行的(s = 0),那么能得到的加速比上限就是n。相反如果一整个程序都是不可并行的(s = 1),那么加速比上限就是1。阿姆达尔定律通过该公式指出了多核的有效利用率和程序的可并行部分所占的百分比是密切相关的。这就像如果地主家的田地是很窄很长的,一次只能通过一个人的,那么就算买来再多的长工也无济于事。

阿姆达尔定律的结论给并行化研究的领域蒙上了一层沮丧的阴影,使得该领域像是一个一眼就能看到天花板的研究。而在阿姆达尔定律中,作者使用了两个设定作为前提。正是这两个设定让我们在1988年看到了对并行化研究不一样的前景。

阿姆达尔定律的第一个假设是固定负载(即计算总量不变)的量化标准。也就是说它没有考虑到硬件发展带动下的软件更新。举个简单的例子,上世纪90年代的时候我们用英特尔奔腾处理器跑 Windows95 的操作系统,而到了如今我们有了i9处理器的同时我相信没谁的电脑里还装着 Windows95 了。换句话说,长工的技能增加的同时,地主的田地也在扩张嘛。到了上世纪80年代,Sandia 国家实验室的科学家们在使用1024个处理器时观察到了3个实际应用程序随着处理器的增加发生线性加速的现象。于是在阿姆达定律的基础上,另一个定律由此诞生——古斯塔夫森定律。

古斯塔夫森指出,阿姆达尔定律的问题出在它的前提过于理想化。硬件性能的提升会直接导致软件规模及复杂度提升。即使算法仍然存在着串行部分,但由于程序规模的不断扩大,算法中串行部分所占比例往往会持续减少。至此,他给出了另外一个公式:Speedup= s +(1-s)n,其中s 是给定任务中不可并行的时间占实际执行时间的百分比,n 代表并行计算节点个数。并指出在许多实际的应用程序中,因处理器核数的持续增加而得到接近线性的加速效果是可能的。

同古斯塔夫森定律一样,阿姆达尔定律的另一个设定是假设程序中可并行的部分在实际情况中可以完全被并行。这种设定作为一个纯数学模型忽略了可并行化在执行的时候所带来的开销。于是,大卫.费舍尔(David. Fisher)于1988年发表论文并提出这样一个理论。如果一个输入大小为n 的程序在串行时需要 T(n) 个步骤来完成,那么该程序被 d 个计算节点(可粗略看作处理器核数)并行之后所需的执行步骤数会以T(n) 的 d+1 次方根增加。这个结论将逻辑门以及铜线连接的延迟考虑进去,打破了古斯塔夫定律中线性加速效果的可能,并将可并行化的加速上限设在了一个更低却更现实的高度。同时,在铜线延迟开始超过逻辑门延迟的如今,信号已然无法在一个时钟周期内被传达到芯片的所有地方。这也同样在并行处理的过程中加入了串行依赖。

科学家们试图以各种新科技突破现有的物理极限不同,在并行化领域里我们现在所能达到的离阿姆达尔提出的极限还很远。当然研究领域里也不乏试图再次突破现有体系所带来的物理极限的尝试。其中最大的项目要数对量子计算机的研究。从底层电路到计算机体系结构,再到上层的算法设计,学术界和工业界都投入了大量的精力进行研究。然而,虽然对于某些应用, 量子计算机确实在理论上会优于传统计算机,但现阶段量子计算机的整个容错系统会带来巨大的开销,从而大大的抵消了其在理论上能够带来的优势。加之量子计算机从本质上来讲也是一个图灵机,其程序本身的复杂程度使得即便是量子计算机也很难超越费舍尔所提出的并行化加速上限。

虽然从阿姆达尔定律提出之后,并行化研究屡遭质疑,多核技术的出现与流行对计算机体系结构,算法及程序设计都带来了重要的影响和挑战。但是多核技术的发展,大大突破了单核运算的极限

责任编辑:

如何用计算机求极限,计算机的极限与并行计算相关推荐

  1. 怎么用计算机求逆矩阵,计算机是怎么求解线性方程的(矩阵乘和求逆)

    上回我们说到,高斯老哥用消元法解线性方程,大致步骤呢就是给系数矩阵消元,运气好点呢直接整出上三角系数矩阵,得到方程组的唯一解,运气不行呢,消着消着发现整不出上三角,这时就得再讨论方程是有多解还是无解. ...

  2. 如何用计算机求锐角三角比,9.3用计算器求锐角三角比教学案

    侨润中学教学案八年级数学学科 第 6 周第 4 节总29 课时主备人唐云玲授课人上课时间2012年3月22 日课题9.3用计算器求锐角三角比(1)课型 教学目标1.学会用计算器求任意角的三角函数值. ...

  3. 怎样使用计算机求一个数的立方根,计算机求数立方根的数学教案

    计算机求数立方根的数学教案 一,教学目标 1.会用计算器求数的立方根. 2.通过用计算器求立方根,培养学生的类比思想,提高运算能力: 3.利用计算器求立方根,使学生进一步领会数学的转化思想: 4.通过 ...

  4. 利用计算机求该货车,汽车理论习题 - 图文

    第 1 章 汽ft动力性 计算中假定纵向加速度为 0,忽略滚动阻力,并假设船已经脱离水面,因此 没有浮力的作用, sin ? ? ? , cos? ? 1,L= b+c(旅行车轴距):Lt=e+f(拖 ...

  5. 用计算机求正有理数算术平方根的步骤,用计算器求算数平方根、用有理数估计算数平方根的大小.ppt...

    用计算器求算数平方根.用有理数估计算数平方根的大小.ppt 上传人:jw****88 文档编号:85573818 上传时间:2020-06-11 格式:PPT 页数:20 大小:2.14MB 下载提示 ...

  6. 如何用计算机名称获取计算机ip

    标题:如何用计算机名称获取计算机ip 链接:https://www.cnblogs.com/zouhao/p/6422369.html

  7. 用matlab求函数极限,matlab求解极限问题(limit函数的用法)

    本文介绍利用MATLAB求解函数或序列的极限问题,顺便介绍limit函数的用法.内容主要包括单变量函数的极限和多变量函数的极限. 目录 单变量函数的极限 极限的定义 普通极限 L=lim⁡x→x0f( ...

  8. 用计算机求函数公式,计算机函数

    计算机的函数,是一个固定的一个程序段,或称其为一个子程序,它在可以实现固定运算功能的同时,还带有一个入口和一个出口,所谓的入口,就是函数所带的各个参数,我们可以通过这个入口,把函数的参数值代入子程序, ...

  9. 利用计算机求该货车,吉林大学汽车理论第二次作业[7页].doc

    吉林大学汽车理论第二次作业[7页].doc 汽车理论第二次作业 2.7. 图 2-1 是某轻型货车汽油发动机的负荷特性与万有特性,货车的其他参数与题1.3相同.负荷特性曲线的拟合公式为式中,b为燃油消 ...

  10. 前缀表达式的计算机求值

    前缀表达式的计算机求值特点 引例:某表达式的前缀形式为"+ -*^ABCD/E/F+GH",那么它的中缀形式为? 前缀表达式的操作 前缀表达式是一种没有括号的算术表达式,就是前序表 ...

最新文章

  1. 【不断更新】2018杭州云栖大会!视频美图赏析
  2. oracle中substr() instr() 用法
  3. python输出进度条 tqdm_python-tqdm进度条
  4. mysql_fetch_array 失败_mysql_fetch_array错误
  5. 怎么样用计算机才能让电量增多,如何让你的笔记本更省电 这几招你学会能管大用...
  6. websphere 启动出错 检查节点 上服务器的日志_启动Redis Sentinel哨兵
  7. 「代码随想录」494. 目标和【动态规划】力扣详解!
  8. 水晶报表中图片不显示解决方案
  9. 程序员面试金典--变位词排序
  10. ecshop中$user对象
  11. Chrome中播放时视频编码为.h264和音频编码为acc,采样率为48000,双通道的视频文件时音画不同步
  12. php解析krc文件,将酷狗krc歌词解析并转换为lrc歌词php源码_PHP
  13. Win10问题篇:解决电脑插入耳机没声音。
  14. 计算机科学技术专业发展分析,计算机科学与技术发展现况分析
  15. asp.net 获取网页源文件的方法
  16. 视频播放可弹出弹幕,关闭弹幕
  17. 1024 致敬程序员
  18. 文件夹选择对话框 JS实现的两种方案
  19. 微信js 大转盘抽奖
  20. 计算机链接投影蓝屏,日立投影仪蓝屏原因及解决方法

热门文章

  1. 静态代理和动态代理是什么?
  2. win10中关于用粘滞键留下后门
  3. 单字双字三字_有深厚寓意的单字名及双字名,最适合给宝宝起名了
  4. linux的yum命令无法使用在哪里下载_下载:微软正式发布Win10 2004版并即日起开始推送...
  5. 手把手教你快速搞定4个职场写作场景
  6. Python爬取58同城广州房源+可视化分析
  7. 知识图谱---地理信息数据集
  8. wow stsm 宏
  9. 如何用计算机打出下划线,怎么在电脑上打出下划线
  10. 我的JAVA学习第一周知识总结,个人感受小结