並行思維 II

2022-01-15 19:48:53 字數 2964 閱讀 2545

書接上回:並行思維 [i]

可伸縮性與加速比

可伸縮性是衡量應用程式加速比多少的尺度之一(注:加速比指應用程式序列化與並行化之間所花費時間之比,它表示並行化之後的效率提公升結果)。2 倍的加速比表明並行程式僅需要花費序列程式的一半時間。比如理想情況下,執行在單處理器上的程式花費 30 秒,而在雙核機器上執行僅需花費 15 秒。

我們總是期望執行在雙核機器上的應用程式要比在單核上快的多。同理,執行在四核機器上也要比在雙核上快的多。這就好像以前當 cpu 換代公升級時,隨著主頻提公升,我們的程式總是可以執行的更快。很不幸,大多數應用程式在步入多核時代後,效能不但沒有提公升,甚至有所降低。

假如我們增加更多的處理器核心數,而應用程式並沒有獲得額外的加速。從這點來看,該應用程式不具有可伸縮性。如果強制使用另外的處理器核心,通常會造成效能下降。因為這時分布式和同步的開銷開始凸顯威力。

更多關於可伸縮性的指導方針,樓主強烈推薦這篇文章:可伸縮性原則。

應用程式到底有多少並行性可言?

如小標題所說,應用程式到底有多少並行性呢?答案是視情況而定(廢話)。

顯然,這個問題取決於解決問題的多寡和發現並恰當利用並行演算法的能力。我們先前大部分討論(更多討論請參見:並行思維 [i])都圍繞著如何在昂貴和稀有的並行計算機上編寫高效能程式。隨著多核處理器時代的到來,許多方面已經發生變化。我們需要退一步來重新審視一下。

amdahl 定律

gene amdahl 發現在計算機體系架構設計過程中,某個部件的優化對整個架構的優化和改善是有上限的。這個發現後來成為知名的 amdahl 定律。該定律告訴我們,假如我們以 2 倍加速程式的全部,那我們可以預期程式執行的比 2 倍更快。但是,假如我們只以 2 倍加速優化程式的一半,那麼整個系統只改善了 1.33 倍。amdahl 定律很容易視覺化表達。設想有個程式由 5 個相同的部分組成,且每個部分執行時間均花費 100 秒,如圖 1 所示:

圖 1

如果我們以 2 倍和 4 倍來加速其中的兩部分,如圖 2 所示:

圖 2

那麼程式執行總時間將由原來的 500 秒分別縮減至 400 秒和 350 秒。 但是,我們也應該看到,更多的部分不能通過並行來加速。無論有多少處理器核心可用,序列部分 300 秒的障礙都不會被打破,如圖 3 所示:

圖 3上述最終表明,無論我們擁有多少處理器,都無法讓程式非並行(序列)部分執行的更快。

並行程式開發人員可以利用 amdahl 定律來**使用多少處理器來達到最大的加速比。amdahl 定律是個悲觀定律,但業界還有另外一種視角來看待該問題,這就是接下來要講述的 gustafson 定律(注:至於 amdahl 及 gustafson 定律的計算公式,大家可以 google 之)。

gustafson 定律

sandia 國家實驗室的 john gustafson 從乙個不同的視角來重新審視 amdahl 定律。他指出並行非常有用。因為隨著計算機越來越強大,應用程式會聚焦在更多工作上,而不是乙個固定工作量。今天的應用程式幾乎都不執行在 10 年前的老機器上,甚至也很少執行在 5 年前的機器上。而且這並不侷限在遊戲領域,它同樣適用於辦公軟體,web 瀏覽器,圖形影象處理軟體,以及像 google earth 此類的軟體。

其實,amdahl 定律本身做了幾個假設,儘管這些假設在現實世界中不一定正確。第乙個假設就是最優序列演算法的效能嚴格受限於 cpu 資源的可用性。但是實際情況並非如此,多核處理器可能會為每個核實現乙個單獨的 cache,這樣,cache 中就能夠存放更多的資料,從而降低了儲存延遲。amdahl 定律的第二個缺陷就是它假定序列演算法是給定問題的最優解決方案。但是,有一些問題本質上就是並行的,因此採用並行實現時所需的計算步驟就會比序列演算法減少很多。

amdahl 定律還有更大的缺陷,也就是第三點假設,關於問題規模的假設。amdahl 定律假設在處理器核數量增長的時候,問題的規模保持不變。這在大多數情況下不成立。一般來講,當給予更多計算資源的時候,問題規模都會隨之增大以適應資源規模的擴大。對於很多問題來說,隨著問題規模增長時,需要解決的並行部分比非並行部分(即序列部分)增長的更快速。因此,隨著問題域增長,序列部分所佔比例減少。參照 amadahl 定律,程式可伸縮性得到增強。

仍然以 圖1 為例。假如問題隨著可用並行性伸縮,我們就能看到如圖 4 所示:

圖4 如果序列部分仍然花費相同的時間量,隨著其在整體中所佔比例的下降,變得越來越不重要。最終的結果便如圖 5 所示,程式效能隨著處理器數量線性增長,複雜度為 o(n)。

圖5 即便如此,程式的效能仍然非常受限於序列部分。投入了大量處理器只為那 40% 的效率提公升。這在超級計算機上,無疑是恐怖的浪費。在多核處理器系統上,我們當然希望其他工作也能併發執行,以便能充分利用未能利用的處理能力。這是更加複雜的新世界。

無論我們採用 amadahl 定律視角還是 gustafson 定律視角,在任何情況下,最小化序列**都是良好的習慣。這兩大定律的觀點也都是正確的。不同之處在於你想要程式在既有工作量的前提下執行的更快,還是更快速的處理更大的工作量。不過實踐表明程式越複雜,要解決的問題規模越大。gustafson 定律更加符合現實一點。儘管如此,amadahl 定律仍然時刻困擾我們,如果你要在相同基準下,讓單一程式執行的更快。

通過切換到並行演算法而不擴充套件問題規模,從而使得應用程式執行的更快。這通常比在更大的問題規模上使其執行更快困難的多。應用程式的可伸縮性可以歸納為並行化增長的工作量和最小化序列工作。amadahl 定律促使我們努力減少序列部分,而 gustafson 定律則告訴我們要考慮更大的問題域。尤其是相對序列工作來說, 並行化增長的工作量。

序列化演算法 vs 並行化演算法

有乙個很明顯的事實是:最佳序列化演算法很少是最佳並行化演算法,反之亦然。這意味著要使程式在單核,多核系統上都執行良好,僅僅編寫良好的序列**或並行**並不夠。

超級計算機程式設計師從實踐中得知,併發任務工作量會隨著問題規模的功能快速增長。假如工作量的增長比序列化開銷(例如通訊,同步)還要快,那麼僅通過問題規模的增長就可以判定程式可伸縮性不佳。程式不會說在 100 個處理器下可伸縮性不佳,而到了 300 個處理器下可伸縮性就變好了。

該如何應對多核的到來?很簡單,放棄過去的序列思維,開始並行思考。

to be continued...

程式設計思維 week8 作業A 區間選點 II

給定乙個數軸上的 n 個區間,要求在數軸上選取最少的點使得第 i 個區間 ai,bi 裡至少有 ci 個點 使用差分約束系統的解法解決這道題 輸入第一行乙個整數 n 表示區間的個數,接下來的 n 行,每一行兩個用空格隔開的整數 a,b 表示區間的左右端點。1 n 50000,0 ai bi 5000...

impdp 並行 後台,並行expdp impdp

為確保空間充足,對新庫擴容690g alter tablespace ts 320 add datafile datadg orcl datafile zxx 001.dbf size 30g 將儲存邏輯卷172.18.41.55 nas lun 4 nas 4 掛載到原庫下的 archivelog...

並行程式設計與PLINQ 任務並行

任務並行 在tpl當中還可以使用parallel.invoke方法觸發多個非同步任務,其中 actions 中可以包含多個方法或者委託,paralleloptions用於配置parallel類的操作。public static void invoke action actions public st...