有关并行的两个重要定律

本文摘自 葛一鸣 老师的《实战java高并发程序设计》一书。因为觉得写得好就摘下来了

将串行程序改造成并发程序,一般来说可以提高程序的整体性能,但是究竟能提升多少,甚至说究竟是否真的可以提高,还是一个需要研究的问题。目前,主要有两个定律对这个问题进行解答,一个是Amdahl定律,另一个是Gustafson定律。

1.Amdahl定律

Amdahl定律是计算机科学中非常重要的定律。它定义了串行系统并行化后的加速比的计算公式和理论上线

加速比定义:

                    加速比 = 优化前系统耗时 / 优化后系统耗时

所谓加速比就是优化前的耗时与优化后耗时的比值。加速比越高,表明优化效果越明显。图1-1 为Amdahl公式推导过程,其中 n 表示处理器个数,T 表示时间,T1 表示优化前耗时(也就是只有 1 个处理器时的耗时),Tn 表示使用 n 个处理器优化后的耗时。F 是程序中只能串行执行的比例。

图 1-1

根据这个公式,如果 cpu 处理器数量趋于无穷,那么加速比与系统的串行化比例成反比,如果系统中必须有 50% 的代码串行执行,那么系统的最大加速比为 2。

假设有一个程序分为以下步骤执行,每个执行步骤花费 100 个单位时间。其中,只有步骤 2 和步骤 5 可以并行,步骤 1、3、4必须串行,如图1-2 所示。在全串行的情况下,系统合计耗时为500个单位时间。

图 1-2

若将步骤 2和步骤 5并行化,假设在双核处理器上,则有如图 1-3所示的处理流程。在这种情况下,步骤 2和步骤 5的耗时将为 50个单位时间。故系统整体耗时为400个单位时间。根据加速比定义有:

加速比 = 优化前系统耗时 / 优化后系统耗时 = 500 / 400 = 1.25

图 1-3

由于 5个步骤中,3个必须串行,因此串行化比例为 3/5 = 0.6,即 F=0.6,且双核处理器的处理器个数N为2.代入加速比公式得:

加速比 = 1/(0.6+(1-0.6) /2) = 1.25

在极端的情况下,假设并行处理器个数无限大,则如图 1-4所示处理过程。步骤 2和步骤 5的执行实现趋于0。即使这样整体系统耗时依然大于300个单位时间。使用加速比公式,N趋于无穷大,有加速比 = 1 / F,且F = 0.6,故有加速比 = 1.67。即加速比的极限为 500/300 = 1.67

图 1-4

由此可见,为了提高系统的速度,仅增加CPU处理器的数量并不一定能起到有效的作用。需要从根本上修改程序的串行行为,提高系统内可并行化的模块比重,在此基础上,合理增加并行处理器数量,才能以最小的投入,得到最大的加速比。

根据Amdahl 定律,使用多核CPU 对系统进行优化,优化的效果取决于CPU的数量,以及系统中串行化程序的比例。CPU 数量越多,串行化比例越低,则优化效果越好。仅提高CPU 数量而不降低程序的串行化比例,也无法提高系统性能。

2.Gustafson定律

Gustafson 定律也试图说明处理器个数、串行化比例和加速比之间的关系,如图2-1所示,但是Gustafson 定律和Amdahl 定律的角度不同。同样,加速比都被定义为优化前的系统耗时除以优化后的系统耗时。

图2-1 Gustafson推导过程

可以看到,由于切入角度的不同,Gustafson 定律的公式和Amdahl 定律的公式截然不同。

从Gustafson 定律中,我们可以更容易的发现,如果串行化比例很小,并行化比例很大,那么加速比就是处理器的个数。只要不断地累加处理器,就能获得更快的速度。

3.是否相互矛盾

Amdahl 定律和Gustafson 定律的结论不同,这是不是说明这两个理论之间有一个是错误的呢?其实不然,两者的差异其实是因为这两个定律对同一个客观事实从不同的角度去审视的结果,他们的侧重点有所不同。

举一个生活中的例子,一辆汽车行驶在60km的路上,你花了一个小时,行驶了30km。无论接下来开多快,整个路程你都不可能达到90km/h的平均速度。图3-1很好的说明了原因。

图3-1  Amdahl 定律的偏重点

求解图3-1的方程,你会发现如果想要达到90km/h的时速,那么你从AB中点到达B点的时间会是一个负数,这显然不是一个合理的结论。实际上,如果前半程 30km你使用了一小时,那么即使你从中点到B点使用光速,也 只能把整体的平均时速维持在 60km/h。

也就是说Amdahl 强调:当串行化比例一定时,加速比是有上限的,不管你堆叠多少CPU参与计算,都不能突破上限!

而Gustafson定律的出发点与之不同,对Gustafson定律来说,不管你从A点出发的速度有多慢,只要给你足够的时间和距离,只要你后期的速度比期望快那么一点点,你总是可以把平均速度调整到非常接近那个期望值的。比如,你想要达到均速90km/h,即使在前30km 你的时速只有30km/h ,你只要在后面的速度达到91km/h,给你足够的时间和距离,总有一天可以把均速提高到非常接近90km/h。

因此,Gustafson 定律关心的是:如果可被串行化的代码所占比例足够大,那么加速比就能随着CPU的数量线性增长。

所以这两个定律并不矛盾。从极端的角度来说,如果系统中没有可被并行化的代码(即 F=1),那么对于这两个定律,其加速比都是1 。反之,如果系统中可被并行化代码的比例达到100%,那么这两个定律得到的加速比都是n (处理器个数)。

 

 
---------------------
作者:Mr.LiJiaHao
来源:CSDN
原文:https://blog.csdn.net/codeHaoHao/article/details/90286873
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283605.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IT圈中的Bug的类型与历史

美国计算机科学家、图灵奖获得者詹姆斯尼古拉格雷(Jim Gray),在他的著名的论文“Why do computers stop and what can be done about it?”中首次提出了程序bug的类型,比如玻尔bug(Bohrbug)、 海森堡bug(Heisenbugs)等用著名科学家名称命名的bug。后来又…

Windows Nano Server安装配置详解03:远程管理Nano Server

远程管理Nano Server主要是通过使用远程powershell的方式。首先,我们把Nano Server的登录凭据保存到$cred变量之中,如图。其次,把远程Nano Server服务器添加到远程管理机本地的trustedHosts中,否则会报下面的错误,如图…

你和阿里资深架构师之间,差的不仅仅是年龄(进阶必看)

导读:阅读本文需要有足够的时间,笔者会由浅到深带你一步一步了解一个资深架构师所要掌握的各类知识点,你也可以按照文章中所列的知识体系对比自身,对自己进行查漏补缺,觉得本文对你有帮助的话,可以点赞关注…

[luoguP2601] [ZJOI2009]对称的正方形(二维Hash + 二分 || Manacher)

传送门 很蒙蔽,不知道怎么搞。 网上看题解有说可以哈希二分搞,也有的人说用Manacher搞,Manacher是什么鬼?以后再学。 对于这个题,可以从矩阵4个角hash一遍,然后枚举矩阵中的点,再二分半径。 但是…

Semaphore详解

Semaphore基本使用场景 Semaphore的基本使用场景是限制一定数量的线程能够去执行. 举个简单的例子: 一个单向隧道能同时容纳10个小汽车或5个卡车通过(1个卡车等效与2个小汽车), 而隧道入口记录着当前已经在隧道内的汽车等效比重. 比如1个小汽车和1个卡车, 则隧道入口显示3. 若…

PerfView专题 (第六篇):如何洞察 C# 中 GC 的变化

一:背景 在洞察 GC 方面,我觉得市面上没有任何一款工具可以和 PerfView 相提并论,这也是为什么我会在 WinDbg 之外还要学习这么一款工具的原因,这篇我们先简单聊聊 PerfView 到底能洞察 GC 什么东西?二:洞察…

Linux_日志管理介绍(一)

一、介绍1、CentOS 6.x中日志服务已经由rsyslogd取代了原先的syslogd服务,但是rsyslogd是和syslogd服务相兼容的2、除了系统默认的日志之外,采用RPM方式安装的系统服务也会默认把日志记录在/var/log/目录中(源码包安装的服务日志是在源码包指…

如何将exe文件添加到开机启动

1、先创建exe文件的快捷方式 2、打开windows的startup启动目录(针对win10以上) windows有两个以上startup目录,一个是针对所有用户有效的,另外是每个用户下边有一个: 针对当前用户 : C:\Users\{当前用户}\A…

.NET MAUI 跨平台应用程序 (Windows App 和 Android )示例

也就前周,.Net MAUI正式版出来了 ,一个支持跨平台的UI框架,Linux支持情况官网也没说,按理来说应该也是支持的,刚好,我最近也在研究GUI的基本原理,微软出品还是值得深入研究一下的,就先来个样例&…

OpenStack 计算节点删除

前提 计算节点中一个僵尸计算节点存在,而里面的CPU数目在总物理CPU中,导致认为当前能创建实例。而实际没有这么多资源。其中node-11为僵尸节点。 原因 删除计算节点不能直接格式化该服务器,否则在控制节点的数据库上会存在该计算节点的数据。…

PHP 7.2 新功能介绍

PHP 7.2 已經在 2017 年 11 月 30 日 正式發布 。這次發布包含新特性、功能,及優化,以讓我們寫出更好的代碼。在這篇文章裡,我將會介紹一些 PHP 7.2 最有趣的語言特性。 你可以在 Requests For Comments 頁面查看完整的更動清單。 核心改进 参…

如何打造单文件 Blazor Server 应用

前言上次&#xff0c;我们介绍了《如何打造单文件前后端集成 ASP.NET Core 应用》。但是&#xff0c;网友说&#xff0c;对于 Blazor Server 项目此方法无效。于是&#xff0c;我们测试了一下&#xff1a;BlazorApp1.csproj<Project Sdk"Microsoft.NET.Sdk.Web"&g…

Android线程池详解

引入线程池的好处 1&#xff09;提升性能。创建和消耗对象费时费CPU资源 2&#xff09;防止内存过度消耗。控制活动线程的数量&#xff0c;防止并发线程过多。 我们来看一下线程池的简单的构造 [html] view plaincopy print?public ThreadPoolExecutor(int corePoolSize, …

win11下vscode 自动升级失败 There was an error while marking a file for deletion

当升级vscode时出现下方报错&#xff1a; There was an error while marking a file for deletion:Failed to mark file for deletion:拒绝访问.Please verify there are no Visual Studio Code processes still executing既然是“拒绝访问”应该是权限问题&#xff0c;关闭vsc…

盘点大厂的那些开源项目 - 哔哩哔哩

哔哩哔哩现为中国年轻世代高度聚集的文化社区和视频平台&#xff0c;被粉丝们亲切地称为“B站”。overlord分类&#xff1a;缓存服务解决方案开发语言&#xff1a;GOOverlord是哔哩哔哩基于Go语言编写的memcache和redis&cluster的代理及集群管理功能&#xff0c;致力于提供…

单元测试,到底什么是单元测试,为什么单测这么难写

很多小伙伴想知道单测到底该怎么写&#xff0c;于是&#xff0c;文章就来了&#xff01; 话不多说&#xff0c;发车&#xff01; 来源于yes的练级攻略 &#xff0c;作者是Yes呀 到底什么是单元测试 这个问题看似非常简单&#xff0c;单元测试嘛&#xff0c;不就是咱们开发自己…

Linux 学习和教训

今天在学习Linux的时候&#xff0c;突然脑抽风&#xff0c;在根目录下执行了这样一条命令rm -rf *当时就觉得空气凝固了。。。那时也没有想到可以用数据恢复软件恢复。直接就重启了。重启之后发现&#xff0c;就去就直接是grub>晕菜。。突然间想到可以时候救援模式&#xff…

WinForm(八)窗体,窗体

我们在控件那篇文章里说过&#xff0c;窗体和控件都是一个类&#xff0c;项目中一个个窗体&#xff0c;都是Form类的子类。关于这个类有几个重要的成员&#xff0c;也是最常用成员&#xff0c;以供初学者了解&#xff1a;Load事件&#xff1a;发生在构造函数后&#xff0c;Show…

java8

实验总结 没问题 代码托管 https://git.oschina.net/shuoge/java8 转载于:https://www.cnblogs.com/haha-23333/p/6875325.html

抓包工具fiddler和wireshark对比

了解过网络安全技术的人都知道一个名词“抓包”。那对于局外人&#xff0c;一定会问什么是抓包&#xff1f;考虑到&#xff0c;大家的技术水平不一&#xff0c;我尽可能用非专业的口吻简单的说一下。 抓包就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作&am…