在數(shù)字計算機(jī)的整個發(fā)展歷程中,有兩個需求是驅(qū)動進(jìn)步的持續(xù)動力:
當(dāng)處理器能夠同時做更多事情時,這兩個因素都會改進(jìn)。
并發(fā)(Concurrency)是一個通用的概念,指一個同時具有多個活動的系統(tǒng),而并行(Parallelism)指的是用并發(fā)來使一個系統(tǒng)運(yùn)行得更快。并行可以在計算機(jī)系統(tǒng)的多個抽象層次上運(yùn)用。
構(gòu)建在進(jìn)程這個抽象上,能夠設(shè)計出同時有多個程序執(zhí)行的系統(tǒng),這就導(dǎo)致了并發(fā)。使用線程,能夠在一個進(jìn)程中執(zhí)行多個控制流。自20世紀(jì)60年代出現(xiàn)時間共享,計算機(jī)系統(tǒng)中就開始有了對并發(fā)執(zhí)行的支持。傳統(tǒng)意義上,這種并發(fā)執(zhí)行只是模擬出來的,通過使一臺計算機(jī)在它正在執(zhí)行的進(jìn)程間快速切換來實現(xiàn)的,就好比一個雜耍藝人保持多個球在空中飛舞一樣。這種并發(fā)形式允許多個用戶同時與系統(tǒng)交互。如當(dāng)許多人要從一個Web服務(wù)器獲取頁面時。在以前,即使處理器必須在多個任務(wù)間切換,大多數(shù)實際的計算也都是由一個處理器來完成的。這種配置稱為單處理器系統(tǒng)。
當(dāng)構(gòu)建一個由單操作系統(tǒng)內(nèi)核控制的多處理器組成的系統(tǒng)時,就得到一個多處理器系統(tǒng)。
多核處理器是將多個CPU集成到一個集成電路芯片上。下圖是一個典型多核處理器的組織結(jié)構(gòu),其中微處理器芯片有4個CPU核,每個核都有自己的L1和L2高速緩存,其中的L1高速緩存分為兩個部分:一個保存最近取到的指令,另一個存放數(shù)據(jù)。這些核共享更高層次的高速緩存,以及到主存的接口。
超線程,也稱為同時多線程(simultaneous multi-threading),是一項允許一個CPU執(zhí)行多個控制流的技術(shù)。它涉及CPU某些硬件有多個備份,如程序計數(shù)器和寄存器文件,而其他的硬件部分只有一份,如執(zhí)行浮點算術(shù)運(yùn)算的單元。常規(guī)的處理器需要大約20000個時鐘周期做不同線程間的轉(zhuǎn)換,而超線程的處理器可以在單個周期的基礎(chǔ)上決定要執(zhí)行哪一個線程。這使得CPU能夠更好地利用它的處理資源。比如假設(shè)一個線程必須等到某些數(shù)據(jù)被裝載到高速緩存中,那CPU就可以繼續(xù)去執(zhí)行另一個線程。如Intel Core i7處理器可以讓每個核執(zhí)行兩個線程,所以一個4核的系統(tǒng)實際上可以并行地執(zhí)行8個線程。
多處理器的使用可以從兩方面提高系統(tǒng)性能。首先它減少了在執(zhí)行多個任務(wù)時模擬并發(fā)的需要,其次它可以使應(yīng)用程序運(yùn)行得更快。當(dāng)然這必須要求程序是以多線程方式來書寫的,這些線程可以并行地高效執(zhí)行。
在較低的抽象層次上,現(xiàn)代處理器可以同時執(zhí)行多條指令的屬性稱為指令級并行。早期的微處理器需要多個(3~10個)時鐘周期來執(zhí)行一條指令。而現(xiàn)代處理器可以保持每個時鐘周期2~4天指令的執(zhí)行速率。其實每條指令從開始到結(jié)束需要長得多的時間,大約20個或者更多周期,但是處理器使用了非常多的聰明技巧來同時處理多達(dá)100條指令。
如果處理器可以達(dá)到比一個周期一條指令更快的執(zhí)行速率,就稱之為超標(biāo)量(super-scalar)處理器?,F(xiàn)代處理器都支持超標(biāo)量操作。
在最低層次上,許多現(xiàn)代處理器擁有特殊的硬件,允許一條指令產(chǎn)生多個可以并行執(zhí)行的操作,這種方式稱為單指令多數(shù)據(jù),即SIMD并行。
提供這些SIMD指令多是為了提高處理影像、聲音和視頻數(shù)據(jù)應(yīng)用的執(zhí)行速度。雖然有些編譯器會試圖從C程序中自動抽取SIMD并行性,但是更可靠的方法是用編譯器支持的特殊的向量數(shù)據(jù)類型來寫程序,如GCC就支持向量數(shù)據(jù)類型。