2012-03-20:並行計算相關知識總結

進入這個行業也不算很久,一直希望能有一套系統性的資料可以解答我所有關於並行計算的疑問。終究還是自己來總結了,我從以下幾個方面做了一些歸納,但僅僅作爲對並行計算的入門概述。要想具體實現並行開發,還需要更多的時間去實踐,可以先在網上搜索多線程編程、OpenMP、擴展指令集(如SSE、AVX等)的相關具體資料進行學習。

1.什麼是並行計算

在講並行計算之前,我們先來看一下流水線技術和時間片輪換技術,流水線技術是將一個指令的執行分爲若干個步驟並分別放到相關硬件上同時執行,形成類似流水線的執行模式,具體可以參考百度百科上的解說,這樣一來在一個時鐘週期內就可以完成一條指令。而時間片輪換技術主要是爲了提高進程的響應速度,一個處理器可能同一時間需要處理不止一個進程,如果不採用時間片輪換技術很難想象我們的電腦會如何工作。好了這裏說到的流水線技術和時間片輪換技術已經在計算機上使用很久了,不是什麼新鮮的東西。那麼什麼是並行計算呢?他的思想基礎是絕對和前面提到的兩種技術有關的,並行計算所做的事情就是實現多個任務同時執行,是在流水線技術和時間片輪換技術的基礎上的真正的多任務並行(實際上時間片輪換技術還談不上並行,只是給人的感覺好像是多個任務都在同時執行,但對於CPU來說,每個時間片只能處理一個進程;流水線技術也談不上真正的並行,只是將一個指令拆分成多個過程分給多個對應硬件執行),就像流水線技術一樣,並行計算也是需要硬件支持的,例如多個執行單元的計算機系統。


2.並行計算的編程模型,即有哪幾種並行方式?

根據並行計算機系統的存儲結構可以將並行編程分爲兩類:

1)共享存儲器並行編程模型:多線程;OpenMP

2)分佈式存儲器編程模型:MPI、PVM


3.並行計算機系統的分類。

根據flynn的分類方法可將計算機分爲四類:

1)SISD:單指令單數據流系統,早期的串行機就是這種類型

2)MISD:多指令單數據流系統,不實用,只是一種研究模型

3)SIMD:單指令多數據流系統,支持intel擴展指令集的向量機系統

4)MIMD:多指令多數據流系統,現在實用的大部分並行機都屬於這一類型

下面列舉幾種較爲知名的並行計算機體系結構模型:

1)並行向量處理機PVP:

vp是vector processor,即向量處理器。標量是指沒有方向只有大小的量,一般用一維數x表示即可,而向量是有方向有大小的量,至少用倆維數組(x,y)表示。向量處理機能同時實現對多個數的處理,這就好比向量運算需要同時處理各個維度一樣,當然這不是絕對一致的,例如向量乘法。並行向量處理機也就是CPU屬於專門定製的向量處理器的系統,該類機器廣泛應用與早期的並行計算機,GPU中也有類似結構。

2)對稱多處理機SMP:

目前基本上所有PC都屬於這種系統,即典型多核或多CPU系統,所謂對稱指的是各個內核對內存的訪問是一致的,包括速度和地址範圍。

3)大規模並行處理機MPP:

物理上的分佈存儲器,各節點之間採用定製的高速互聯網絡連接,典型代表爲天河一號、曙光5000a、神威等。

4)分佈式共享存儲多處理機DSM

不同於MPP的地方在於,DSM將分佈的局部存儲器形成了一個邏輯上共享的全局存儲器,地址空間是統一的,較MPP編程容易些。

5)工作站機羣COW

沒有定製的高速互聯網絡,而是採用以太網等商品網絡互聯的低成本變形MPP,節點是工作站或PC,網絡接口鬆耦合,典型代表爲信號分析通用計算機系統。



4.並行計算的性能評測。

並行加速比:Sp =  ts /  tp          (ts 和 tp分別爲程序的串行時間和並行時間)  在多核系統上,當Sp =  P時(P爲核數),稱爲線性加速比。

並行效率:E=Sp / P

可擴放性:評價並行算法的性能還有一點,即可擴放性,他指的是一個並行算法對硬件系統的適應性,例如系統核數不一樣時,能否保持原來的並行效率。


5.並行編程的相關概念

所謂的並行一般是針對進程和線程而言,也就是說一個任務會被劃分給多個進程或線程執行。下面先談談處理器是如何開啓進程和線程的。

1)進程的開啓過程:創建新進程時需要執行創建進程的系統調用(如UNIX/Linux系統中的fork),其主要操作有四部:申請一個空閒的PCB(有時也稱進程描述塊(Process Descriptor),它是進程組成中最關鍵的部分,其中含有進程的描述信息和控制信息,是進程動態特性的集中反映,是系統對進程施行識別和控制的依據。);爲新進程分配資源;將新進程的PCB初始化;將新進程加到就緒隊列中。

2)線程的開啓過程:現代操作系統中,進程只作爲資源擁有者,而調度和運行的屬性賦予新的實體——線程。可以說線程是進程中實施調度和分配的基本單位,一個進程中可以包括多個線程。同一個進程中的各個線程可以共用該進程的所有資源,因此在線程的開啓過程中只需要爲線程分配少量的私有資源,存放線程的私有信息(thread結構的線程控制塊)而不需要像開啓進程那樣分配很大的PCB。實際上處理機也是分配給線程而不是進程的,所以說線程開啓之後的工作就和上面提到的進程開啓之後的工作類似。

綜上所述,有一個明顯的結論就是開啓線程要比開啓進程的開銷小得多,這也是並行計算中大量使用多線程而非多進程的原因之一。此外還有一個原因,那就是多進程的通信問題。當然,多線程編程也存在同步、互斥和死鎖的問題。具體我暫時也談不上孰優孰劣,先來看看各自的意義吧。

1)多進程之間的通信:多個進程是不共享資源的,所以在將一個問題劃分給幾個進程同時執行時就會涉及到進城之間的消息傳遞,對內存的讀取及IO操作通常都是是比較費時的,所以進程間的通訊開銷在頻繁交互時是不可小覷的。

2)多線程之間的同步:這一點內容較多,也是並行計算中的重點難點,待整理完畢後統一添加進來。


6.並行算法的設計。

並行算法設計一般有三種基本思路:

1)串行算法的直接並行化:發覺和利用現有串行算法的並行性,直接將串行算法改造爲並行算法。需要注意的是:有些串行算法不可以直接並行化;好的串行算法不一定能夠產生好的並行算法;不好的串行算法有可能產生好的並行算法。

2)從問題描述開始設計並行算法:這個工作量一般較大,但效果一般也是最好的。

3)借用已有算法求解新問題:這個想必是最簡單的了。

並行算法一般設計過程分四步:任務劃分、通信分析、任務組合、處理器映射。

首先儘量開拓算法的併發性和滿足算法的可擴放性;然後着重優化算法的通信成本和全局執行時間,同時通過必要的整個過程的反覆回溯,以期最終達到一個滿意的設計選擇。


7.如何進行並行優化。

在一個並行算法確定之後,我們需要進一步對其優化,以下是並行優化的幾個原則:與體系結構相結合、具有可擴展性、粗粒度、減少通信、優化性能。

具體的優化技術有很多:

1)負載平衡技術:並行任務在各處理器分配包括靜態分配和動態分配兩種。在程序(或進程)運行之前進行的分配稱爲靜態分配;在程序(或進程)運行過程中進行的分配稱爲動態分配,通過動態分配一般可以使內核上的負載更加均衡。

2)通信優化技術:通過一些辦法減少進程間的通信開銷,一般從兩個方面入手,一是算法上的改進,二是充分利用計算機系統的特點。

3)內存優化技術:內存池技術

4)IO優化技術

5)折衷技術:常見的就是計算量和通信之間的折衷。

6)多級並行技術


揚揚灑灑寫了一大堆,到最後難免有點虎頭蛇尾的感覺。我會隨着自己對並行計算理解的加深慢慢加以補充完善,也歡迎大家指正交流。

發佈了34 篇原創文章 · 獲贊 17 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章