1.6.3 并行化任務(wù)
Visual C# 2010和.NET Framework 4使得將基于任務(wù)的設(shè)計轉(zhuǎn)換為并行化代碼變得非常簡單。然而,很重要的一點在于,為了讓并行化的代碼能夠?qū)崿F(xiàn)預(yù)期的目標(biāo),必須對并行化的代碼進(jìn)行特別的測試和調(diào)優(yōu)。本書剩余的部分將講解這些主題。
當(dāng)您對任務(wù)進(jìn)行并行化時,并行化所引入的開銷可能產(chǎn)生較大的影響,因此,可能需要對多種可替換方案進(jìn)行測試。如前所述,現(xiàn)代的多核微處理器極其復(fù)雜,在做出最終選擇之前,有必要對不同的并行化技術(shù)進(jìn)行測試。事實上,串行代碼也是如此,但是區(qū)別在于,您已經(jīng)知道foreach循環(huán)比for循環(huán)要慢。在對任務(wù)進(jìn)行并行化的時候,根據(jù)決定并行化任務(wù)執(zhí)行的方式的特定參數(shù)的不同,并行化版本的for循環(huán)可能會產(chǎn)生不同的性能結(jié)果。一旦經(jīng)歷過這些場景之后,您就能夠在為類似問題編寫代碼和進(jìn)行相似的任務(wù)設(shè)計的時候考慮到這些問題。
通常情況下都有必要將多個任務(wù)連接起來,其中,代碼可以將要完成的工作分解為子任務(wù)、并行地執(zhí)行子任務(wù)、收集結(jié)果,然后重復(fù)很多像這樣的循環(huán)。在決定并行化對某一個特定的問題來說是否是好的替代方案的時候,想象要在1000個內(nèi)核上運行,嘗試創(chuàng)建一個可能的并發(fā)執(zhí)行的示意圖。如果算法中可以完全并行化的部分不能提供預(yù)期的可擴(kuò)展性,那么您還可以讓它們與其他任務(wù)一起并行運行。
1.6.4 盡量減少臨界區(qū)
Amdahl法則和Gustafson法則都意識到,串行工作是并行算法整體性能的敵人。在兩個并行部分之間需要順序執(zhí)行的串行時間段稱為臨界區(qū)(critical section)。圖1-16標(biāo)出了用于分析Gustafson法則的一個示意圖中的4個臨界區(qū)。