自電腦誕生以來,許多應用程式一直需要比計算設備所能提供的更快的執行速度和更多的資源。早期的應用程式仰賴處理器速度、記憶體速度和記憶體容量的提升來增強應用程式的功能,如天氣預報的及時性、工程結構分析的準確性、電腦生成圖形的真實感等。近年來,深度學習等新應用對執行速度和資源的需求更是超過了最好的計算設備所能提供的。這些應用需求推動了過去五十年計算設備能力的快速進步,並將在可預見的未來繼續如此。
在1980年代和1990年代,基於單一中央處理器(CPU)的微處理器,如Intel和AMD的x86處理器,通過快速增加的時脈頻率和硬體資源,推動了電腦應用性能的快速提升和成本降低。然而,自2003年以來,由於能耗和散熱問題,這種驅動力已經減緩。從那時起,幾乎所有微處理器廠商都轉向了在每個晶片中使用多個物理CPU(稱為處理器核心)的模型。為了從多個處理器核心中受益,使用者必須有多個指令序列(無論是來自同一應用程式還是不同應用程式)可以同時在這些處理器核心上執行。對於特定應用程式來說,其工作必須被分割成多個可以同時在這些處理器核心上執行的指令序列。這種從單一CPU按順序執行指令到多個核心並行執行多個指令序列的轉變,對軟體開發者社群產生了巨大影響。
傳統上,絕大多數軟體應用程式都是作為循序程式編寫的,這些程式的執行可以被人類理解為基於程式計數器(也稱為指令指標)的概念逐步執行代碼。然而,這種循序程式只能在一個處理器核心上運行,而且不會隨著新一代微處理器的推出而顯著加速。相反,能夠隨著每一代新微處理器的推出而繼續享受顯著性能提升的應用軟體將是並行程式,其中多個執行緒協作以更快地完成工作。並行程式設計的實踐並不新鮮。高性能計算(HPC)社群已經開發並行程式數十年了。這些並行程式通常在昂貴的大型電腦上運行。只有少數大型應用程式才能證明使用這些電腦的合理性,從而限制了並行程式設計的實踐僅限於少數應用程式開發者。
現在,所有新的微處理器都是並行電腦,需要開發為並行程式的應用程式數量已經大幅增加。因此,現在迫切需要軟體開發者學習並行程式設計,這也是本書的重點。自2003年以來,半導體行業已經確定了兩個主要的微處理器設計軌跡:多核軌跡和多執行緒軌跡。多核軌跡試圖在移向多個核心的同時保持循序程式的執行速度。多執行緒軌跡則更專注於並行應用程式的執行吞吐量。多執行緒處理器,特別是圖形處理單元(GPU),自2003年以來一直領先於浮點性能競賽。CPU和GPU的設計理念有根本的不同。CPU的設計針對循序代碼性能進行了最佳化,採用延遲導向設計。相比之下,GPU的設計理念則受到快速增長的視訊遊戲產業的塑造,採用吞吐量導向設計。GPU致力於最大化專用於浮點計算和記憶體存取吞吐量的晶片面積和功率預算。減少延遲比增加吞吐量在功率和晶片面積方面更昂貴。因此,GPU的主流解決方案是最佳化大量執行緒的執行吞吐量,而不是減少單個執行緒的延遲。這種設計方法通過允許流水線記憶體通道和算術運算具有較長的延遲來節省晶片面積和功率。應該清楚的是,GPU被設計為並行、吞吐量導向的計算引擎,它們在某些CPU設計擅長的任務上表現不佳。對於只有一個或很少執行緒的程式,具有較低操作延遲的CPU可以達到比GPU高得多的性能。當程式有大量執行緒時,具有較高執行吞吐量的GPU可以達到比CPU高得多的性能。因此,人們應該期望許多應用程式同時使用CPU和GPU,在CPU上執行循序部分,在GPU上執行數值密集型部分。速度並不是應用程式開發者選擇處理器運行其應用程式的唯一決定因素。其他因素可能更為重要,如處理器在市場上的巨大存在(稱為處理器的安裝基礎)、實用的形態因素和易於存取性等。
2007年CUDA(Compute Unified Device Architecture)的發布改變了一切。CUDA不僅代表軟體變化;還在晶片上增加了額外的硬體以促進並行程式設計的便利性。通用程式設計介面大大擴展了可以輕鬆為GPU開發的應用程式類型。並行程式設計的主要動機是讓應用程式在未來的硬體世代中繼續享受速度提升。當應用程式適合並行執行時,在GPU上的良好實現可以達到比在單個CPU核心上順序執行超過100倍的加速。如果應用程式包含所謂的"資料並行性",通常只需幾個小時的工作就可以實現10倍的加速。許多令人興奮的大眾市場應用程式在未來將是我們以前認為的超級計算應用程式或超級應用程式。例如,生物學研究社群越來越多地進入分子層面。計算模型的引入可以有效解決傳統儀器的限制,通過模擬來測量更多細節並測試更多假設。這些模擬將在可預見的未來繼續受益於計算速度的提升。視訊和音訊編碼和操作、3D成像和視覺化等應用也將需要更多的計算能力。未來,新功能如視圖合成和低解析度視訊的高解析度顯示將在電視中需要更多的計算能力。在消費者層面,我們將開始看到越來越多的視訊和圖像處理應用程式,以改善圖片和視訊的焦點、照明和其他關鍵方面。更多的計算速度還將帶來更好的使用者介面。未來版本的智慧型手機將結合具有3D視角的感測器和顯示器,結合虛擬和物理空間資訊以增強可用性,以及基於語音和電腦視覺的介面,這些都需要更多的計算速度。消費電子遊戲也在進行類似的發展。隨著計算速度的提升,遊戲可以基於動態模擬而不是預先安排的場景。我們可以期待在未來體驗更多這些真實的效果。準確模擬物理現象的能力已經啟發了數位孿生的概念,其中物理物體在模擬空間中有準確的模型,以便可以以更低的成本進行全面的壓力測試和磨耗預測。深度學習是一個重要的新應用例子,它得益於計算吞吐量的大幅提升。自2012年以來,基於神經網路的應用在電腦視覺和自然語言處理中得到快速採用。這種採用革新了電腦視覺和自然語言處理應用,並觸發了自動駕駛汽車和家庭助理設備的快速發展。
並行程式設計面臨幾個挑戰。首先,設計具有與循序算法相同水平的算法(計算)複雜度的並行算法可能具有挑戰性。其次,許多應用程式的執行速度受到記憶體存取延遲和/或吞吐量的限制。第三,並行程式的執行速度通常對輸入資料特徵更敏感。第四,一些應用程式可以並行化,而幾乎不需要不同執行緒之間的協作,而其他應用程式則需要執行緒相互協作,這需要使用同步操作。幸運的是,研究人員已經解決了大多數這些挑戰。跨應用領域也存在共同模式,允許我們將在一個領域中得出的解決方案應用於其他領域的挑戰。