並行電腦的分類
一台並行電腦可以是一台具有多個內部處理器的單電腦
,也可以是多個互聯的電腦
構成一個一體的高性能計算平台。術語並行電腦
通常是指專門設計的部件。根據不同的分類法可以分成不同類型的並行電腦。
1.1 費林分類法
在作業系統中我們知道,程式根據高級程式設計語言設計,程式設計語言在實現程式的功能的時候,是轉換為機器指令來告訴機器該幹什麼。大概在50年前Flynn(1996)創造了一種電腦分類方法,中文譯為費林分類法
,該分類基於兩個獨立維度的電腦體系結構,這兩個維度即數據
和指令
。
根據以上提到這兩個維度,我們可以劃分為四大類,如圖:
1.1.1 SISD
Single Instruction,Single Data(SISD)
SISD機器是一種傳統的串列電腦,它的硬體不支援任何形式的並行計算,所有的指令都是串列執行。並且在某個時鐘周期(時間片)內,CPU只能處理一個數據流。因此這種機器被稱作
單指令流單數據流電腦
。早期的電腦都是SISD機器,如馮諾.依曼架構,如IBM PC機,早期的巨型機和許多8位的家用機等。
1.1.2 MIMD
Multiple Instruction,Multiple Data(MIMD)
在一個通用的多處理機系統中,每個處理器擁有一個獨立的程式,由每個程式為每個處理器生成一個指令流,每條指令對不同數據進行操作。Flynn將這種形式的電腦分類為
多指令流多數據流電腦
。我們前面敘述的共享存儲器或消息傳遞多處理機都屬於MIMD類型。其已經經受了時間考驗,至今仍然廣泛地用於這種操作模式下的電腦系統中。例如多核CPU電腦。
1.1.3 SIMD
Single Instruction,Multiple Data(SIMD)
如果對某些應用而言將電腦設計成由單一程式生成指令流,但是卻有多個數據存在時,將會在性能上有很大的優勢。打個比方,如果是一個學生(處理器)做很多張相同的試卷(數據流),那麼越做肯定越快。
SIMD是採用一個指令流處理多個數據流。這類機器在數字訊號處理、影像處理、以及多媒體資訊處理等領域非常有效。
Intel處理器實現的MMXTM、SSE(Streaming SIMD Extensions)、SSE2及SSE3擴展指令集,都能在單個時鐘周期內處理多個數據單元。也就是說我們現在用的單核電腦基本上都屬於SIMD機器。
1.1.4 MISD
Multiple Instruction,Single Data(MISD)
MISD是採用多個指令流來處理單個數據流。由於實際情況中,採用多指令流處理多數據流才是更有效的方法,因此MISD只是作為理論模型出現,僅僅只在1971年CMU的實驗中出現過,也就是說,實際上並不存在SISD。
1.2 存儲器結構分類法
1.2.1 共享存儲器多處理機
這裡說得比較晦澀難懂,實際上,這裡和作業系統進程的共享存儲是同一回事,詳情可見電腦作業系統筆記2.1.4.2 共享存儲。
再說的簡潔點,這裡指的共享存儲器多處理機
你完全可以理解為一個多核的電腦或者很多個單核的共用一份記憶體的電腦。
也就是說,處理器如果想要處理數據,那麼就得跑去存儲器拿數據。怎麼知道數據在哪呢?通過存儲器上的地址去拿。
在作業系統中我們學過,如果這個時候兩個處理器要同時在一個存儲器上拿東西,那它們一定要提前溝通好,也就是說,兩個處理器對共享空間的訪問是互斥的。它們提前溝通的工具是
互聯網路
。
多處理機系統由多台獨立的處理機組成,每台處理機都能夠獨立執行自己的程式和指令流,相互之間通過專門的網路連接,實現數據的交換和通訊,共同完成某項大的計算或處理任務。系統中的各台處理機由統一的作業系統進行管理,實現指令級以上並行,這種並行性一般是建立在程式段
的基礎上,也就是說,多處理機的並行是作業或任務級的並行。共享存儲多處理機系統是指有一個可以被所有處理機訪問的存儲器系統。存儲器系統由一個或多個存儲器模組組成,所有的存儲器模組使用一個統一的編址的地址空間。處理機可以用不同的地址訪問不同的存儲器模組。按存儲器組織方式分類,共享存儲多處理機系統分為集中式共享存儲器系統
和分散式共享存儲器系統
。
對共享存儲器多處理機進行編程設計到在共享存儲器中存有可由每個處理器執行的程式碼。每個程式所需的數據也將存於共享存儲器中。(即程式段
和數據段
都在共享記憶體中)。因此如果有需要的話,每個程式可以訪問所有的數據。
程式設計師要想使用並行電腦的每個處理器來處理一件問題,那原有的高級程式語言就無法使用了。所以為了解決此問題,程式設計師們開發了一種新的、高級並行程式設計語言,它具有特殊的並行程式設計構造和語句,以聲明共享變數和並行程式碼段。雖然想法很好,但是這類並行程式設計語言並不是使用很廣泛。
比較廣泛的做法是在普通的高級程式語言的基礎上生成並行程式碼,你可以理解為嵌入式編碼(類似於嵌入式SQL)。此時使用制定好規則的程式語言,然後用預處理器命令對程式的並行部分加以說明即可;這類實踐比較著名的模型就是OpenMP
。它去油編譯器命令和構造的一個工業標準,可融入到C/C++中。
另外,我們也可以多開幾條執行緒,這樣的話給人的感覺也像是並行計算的樣子,不同執行緒中含有為各個處理器執行的規整的高級語言程式碼序列,這些程式碼序列可以用來訪問共享單元。但是需要注意的是,實際上用執行緒的方法不是並行而是並發
。
使用一個規則的順序程式語言,並修改語法以說明並行性。這也是一種常用的共享存儲器多處理機模型,常用的模型是UPC(即統一併行C,Unified Parallel C)。
共享存儲器多處理機是很一種很不錯的並行電腦,綜上所述,其方便了對數據的共享。
對於上圖所示的基於匯流排互聯結構的小型共享存儲器多處理機系統是很流行的。這種在很多系統中都有廣泛應用。但是用硬體來達到所有處理器的快速訪問是很困難的,特別是在有大量存儲器時。因此大多數大型的共享存儲器系統具有某種形式的層次或分散式存儲器結構,以此來使得處理器能夠更快的速度訪問物理上相近的處理單元。
1.2.2 消息傳遞多電腦
另外一種多處理機系統的形式可以通過互聯網路連接多台完整的電腦來構成。這裡實際上對應了作業系統筆記中2.1.4.4 消息傳遞。
多處理機系統的形式可以通過互聯網路連接多台完整的電腦來構成。如下圖所示:
每台電腦由一個處理器和本地主存儲器組成,其他處理器不可訪問該本地的主存儲器。換句話來講,就是一台電腦的處理器只能訪問它對應本地的主存儲器,而無法訪問其他電腦上的主存儲器。不同的電腦之間是用互聯網來建立聯繫的,通常來說,多個電腦之間通過互聯網傳遞的消息含有的可能是程式所指明的其他電腦處理器進行計算時所需的數據。這種多處理器系統我們通常稱為消息傳遞多處理機(message-passing multiprocessor)
,或簡稱多電腦
。你可以理解為多電腦實質上是真正意義上的分散式存儲器電腦
(不是分散式共享存儲器哈)。
我們在作業系統常提到進程
這個概念,在多電腦上,我們可以把一個問題分成多個並發進程,它們可在各台電腦上分別執行。如果有6個進程和6個電腦,則我們可在每台電腦上執行一個進程;如果進程數大於電腦數,那麼其中一台電腦中如果是多核可以採用並行執行,如果是單核可以採用分時方式執行。進程間將通過發送消息
的原語來聯繫對方。同樣地,發送消息可以採用兩種方式,一種是直接通訊方式,一種是間接通訊方式,如果想詳細了解,可以前往教材或者作業系統筆記中了解。
消息傳遞多電腦比共享存儲器多處理機更容易在物理上進行擴展,也就是說它可以構成較大規模。一般規模比較小的叫做機群(Cluster)
,規模比較大的叫做超級電腦(SuperComputer)
,規模很大的叫做數據中心(DataCenter)
。
1.2.3 分散式共享存儲器
對於程式設計師來說,消息傳遞多電腦並沒有像共享存儲器多處理機那麼好用,因為它通常需要程式設計師在它們的程式碼中使用顯式的消息傳遞調用,即用原語
來進行數據交換。而這又非常容易出錯,且很難調試,所以在程式中寫的程式碼很類似於低級的彙編語言。(你想想是不是嘛?你要寫程式碼去調硬體,那不就是彙編嘛。)數據不能共享且必須拷貝,在一些具體的應用中這就很可能成為問題,因為要拷貝,數據冗餘不說,還要多次拷貝,多次操作。但是消息傳遞多處理還是有很多優點的:它不需要專門的同步機制以控制對數據的同時訪問。如果使用這些機制,將會明顯提高並行程式的執行時間。
由於意識到從編程觀點而言期望使用共享存儲器範例,一些研究人員開始追求分散式共享存儲器系統
的概念。從名字上面看,存儲器物理地分布在每個處理器
中,但每個處理器使用單一的存儲器地址空間對整個存儲器進行訪問。當一個處理器要訪問的單元不在本地存儲器中時,必須使用消息傳遞方法在處理器和存儲單元之間以某種自動方式
進行數據的傳遞,以隱藏存儲器是分布的這一事實。當然,遠程訪問將導致更大的延遲,而且比起本地訪問來,此延遲常常是相當大的。
簡單來說就是,分散式共享存儲器的記憶體在物理上分離,邏輯上統一。
1.2.4 共享存儲器多處理機體系結構
根據1.6.2.1 講述的共享存儲器多處理機結構,我們還能按存儲器組織方式分類,共享存儲多處理機系統分為集中式共享存儲器系統(Unirom Memory Access,UMA)
和分散式共享存儲器系統(Non-Unirom Memory Access,NUMA)
。
集中式共享存儲器系統由於直接訪問存儲器,所以擁有高效率,並且每個處理器到達存儲器的時間都相等。但是當CPU太多,很可能不能一起連在同一個存儲器上,而且效能可能也會達到某個程度上不去。例如
commercial servers(商用伺服器)
。
而分散式共享存儲器系統不能直接訪問存儲器,其跨連接的訪問存儲器速度較慢,但是其CPU的增多提高了計算效率;在CPU增多提高的效率大於訪問存儲器時間效率損失時,我們也可以理解為是一種高效。例如
HPC server(高效能伺服器)
。