并发编程下的性能定律(翻译)

理解Amdahl定律

如果你想利用多核的优势在尽可能少的时间运行尽可能多的指令,那么就需要以并行的序列分离代码。然而,大多的算法需要运行一些串行代码来调整并行执行。例如,并行执行很多代码块,最后收集他们执行的结果。那些分解并行执行工作复杂和收集执行结果的代码是串行代码,它是不能利用并行的优势的。如果你的算法中有很多这样的代码片段,那么串行代码所占的比例就会增加,并且能够获取到的性能收益就会减少。

Gene Amdahl是一个著名计算机架构师,当一个系统中仅有少量的计算机改善硬件的时候,那么能够获得最大的性能改善是多少呢?他做了大量与这方面有关的观察研究。他使用这些观察结果定义了Amdable’s Law,它是由一个预测使用多核处理器在理论上可以获得最大性能改善的公式组成。它也使用于那些运行在多核处理器上的并发算法。

Maximum speedup(in times) = 1/((1-p) + p/n)

在这个公式中

P就是代码中可以完全并行执行的部分。

n就是可用的执行单元的数目(处理器或者物理核心)。

根据这个公式,如果你有一个仅有50%(P = 0.5)的工作需要并行执行的算法,那么在双核微处理器可以获得的最大速度是1.33倍。图1-8阐述了一个拥有1000个工作单元的算法分解成500个串行工作的单元和500个并行工作的单元。如果串行算法的执行完成需要1000秒,那么这个有部分并行代码的新版本的执行时间不会少于750秒。

Maximum speedup (in times) = 1 / ((1 - 0.50) + (0.50 / 2)) = 1.33x

图 1-8

同样的算法在八核微处理器上最大速度也不会超过1.77倍。因此,这些物理核心将使执行代码的时间不会少于562.5秒。

Maximum speedup (in times) = 1 / ((1 - 0.50) + (0.50 / 8)) = 1.77x

图 1-9 展示了同一算法在拥有不同数目(1-16)物理核心的微处理器上的最大速度。正如你所看到的,执行的速度并不是一条直线,随着内核数目的增多会浪费一些处理能力。图1-10展示了执行一个有90%代码可以并行执行的相同算法的相同信息。事实上,90%的并行是一个大的优势,但是带有16个核心的微处理器仅仅提速6.4倍。

Maximum speedup (in times) = 1 / ((1 - 0.90) + (0.90 / 16)) = 6.40x

图 1-9

图 1-10

Amdabl定律考虑了物理核心数量的改变,但是并没有考虑到你可以向现有应用程序添加潜在的新特性来利用额外的并发处理能力。例如,当你在多余三个核心的处理器上运行其他并不能大大改善性能的算法,你可以创建新的算法利用这些额外的内核。你可以创建考虑了不同并发场景的设计来减少Amdabl定律的影响。程序也必须考虑进像硬件所提供的的新的能力。

考虑Gustafson定律

John Gustafson注意到amdahl定律将算法视为固定不变的,但是考虑了运行他们的硬件。因此,他在1988年对这个定律进行了重新的定义。他认为速度的测量应该以相对处理器的数目的问题的规模计算,而不是任务问题是固定的大小。当硬件提供的并发处理能力增强时,问题的负载就会缩小变化。

Gustafson定律提供了一下的公式,它关注问题的大小来测量可以在固定时间内完成的工作单元的数目:

Total work (in units) = S + (N × P)

S代表串行顺序执行的工作单元。

P代表可以完全并行执行的工作单元的数目。

N代表可用的处理器或者物理核心的数目。

你可以想象一个问题是有50个串行执行的工作单元组成。这个工作也可以调度每个可用核心并行执行50个工作单元。如果你有一个双核的处理器,最大的工作单元的数目将是150个单元。

Total work (in units) = 50 + (2 × 50) = 150 units of work

图1-11阐释了一个拥有50个串行执行工作单元的算法和一个并行执行部分。并行部分的测量是根据物理核心的数目计算的。以这种方式,并行部分能够处理并发的50个工作单元。并行部分的负载会随着可用核心的数目增加。如果并行部分能够提供额外的工作单元,这种算法就能够在尽可能少的时间里产生更多的数据。相同的算法可以运行在一个带有八个物理核心的微处理器上。在这种场景中,那么使用与前边例子相同的时间能够处理450个工作单元。

Total work (in units) = 50 + (8 × 50) = 450 units of work

图 1-11

图1-12展示了同一个算法的速度随着物理核心(1-16)的数目的变化。这个速度是在增加核心数目的时候提供了足够的并行执行的工作单元的。你可以看到,这个速度要不运用amdahl定律的结果要好的多。图1-13展示了根据可用的物理核心的数目(1-32)需要的工作单元的总数。

图1-14展示了很多算法组成了串行执行和并发执行部分的一些工作单元。并行部分已可用内核的增加作为标准计量。当并行部分执行更多工作单元时,此时串行执行部分的影响也会减小。在这种情况下,有必要计算并行和串行执行的总单元数目,然后将他们应用到给定的公式来计算在八核处理器中所有的工作任务。

Total sequential work (in units) = 25 + 150 + 100 + 150 = 425 units of work

Total parallel unit of work (in units) = 50 + 200 + 300 = 550 units of work

Total work (in units) = 425 + (8 × 550) = 4,825 units of work

图 1-12

图 1-13

图 1-14

转载于:https://www.cnblogs.com/wufengtinghai/archive/2012/06/04/2533551.html

并发编程下的性能定律(翻译)相关推荐

  1. 伪共享,并发编程无声的性能杀手

    伪共享,并发编程无声的性能杀手 在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能 ...

  2. java支付宝支付_Java 高并发环境下的性能优化,揭秘支付宝技术内幕

    前言 高并发经常会发生在有大活跃用户量,用户高聚集的业务场景中,如:秒杀活动,定时领取红包等. 为了让业务可以流畅的运行并且给用户一个好的交互体验,我们需要根据业务场景预估达到的并发量等因素,来设计适 ...

  3. 伪共享(false sharing),并发编程无声的性能杀手

    在并发编程过程中,我们大部分的焦点都放在如何控制共享变量的访问控制上(代码层面),但是很少人会关注系统硬件及 JVM 底层相关的影响因素.前段时间学习了一个牛X的高性能异步处理框架 Disruptor ...

  4. python和java对比并发_Python并发编程之从性能角度来初探并发编程(一)

    本文目录并发编程的基本概念 单线程VS多线程VS多进程 性能对比成果总结 前言 作为进阶系列的一个分支「并发编程」,我觉得这是每个程序员都应该会的. 并发编程 这个系列,我准备了将近一个星期,从知识点 ...

  5. 伪共享问题-并发编程无声的性能杀手

    本文以LongAdder源码为例进行说明.关于原子累加器的论述可以参考文章:原子累加器LongAdder与AtomicLong 1.LongAdder部分源码 2.多核机器的存储结构 CPU为了提升性 ...

  6. Day18 2021.4.2 JUC并发编程-下

    Day 18 2021.4.2 JUC编程 线程池 线程池:三大方法.7大参数.4种拒绝策略 池化技术 程序的运行,本质:占用系统的资源! 优化资源的使用!=>池化技术 线程池.连接池.内存池. ...

  7. 【Java 并发编程】我们为什么要学并发编程?

    我们为什么要学并发编程? 1. 为什么要并发编程? 1.1 面试需要 1.2 性能调优 (1)加快响应时间 (2)代码模块化.异步化 (3)充分利用 CPU 的资源 2. 并发编程的基础概念 2.1 ...

  8. JAVA并发编程-计算程序性能提升比率

    并发编程的用途: 并发编程用途通常用于图像处理,服务端编程需要处理大量数据的情况下使用,其他领域下,并发编程对程序性能的提升几乎没有. 在开始计算之前,先了解一下基本的概念. 并发是在同一CPU下同时 ...

  9. 高并发环境下如何优化Tomcat性能?看完我懂了!

    来自:冰河技术 写在前面 Tomcat作为最常用的Java Web服务器,随着并发量越来越高,Tomcat的性能会急剧下降,那有没有什么方法来优化Tomcat在高并发环境下的性能呢? Tomcat运行 ...

最新文章

  1. [原创] 为什么模除的时候一般建议选择素数来除?比如说hashtable的桶数会取一个素数...
  2. oracle idcs,Oracle Spatial函数SDO_CS.Transform(value)结果非常慢
  3. HarmonyOS之bytrace命令的使用
  4. 《openssl 编程》之大数
  5. 常用php时间戳格式化与转换
  6. 解题报告:51nod 加农炮
  7. java1.7开发环境_在Windows平台搭建Java 1.7开发环境
  8. Django中ORM模型总结(二)[抽象模型类,模型类的对应关系,模型类的属性,字段类型]...
  9. Elasticsearch学习--elasticsearch介绍与安装
  10. Mobileye技术与市场走势
  11. Unity 与 UE4 双引擎版本四叉树的创建与可视化
  12. C# NPOI 导出Excel 小数位数控制
  13. C++面向对象之类complex详解
  14. UDP 头部结构及协议特点
  15. yii2 aliases web.php,Yii2的深入学习--别名(Aliases),yii2aliases
  16. c语言是学电脑吗,c语言入门至精通这些天一直有人问我,c语言好学吗?我是个新手...
  17. 大规模手机定位采集系统设计
  18. unable to load dll 'gdiplus.dll' in docker
  19. 信息系统项目管理师考试是自学好还是找培训好?
  20. 什么是HSS?HSS有什么主要功能?HSS与HLR的区别是什么

热门文章

  1. eclipse 自动生成代码
  2. Web服务器指纹识别工具httprint
  3. SSH服务审计工具ssh-audit
  4. Xamarin iOS教程之申请付费开发者账号下载证书
  5. python 回归 显著_指南 | 量化选股with Python(2) 回归分析
  6. python加颜色_Python 给屏幕打印信息加上颜色的实现方法
  7. linux nacos启动_nacos初体验-踩坑与填坑篇
  8. python中break可以用在for和if中吗_Python的for和break循环结构中使用else语句的技巧...
  9. mysql建表影响效率_MySQL建表查询优化技巧
  10. Nilearn教程系列(4)-脑部地图集绘制