并发编程下的性能定律(翻译)
理解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
分享到:
相关推荐
高并发编程第三阶段12讲 sun.misc.Unsafe介绍以及几种Counter方案性能对比.mp4 高并发编程第三阶段13讲 一个JNI程序的编写,通过Java去调用C,C++程序.mp4 高并发编程第三阶段14讲 Unsafe中的方法使用,一半是...
Java高并发编程,构建并发编程知识体系,提升面试成功率,完整版17章视频教程下载。 本课程将结合大量图示及代码演示,带你掌握多线程并发编程(线程安全,线程调度,线程封闭,同步容器等)与高并发处理思路与手段...
java并发编程pdf文档第二部分:Java并发编程实战.pdf、Java多线程编程核心技术.pdf、实战Java高并发程序设计.pdf
JAVA并发编程实践中文版 英文版 原书源码 带书签 java_concurrency_in_practice.pdf 英文版还是不错的,但是中文版的译者典型的没有技术功底,介绍上说什么专家, 翻译的非常差劲,有些句子都不通顺,都不知道自己去...
java并发编程艺术java并发编程艺术java并发编程艺术java并发编程艺术java并发编程艺术
java并发编程实战源码 附有本书所有源码,maven 导入 eclipse或idea
JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。
《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...
阿里专家级并发编程架构师级课程,完成课程的学习可以帮助同学们解决非常多的JAVA并发编程疑难杂症,极大的提高JAVA并发编程的效率。课程内容包括了JAVA手写线程池,UC线程池API详解,线程安全根因详解,锁与原子类...
Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程Java后端开发,JUC并发编程...
并发编程并发编程并发编程
并发编程领域的扛鼎之作,作者是阿里和1号店的资深Java技术专家,对并发编程有非常深入的研究,《Java并发编程的艺术》是他们多年一线开发经验的结晶。本书的部分内容在出版早期发表在Java并发编程网和InfoQ等技术...
高并发和并发编程并发编程:线程安全+线程封闭+线程调度
深入讲解java并发编程技术,多线程、锁以及java内存模型等
《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...
java 并发编程的艺术pdf清晰完整版 源码
1.1 并发简史 1.2 线程的优势 1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性问题 1.3.3 ...
全书分为几大部分:首先介绍几种并发编程技术,包括异步编程、并行编程、TPL数据流、响应式编程;然后阐述一些重要的知识点,包括测试技巧、互操作、取消并发、函数式编程与OOP、同步、调度;最后介绍了几个实用技巧...
JAVA并发编程(阿里巴巴培训资料) Java 并发编程培训(阿里巴巴) ppt 文档。