溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

java高并發(fā)系列 - 第3天:有關(guān)并行的兩個重要定律

發(fā)布時間:2020-07-30 05:04:31 來源:網(wǎng)絡(luò) 閱讀:226 作者:路人甲Java 欄目:編程語言

有關(guān)為什么要使用并行程序的問題前面已經(jīng)進行了簡單的探討。總的來說,最重要的應(yīng)該是處于兩個目的。

第一,為了獲得更好的性能;

第二,由于業(yè)務(wù)模型的需要,確實需要多個執(zhí)行實體。

在這里,我將更加關(guān)注第一種情況,也就是有關(guān)性能的問題。將串行程序改造為并發(fā)程序,一般來說可以提高程序的整體性能,但是究竟能提高多少,甚至說究竟是否真的可以提高,還是一個需要研究的問題。目前,主要有兩個定律對這個問題進行解答,一個是Amdahl定律,另外一個是Gustafson定律。

Amdahl(阿姆達爾)定律

Amdahl定律是計算機科學中非常重要的定律。它定義了串行系統(tǒng)并行化后的加速比的計算公式和理論上線。

加速比定義:加速比 = 優(yōu)化前系統(tǒng)耗時 / 優(yōu)化后系統(tǒng)耗時

所謂加速比就是優(yōu)化前耗時與優(yōu)化后耗時的比值。加速比越高,表明優(yōu)化效果越明顯。圖1.8顯示了Amdahl公式的推到過程,其中n表示處理器個數(shù),T表示時間,T1表示優(yōu)化前耗時(也就是只有1個處理器時的耗時),Tn表示使用n個處理器優(yōu)化后的耗時。F是程序中只能串行執(zhí)行的比例。

java高并發(fā)系列 - 第3天:有關(guān)并行的兩個重要定律

根據(jù)這個公式,如果CPU處理器數(shù)量趨于無窮,那么加速比與系統(tǒng)的串行化比例成反比,如果系統(tǒng)中必須有50%的代碼串行執(zhí)行,那么系統(tǒng)的最大加速比為2。

假設(shè)有一個程序分為以下步驟執(zhí)行,每個執(zhí)行步驟花費100個單位時間。其中,只有步驟2和步驟5可以并行,步驟1、3、4必須串行,如圖1.9所示。在全串行的情況下,系統(tǒng)合計耗時為500個單位時間。

java高并發(fā)系列 - 第3天:有關(guān)并行的兩個重要定律

若步驟2和步驟5并行化,假設(shè)在雙核處理器上,則有如圖1.10所示的處理流程。在這種情況下,步驟2和步驟5的耗時將為50個單位時間。故系統(tǒng)整體耗時為400個單位時間。根據(jù)加速比的定義有:

加速比 = 優(yōu)化前系統(tǒng)耗時 / 優(yōu)化后系統(tǒng)耗時 = 500/400 = 1.25

java高并發(fā)系列 - 第3天:有關(guān)并行的兩個重要定律

由于5個步驟中,3個步驟必須串行,因此其串行化比例為3/5=0.6,即 F = 0.6,且雙核處理器的處理器個數(shù)N為2。代入加速比公式得:

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

在極端情況下,假設(shè)并行處理器個數(shù)為無窮大,則有如圖1.11所示的處理過程。步驟2和步驟5的處理時間趨于0。即使這樣,系統(tǒng)整體耗時依然大于300個單位時間。使用加速比計算公式,N趨于無窮大,有加速比 = 1/F,且F=0.6,故有加速比=1.67。即加速比的極限為500/300=1.67。

由此可見,為了提高系統(tǒng)的速度,僅增加CPU處理的數(shù)量并不一定能起到有效的作用。需要從根本上修改程序的串行行為,提高系統(tǒng)內(nèi)可并行化的模塊比重,在此基礎(chǔ)上,合理增加并行處理器數(shù)量,才能以最小的投入,得到最大的加速比。

java高并發(fā)系列 - 第3天:有關(guān)并行的兩個重要定律

注意:根據(jù)Amdahl定律,使用多核CPU對系統(tǒng)進行優(yōu)化,優(yōu)化的效果取決于CPU的數(shù)量,以及系統(tǒng)中串行化程序的比例。CPU數(shù)量越多,串行化比例越低,則優(yōu)化效果越好。僅提高CPU數(shù)量而不降低程序的串行化比例,也無法提高系統(tǒng)的性能。

阿姆達爾定律圖示

為了更好地理解阿姆達爾定律,我會嘗試演示這個定定律是如何誕生的。

首先,一個程序可以被分割為兩部分,一部分為不可并行部分B,一部分為可并行部分1 – B。如下圖:

java高并發(fā)系列 - 第3天:有關(guān)并行的兩個重要定律

在頂部被帶有分割線的那條直線代表總時間 T(1)。

下面你可以看到在并行因子為2的情況下的執(zhí)行時間:

java高并發(fā)系列 - 第3天:有關(guān)并行的兩個重要定律

并行因子為3的情況:

java高并發(fā)系列 - 第3天:有關(guān)并行的兩個重要定律

舉個例子

一個業(yè)務(wù)會串行調(diào)用2個方法,m1,m2,m1耗時100ms,m2耗時400ms,m2內(nèi)部串行執(zhí)行了4個無依賴的任務(wù),每個任務(wù)100ms,如下圖:

java高并發(fā)系列 - 第3天:有關(guān)并行的兩個重要定律
m2內(nèi)部的4個任務(wù)無依賴的,即可以并行進行處理,4個任務(wù)同時并行,當cpu數(shù)量大于等于4的時候,可以讓4個任務(wù)同時進行,此時m2耗時最小,即100ms,cpu為2個的時候,同時只能夠執(zhí)行2個任務(wù),其他2個任務(wù)處于等待cpu分配時間片狀態(tài),此時m2耗時200ms;當cpu超過4個的時候,或者趨于無限大的時候,m2耗時還是100ms,此時cpu數(shù)量再怎么增加對性能也沒有提升了,此時需要提升的是任務(wù)可以并行的數(shù)量。

從阿姆達爾定律可以看出,程序的可并行化部分可以通過使用更多的硬件(更多的線程或CPU)運行更快。對于不可并行化的部分,只能通過優(yōu)化代碼來達到提速的目的。因此,你可以通過優(yōu)化不可并行化部分來提高你的程序的運行速度和并行能力。你可以對不可并行化在算法上做一點改動,如果有可能,你也可以把一些移到可并行化放的部分。

Gustafson定律

Gustafson定律也試圖說明處理器個數(shù)、串行化比例和加速比之間的關(guān)系,如圖1.12所示,但是Gustafson定律和Amdahl定律的角度不同。同樣,加速比都被定義為優(yōu)化前的系統(tǒng)耗時除以優(yōu)化后的系統(tǒng)耗時。

java高并發(fā)系列 - 第3天:有關(guān)并行的兩個重要定律

根據(jù)Gustafson定律,我們可以更容易地發(fā)現(xiàn),如果串行化比例很小,并行化比例很大,那么加速比就是處理器的個數(shù)。只要不斷地累加處理器,就能獲得更快的速度。

Amdahl定律和Gustafson定律結(jié)論有所不同,并不是說其中有個是錯誤的,只是二者從不同的角度去看待問題的結(jié)果,他們的側(cè)重點有所不同。

Amdahl強調(diào):當串行換比例一定時,加速比是有上限的,不管你堆疊多少個CPU參與計算,都不能突破這個上限。
Gustafson定律關(guān)系的是:如果可被并行化的代碼所占比例足夠大,那么加速比就能隨著CPU的數(shù)量線性增長。

總的來說,提升性能的方法:想辦法提升系統(tǒng)并行的比例,同時增加CPU數(shù)量。

java高并發(fā)系列連載中,總計估計會有四五十篇文章,可以關(guān)注公眾號:javacode2018,獲取最新文章。

java高并發(fā)系列 - 第3天:有關(guān)并行的兩個重要定律

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI