1.8 判斷是否適合并行化
有時,并行化并不是優(yōu)化算法的最佳選擇。如果相比于串行執(zhí)行的方式,并行化能夠帶來顯著的性能提升,那么并行化才有意義。判斷是否適合并行化并沒有一勞永逸的方法——一切都取決于特定問題的功能需求和性能需求。例如,如果一個并行化的算法完成整個作業(yè)的時間能夠減少30%,而如果串行版本的算法只需要不到1秒就可以完成,那么這個加速就不明顯了。然而,如果對一個需要運(yùn)行18個小時才能完成的批處理作業(yè)進(jìn)行并行化加速也能達(dá)到如此的性能提升,那么加速之后不到13小時就能完成運(yùn)行了,這樣的話并行化的意義就很顯著。
您還可以考慮通過并行化執(zhí)行來向現(xiàn)有的應(yīng)用程序添加新功能。通過可以充分發(fā)揮并行化優(yōu)勢的異步任務(wù)和線程,可以設(shè)計出對用戶的響應(yīng)能力更好的方案。
并行化程序設(shè)計比傳統(tǒng)的串行程序設(shè)計復(fù)雜得多。然而,只要您開始進(jìn)行基于任務(wù)的設(shè)計,并且編寫并行化代碼之后,就很難不再去想并行化了。
Visual C# 2010和.NET Framework 4提供了很多特性,使得從基于任務(wù)的設(shè)計到并行化代碼成為可能;本書剩余的部分將會對這些特性進(jìn)行深入講解,并且會幫助解決這個轉(zhuǎn)變過程中可能遇到的所有問題。
1.9 小結(jié)
本章介紹了共享內(nèi)存的多核體系結(jié)構(gòu)和NUMA體系結(jié)構(gòu)。首先解釋了新的輕量級并發(fā)和并行模型的細(xì)節(jié),并且闡述了在編寫代碼之前以并行的思想指導(dǎo)設(shè)計方案的必要性。然后還討論了一些與并行優(yōu)化和可擴(kuò)展性局限性相關(guān)的經(jīng)典法則。本章的主要內(nèi)容包括:
● 將算法分解為并行的任務(wù)可以充分地發(fā)揮多硬件線程的優(yōu)勢。
● 可以使用更加簡潔且高效的輕量級并發(fā)模型。
● 通過改進(jìn)設(shè)計,可以避免Amdahl法則所描述的可擴(kuò)展性的局限性。
● 可以考慮Gustafson法則。
● 必須盡可能地減少臨界區(qū),臨界區(qū)會限制可擴(kuò)展性。
● 在設(shè)計的時候要以并發(fā)、交錯并發(fā)和并行化的思想作為指導(dǎo)。
● 必須考慮代碼并行化帶來的開銷。
● 在使用NUMA體系結(jié)構(gòu)的時候,可能會面臨異常的性能問題。
● 在編寫并行化代碼的時候,要考慮目前已經(jīng)學(xué)習(xí)的所有與現(xiàn)代硬件體系結(jié)構(gòu)相關(guān)的知識。