1.1.2 并行程序設(shè)計(jì)和多核程序設(shè)計(jì)
在傳統(tǒng)的順序式代碼中,指令一條接著一條運(yùn)行,這種方式并不能發(fā)揮多內(nèi)核的優(yōu)勢(shì),因?yàn)轫樞蛑噶钪荒苓\(yùn)行在一個(gè)可用內(nèi)核上。使用Visual C# 2010編寫(xiě)的順序代碼并不能發(fā)揮多核的優(yōu)勢(shì),除非利用.NET Framework 4所提供的新功能將任務(wù)分解到多個(gè)內(nèi)核上。對(duì)于既有的順序代碼來(lái)說(shuō),并沒(méi)有一種自動(dòng)并行化的方法。
并行程序設(shè)計(jì)是程序設(shè)計(jì)的一種形式,以這種形式編寫(xiě)的代碼能夠充分利用底層硬件所提供的并行執(zhí)行能力。并行程序設(shè)計(jì)能夠在同一時(shí)刻運(yùn)行很多條指令。如前所述,目前存在很多種不同的并行架構(gòu),而對(duì)這些架構(gòu)進(jìn)行詳細(xì)分析需要完整的一本專(zhuān)著才行。
多核程序設(shè)計(jì)也是程序設(shè)計(jì)的一種形式,以這種形式編寫(xiě)的代碼能夠充分利用多個(gè)執(zhí)行內(nèi)核并行運(yùn)行很多條指令。多核和多處理器計(jì)算機(jī)在一臺(tái)計(jì)算機(jī)上提供了多個(gè)處理內(nèi)核。因此,其目標(biāo)在于通過(guò)將任務(wù)分布在多個(gè)可用內(nèi)核上完成,以達(dá)到事半功倍的效果。
現(xiàn)代處理器可以在多個(gè)數(shù)據(jù)上執(zhí)行相同的指令,Michael J. Flynn在他1966年提出的 Flynn分類(lèi)法中將這種方式分類(lèi)為單指令多數(shù)據(jù)(Single Instruction, Multiple Data,SIMD)。通過(guò)這種方式,可以充分利用這些向量處理器來(lái)減少某些算法的執(zhí)行時(shí)間。
本書(shū)深入探討了兩類(lèi)并行程序設(shè)計(jì):共享內(nèi)存的多核程序設(shè)計(jì)和向量處理能力的應(yīng)用??傮w目標(biāo)是要減少算法的執(zhí)行時(shí)間。這些增加的處理能力還能讓您在既有的軟件中添加更多功能。
1.2 理解硬件線程和軟件線程
多核微處理器帶有一個(gè)以上的物理內(nèi)核(physical core)——物理內(nèi)核是真正獨(dú)立的處理單元,多個(gè)物理內(nèi)核使得多條指令能夠同時(shí)并行地運(yùn)行。為了充分發(fā)揮多物理內(nèi)核的功效,有必要運(yùn)行多個(gè)進(jìn)程,或者在一個(gè)進(jìn)程內(nèi)運(yùn)行多個(gè)線程,創(chuàng)建多線程的代碼。
然而,每一個(gè)物理內(nèi)核可能會(huì)提供多個(gè)硬件線程,也稱(chēng)為邏輯內(nèi)核或邏輯處理器。使用了Intel Hyper-Threading Technology(超線程計(jì)技術(shù),HT或HTT)的微處理器在每一個(gè)物理內(nèi)核上提供了多份架構(gòu)狀態(tài)。例如,很多帶有4個(gè)物理內(nèi)核并使用了HT技術(shù)的微處理器在每一個(gè)物理內(nèi)核上提供兩份架構(gòu)狀態(tài),從而獲得8個(gè)硬件線程。這種技術(shù)稱(chēng)為對(duì)稱(chēng)多線程(simultaneous multithreading,SMT),它通過(guò)額外的架構(gòu)狀態(tài)在微處理器的指令級(jí)別對(duì)并行執(zhí)行進(jìn)行優(yōu)化和增強(qiáng)。SMT并不局限于每物理內(nèi)核兩個(gè)硬件線程;例如,有的微處理器的物理內(nèi)核上有4個(gè)硬件線程。需要注意,一個(gè)硬件線程并不代表一個(gè)物理內(nèi)核。在某些情形下,SMT可以提升多線程代碼的性能。后面的章節(jié)會(huì)列舉一些這種性能提升的示例。
Windows中每個(gè)運(yùn)行的程序都是一個(gè)進(jìn)程(process)。每一個(gè)進(jìn)程會(huì)創(chuàng)建并運(yùn)行一個(gè)或多個(gè)線程,這些線程稱(chēng)為軟件線程(software thread),用于區(qū)分前面提到的硬件線程。一個(gè)進(jìn)程至少有一個(gè)線程,稱(chēng)為主線程(main thread)。操作系統(tǒng)的調(diào)度器在所有要運(yùn)行的進(jìn)程和線程之間公平地分享可用的處理資源。Windows調(diào)度器會(huì)給每一個(gè)軟件線程分配處理時(shí)間。當(dāng)Windows調(diào)度器運(yùn)行在多核微處理器上時(shí),調(diào)度器必須從物理內(nèi)核支持的硬件線程中分配時(shí)間給每一個(gè)需要運(yùn)行指令的軟件線程。打一個(gè)比方,可以將每一個(gè)硬件線程想象為一條泳道,而將軟件線程想象為游泳者。