摘要
構(gòu)建軟件的并行版本可使應(yīng)用在更短的時(shí)間內(nèi)運(yùn)行指定的數(shù)據(jù)集,在固定時(shí)間內(nèi)運(yùn)行多個(gè)數(shù)據(jù)集,或運(yùn)行非線程軟件禁止運(yùn)行的大型數(shù)據(jù)集。 并行化的成功通常通過(guò)測(cè)量并行版本的加速(相對(duì)于串行版本)來(lái)進(jìn)行量化。 除了上述比較之外,將并行版本加速與可能加速的上限進(jìn)行比較也十分有用。 通過(guò)阿姆達(dá)爾定律和古斯塔夫森定律可以解決這一問(wèn)題。
本文是“英特爾多線程應(yīng)用開(kāi)發(fā)指南”系列的一部分,該系列介紹了針對(duì)英特爾? 平臺(tái)開(kāi)發(fā)高效多線程應(yīng)用的指導(dǎo)原則。
背景
應(yīng)用運(yùn)行的速度越快,用戶等待結(jié)果所需的時(shí)間越短。 此外,執(zhí)行時(shí)間的縮短使用戶在可接受的時(shí)間內(nèi)能夠運(yùn)行更大規(guī)模的數(shù)據(jù)集(例如,更多的數(shù)據(jù)記錄,更多的像素,或更大的物理模型)。 串行與并行執(zhí)行時(shí)間之間一個(gè)具體的比較指標(biāo)便是加速比(speedup)。
簡(jiǎn)單來(lái)說(shuō),加速比是串行執(zhí)行時(shí)間與并行執(zhí)行時(shí)間的比率。 例如,如果串行應(yīng)用運(yùn)行需 6720 秒,對(duì)應(yīng)的并行應(yīng)用運(yùn)行需 126.7 秒(使用 64 個(gè)線程和內(nèi)核),則并行應(yīng)用的加速比是 53X (6720/126.7 = 53.038)。
對(duì)于擴(kuò)展良好的應(yīng)用,加速比增加的速度應(yīng)與內(nèi)核(線程)數(shù)量增加的速度相同或接近。 當(dāng)增加使用的線程數(shù)時(shí),如果測(cè)量的加速比不能維持不變或開(kāi)始下降,那么就測(cè)量的數(shù)據(jù)集,該應(yīng)用的擴(kuò)展性不夠理想。 如果該數(shù)據(jù)集是典型的實(shí)際數(shù)據(jù)集,而應(yīng)用將在此之上執(zhí)行,那么該應(yīng)用的擴(kuò)展性能則不理想。
與加速比相關(guān)的另一個(gè)指標(biāo)是效率(efficiency)。 正如加速比是衡量并行執(zhí)行比串行執(zhí)行快多少的指標(biāo),效率表示的是軟件對(duì)系統(tǒng)計(jì)算資源的利用程度。 要計(jì)算并行執(zhí)行的效率,只需將觀察到的加速比除以使用的內(nèi)核數(shù), 然后將得到的數(shù)值以百分?jǐn)?shù)表示即可。 例如,加速比為 53X, 使用 64 個(gè)內(nèi)核,那么效率就等于 82% (53/64 = 0.828)。 這意味著,在應(yīng)用執(zhí)行過(guò)程中,平均每個(gè)內(nèi)核大約有17% 的時(shí)間處于閑置狀態(tài)。
阿姆達(dá)爾定律
在啟動(dòng)一個(gè)并行化項(xiàng)目前,開(kāi)發(fā)人員會(huì)希望預(yù)估他們能夠?qū)崿F(xiàn)的性能提升量(加速比)。 如果知道(或預(yù)估出)能夠以并行方式執(zhí)行的串行代碼的百分?jǐn)?shù),那么開(kāi)發(fā)人員可使用阿姆達(dá)爾定律計(jì)算應(yīng)用的加速比上限,無(wú)需實(shí)際編寫任何并發(fā)代碼。 本系列介紹了阿姆達(dá)爾定律公式的幾種變形。 每種變形均使用并行執(zhí)行時(shí)間 (pctPar) 、串行執(zhí)行時(shí)間 (1 - pctPar) 和線程/內(nèi)核 (p) 的百分?jǐn)?shù)(建議)。 下面是一個(gè)簡(jiǎn)單的阿姆達(dá)爾定律公式,用于評(píng)估基于 p 個(gè)內(nèi)核上并行應(yīng)用的加速比。
該公式只是串行時(shí)間(標(biāo)準(zhǔn)化為 1)與預(yù)估的并行執(zhí)行時(shí)間的簡(jiǎn)單相除,使用標(biāo)準(zhǔn)化的串行時(shí)間的百分?jǐn)?shù)。 并行執(zhí)行時(shí)間表示為串行執(zhí)行的百分?jǐn)?shù) (1 - pctPar)加上能夠以并行方式執(zhí)行的百分?jǐn)?shù)與所用內(nèi)核數(shù) (pctPar/p) 的除數(shù)。 例如,如果 95% 的串行應(yīng)用運(yùn)行時(shí)間可以在 8 個(gè)內(nèi)核上以并行方式執(zhí)行,根據(jù)阿姆達(dá)爾定律,預(yù)估的加速比等于 6X (1 / (0.05 + 0.95/8)= 5.925)。
除了在公式中的小于或等于關(guān)系 (=),阿姆達(dá)爾定律公式假設(shè)這些能夠以并行方式執(zhí)行的計(jì)算可被無(wú)限內(nèi)核數(shù)整除。 這一假設(shè)實(shí)際消除了分母中的第二項(xiàng),意味著最大的加速比即是剩余串行執(zhí)行百分?jǐn)?shù)的倒數(shù)。
因?yàn)楹雎粤藢?shí)際開(kāi)銷,例如通信、同步和其它線程管理,以及無(wú)限內(nèi)核處理器的假設(shè),阿姆達(dá)爾定律一直飽受批評(píng)。 除了沒(méi)有考慮并發(fā)算法固有的開(kāi)銷,對(duì)阿姆達(dá)爾定律最強(qiáng)烈的批評(píng)之一是,隨著內(nèi)核數(shù)量的增加,處理的數(shù)據(jù)量也可能會(huì)增加。 阿姆達(dá)爾定律假設(shè)不論內(nèi)核數(shù)量如何,數(shù)據(jù)集大小均為固定,并且整體串行執(zhí)行時(shí)間保持不變。
古斯塔夫森定律
如果使用 8 核的并行應(yīng)用能夠計(jì)算的數(shù)據(jù)集是原始大小的 8 倍,串行部分的執(zhí)行時(shí)間會(huì)增加嗎? 即使有增加,它也并非與數(shù)據(jù)集的增加同比例增長(zhǎng)。 實(shí)際數(shù)據(jù)顯示串行執(zhí)行時(shí)間幾乎保持不變。斯塔夫森定律又被稱為擴(kuò)展的加速比(scaled speedup),它考慮了數(shù)據(jù)大小與內(nèi)核數(shù)量成比例的增加并計(jì)算應(yīng)用的加速比(上限),假設(shè)大數(shù)據(jù)集能夠以并行方式執(zhí)行。 擴(kuò)展的加速比公式如下:
與阿姆達(dá)爾定律公式相同,p代表內(nèi)核數(shù)量。 為簡(jiǎn)化表述,對(duì)于指定的數(shù)據(jù)集大小, s 代表并行應(yīng)用中的串行執(zhí)行時(shí)間的百分?jǐn)?shù)。 例如,如果在 32 個(gè)內(nèi)核上 1% 的執(zhí)行時(shí)間用于串行執(zhí)行,對(duì)于同一數(shù)據(jù)集,基于單個(gè)內(nèi)核和單個(gè)線程運(yùn)行的應(yīng)用的加速比是:
現(xiàn)在來(lái)考慮阿姆達(dá)爾定律基于這些假設(shè)估計(jì)的加速比。 假設(shè)串行執(zhí)行的百分比是 1%,阿姆達(dá)爾定律等式得出 1/(0.01 + (0.99/32)) = 24.43X。 這是個(gè)錯(cuò)誤計(jì)算,因?yàn)榻o定的串行時(shí)間百分?jǐn)?shù)與 32 內(nèi)核執(zhí)行有關(guān)。 該示例沒(méi)有指出對(duì)于更多或更少的內(nèi)核(甚至只有一個(gè)內(nèi)核),對(duì)應(yīng)的串行執(zhí)行百分?jǐn)?shù)將是多少。 如果代碼擴(kuò)展完美,并且數(shù)據(jù)大小與內(nèi)核數(shù)同時(shí)擴(kuò)展,那么該百分?jǐn)?shù)能夠保持不變,阿姆達(dá)爾定律計(jì)算的結(jié)果將是 32 內(nèi)核上(固定大小)單核問(wèn)題的預(yù)測(cè)加速比。
另一方面,如果在 32 內(nèi)核的案例中知道總的并行應(yīng)用執(zhí)行時(shí)間,則可以計(jì)算全部串行執(zhí)行時(shí)間,并且針對(duì)固定大小問(wèn)題的加速比(進(jìn)一步假設(shè)該值可以使用單核計(jì)算)可以通過(guò)阿姆達(dá)爾定律基于 32 內(nèi)核進(jìn)行預(yù)測(cè)。 假設(shè)在 32 內(nèi)核上并行應(yīng)用的總執(zhí)行時(shí)間是 1040 秒,則該時(shí)間的 1% 是串行執(zhí)行時(shí)間,或 10.4 秒。 乘以 32 內(nèi)核上并行執(zhí)行的秒數(shù) (1029.6),該應(yīng)用完成總工作量所花時(shí)間為 1029.6*32+10.4 = 32957.6 秒。 非并行時(shí)間(10.4 秒)是總工作時(shí)間的 0.032%。 使用該數(shù)字,阿姆達(dá)爾定律計(jì)算出的加速比為 1/(0.00032 + (0.99968/32)) = 31.686X。
運(yùn)用斯塔夫森定律時(shí),必須知道并行執(zhí)行期間串行時(shí)間的百分?jǐn)?shù),因此該公式的一個(gè)典型用例是計(jì)算擴(kuò)展的并行執(zhí)行(數(shù)據(jù)集大小隨著內(nèi)核數(shù)量的增加而增加)與相同大小問(wèn)題串行執(zhí)行的加速比。 從上面的示例可以看出,由于在阿姆達(dá)爾定律的公式中有關(guān)應(yīng)用執(zhí)行數(shù)據(jù)的嚴(yán)格使用,得出的估值比擴(kuò)展的加速比公式得出的值悲觀得多。
建議
在計(jì)算加速比時(shí),必須對(duì)最佳的串行算法和最快的串行代碼進(jìn)行比較。 通常,非最佳串行算法將更容易并行化。 即便如此,雖然有更快的串行版本,但也不是所有人都會(huì)使用串行代碼。 因此,即使底層算法不同,必須使用最快串行代碼中的最佳串行運(yùn)行時(shí)間來(lái)計(jì)算可比較并行應(yīng)用的加速比。
在說(shuō)明加速比時(shí),應(yīng)使用乘數(shù)值。 過(guò)去,加速比一直以百分?jǐn)?shù)表示。 在本文中,使用百分?jǐn)?shù)會(huì)引起困惑。 例如,如果說(shuō)并行代碼比串行代碼快 200%,那么它的運(yùn)行時(shí)間是串行版本時(shí)間的一半,還是該時(shí)間的三分之一? 105% 的加速比是幾乎與串行執(zhí)行時(shí)間相同還是比串行執(zhí)行時(shí)間快兩倍? 基準(zhǔn)串行時(shí)間是 0% 加速比還是 100% 加速比? 另一方面,如果并行應(yīng)用的加速比是 2X,很顯然它使用一半的時(shí)間(即,并行版本在相同的時(shí)間內(nèi)能夠執(zhí)行兩次,而串行代碼執(zhí)行一次)
在極少數(shù)情況下,應(yīng)用的加速比大于內(nèi)核數(shù)。 這種現(xiàn)象被稱為超級(jí)線性加速。 發(fā)生超級(jí)線性加速的典型原因是固定大小數(shù)據(jù)集被分解得足夠小(對(duì)內(nèi)核而言),可以放入本地高速緩存。 當(dāng)以串行方式運(yùn)行時(shí),數(shù)據(jù)必須通過(guò)高速緩存獲取,在獲取期間處理器只能等待。 如果數(shù)據(jù)足夠大,需占用清空之前使用的某些高速緩存行,那么后續(xù)對(duì)這些高速緩存行的任何復(fù)用都會(huì)導(dǎo)致處理器再次等待。 當(dāng)數(shù)據(jù)被分解成可放入內(nèi)核上高速緩存的數(shù)據(jù)塊時(shí),一旦這些數(shù)據(jù)被全部存入高速緩存,則無(wú)需經(jīng)歷復(fù)用高速緩存行所帶來(lái)的等待復(fù)用。 因此,使用多個(gè)內(nèi)核可以消除在單個(gè)內(nèi)核上與串行代碼執(zhí)行相關(guān)的一些系統(tǒng)開(kāi)銷。 這樣,過(guò)小的數(shù)據(jù)集(小于一般的數(shù)據(jù)大小)便會(huì)產(chǎn)生性能提升的錯(cuò)覺(jué)。
使用指南
此外還有其它并行執(zhí)行模型嘗試對(duì)阿姆達(dá)爾定律簡(jiǎn)單模型中的缺陷給出合理假設(shè)。然而,因?yàn)槠浜?jiǎn)單性和用戶理解這只是理論上限(幾乎不可能達(dá)到或超越),所以阿姆達(dá)爾定律仍是表示串行應(yīng)用加速比潛力的一項(xiàng)簡(jiǎn)單、有用的指標(biāo)。
更多資源
John L. Gustafson。 "重新評(píng)估阿姆達(dá)爾定律," 《美國(guó)計(jì)算機(jī)學(xué)會(huì)通訊》第 31 卷,第 532-533 頁(yè),1988 年。
Michael J. Quinn。 《利用 MPI 和 OpenMP 的 C 并行編程》. McGraw-Hill,2004 年。