并发编程下的性能定律(翻译)
理解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