返回介绍

1.4 有关并行的两个重要定律

发布于 2024-08-21 22:20:21 字数 3417 浏览 0 评论 0 收藏 0

有关为什么要使用并行程序的问题在之前已经进行了简单的探讨。总的来说,最重要的应该是出于两个目的。第一,为了获得更好的性能;第二,由于业务模型的需要,确实需要多个执行实体。在这里,我将更加关注于第一种情况,也就是有关性能的问题。将串行程序改造为并发,一般来说可以提供程序的整体性能,但是究竟能提高多少,甚至说究竟是否真的可以提高,还是一个需要研究的问题。目前,主要有两个定律对这个问题进行解答,一个是Amdahl定律,另外一个是Gustafson定律。

1.4.1 Amdahl定律

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

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

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

图1.8 Amdahl公式的推导

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

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

图1.9 串行工作流程

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

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

图1.10 双核处理上的并行化

或者根据前文中给出的加速比公式。由于5个步骤中,3个步骤必须串行,因此其串行化比重为3/5=0.6,即F=0.6,且双核处理器的处理器个数N为2。代入公式得:

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

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

图1.11 极端情况下的并行化

使用加速比计算公式,N趋于无穷大,有加速比=1/F,且F=0.6,故有加速比=1.67。

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

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

1.4.2 Gustafson定律

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

图1.12 Gustafson定律的推导

可以看到,由于切入角度的不同,Gustafson定律的公式和Amdahl定律的公式截然不同。从Gustafson定律中,我们可以更容易地发现,如果串行化比例很小,并行化比例很大,那么加速比就是处理器的个数。只要你不断地累加处理器,就能获得更快的速度。

1.4.3 Amdahl定律和Gustafson定律是否相互矛盾

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

举一个生活的例子,一辆汽车行驶在相聚60公里的城市。你花了一个小时,行驶了30公里。无论接下来开多快,你都不可能达到90公里/小时的时速。图1.13很好地说明了原因。

图1.13 Amdahl定律的偏重点

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

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

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

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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文