帶你區分幾種並行

摘要:在實際應用中,影響並行加速比的因素主要是串行計算、並行計算和並行開銷三方面。

本文分享自華爲雲社區《高性能計算(2)——萬丈高樓平地起》,作者: 我是一顆大西瓜。

存儲方式

從物理劃分上共享內存和分佈式內存是兩種基本的並行計算機存儲方式 除此之外分佈式共享內存也是一種越來越重要的並行計算機存儲方式。

指令和數據

  • [小粒度]根據一個並行計算機能夠同時執行的指令與處理數據的多少 可以把並行計算機分爲 SIMD Single-Instruction Multiple-Data 單指令多數據並行計算機和MIMD Multiple-Instruction Multiple-Data 多指令多數據並行計算機
  • [大粒度]按同時執行的程序和數據的不同 又提出了SPMD Single-Program Multuple-Data 單程序多數據並行計算機和MPMD Multiple-ProgramMultiple-Data 多程序多數據並行計算機

根據指令的同時執行和數據的同時執行,計算機系統可以分成以下四類:

  • 單處理器,單數據 (SISD)
  • 單處理器,多數據 (SIMD)
  • 多處理器,單數據 (MISD)
  • 多處理器,多數據 (MIMD)

SISD

單處理器單數據就是“單CPU的機器”,它在單一的數據流上執行指令。在SISD中,指令被順序地執行。

對於每一個“CPU時鐘”,CPU按照下面的順序執行:

  • Fetch: CPU 從一片內存區域中(寄存器)獲得數據和指令
  • Decode: CPU對指令進行解碼
  • Execute: 該執行在數據上執行,將結果保存在另一個寄存器中

這種架構(馮·諾依曼體系)的主要元素有以下:

  • 中心內存單元:存儲指令和數據
  • CPU:用於從內存單元獲得指令/數據,對指令解碼並順序執行它們
  • I/O系統:程序的輸入和輸出流

傳統的單處理器計算機都是經典的SISD系統。下圖表述了CPU在Fetch、Decode、Execute的步驟中分別用到了哪些單元:

MISD

這種模型中,有n個處理器,每一個都有自己的控制單元,共享同一個內存單元。在每一個CPU時鐘中,從內存獲得的數據會被所有的處理器同時處理,每一個處理器按照自己的控制單元發送的指令處理。在這種情況下,並行實際上是指令層面的並行,多個指令在相同的數據上操作。能夠合理利用這種架構的問題模型比較特殊,例如數據加密等。因此,MISD在現實中並沒有很多用武之地,更多的是作爲一個抽象模型的存在。

SIMD

SIMD計算機包括多個獨立的處理器,每一個都有自己的局部內存,可以用來存儲數據。所有的處理器都在單一指令流下工作;具體說,就是有n個數據流,每個處理器處理一個。所有的處理器同時處理每一步,在不同的數據上執行相同的指令。

很多問題都可以用SIMD計算機的架構來解決。這種架構另一個有趣的特性是,這種架構的算法非常好設計,分析和實現。限制是,只有可以被分解成很多個小問題(小問題之間要獨立,可以不分先後順序被相同的指令執行)的問題纔可以用這種架構解決。很多超級計算機就是使用這架構設計出來的。例如Connection Machine(1985年的 Thinking Machine)和MPP(NASA-1983).我們在第六章 GPU Python編程中會接觸到高級的現代圖形處理器(GPU),這種處理器就是內置了很多個SIMD處理單元,使這種架構在今天應用非常廣泛。

MIMD

在費林分類中,這種計算機是最廣泛使用、也是最強大的一個種類。這種架構有n個處理器,n個指令流,n個數據流。每一個處理器都有自己的控制單元和局部內存,讓MIMD架構比SIMD架構的計算能力更強。每一個處理器都在獨立的控制單元分配的指令流下工作;因此,處理器可以在不同的數據上運行不同的程序,這樣可以解決完全不同的子問題甚至是單一的大問題。在MIMD中,架構是通過線程或進程層面的並行來實現的,這也意味着處理器一般是異步工作的。這種類型的計算機通常用來解決那些沒有統一結構、無法用SIMD來解決的問題。如今,很多計算機都應用了這中間架構,例如超級計算機,計算機網絡等。然而,有一個問題不得不考慮:異步的算法非常難設計、分析和實現。

併發和並行

並行類型

幾種並行區分

程序、線程、進程和超線程

  • 程序程序是一組指令的有序集合。它本身沒有任何運行的含義,只是存在於計算機系統的硬盤等存儲空間中一個靜態的實體文件。比如Linux系統下的binary excutable,windows系統下的exe
  • 進程進程是處於動態條件下由操作系統維護的系統資源管理實體。進程具有自己的生命週期, 反映了一個程序在一定的數據集上運行的全部動態過程。需要加載到內存中,點開一個exe就是開啓了一個進程
  • 線程。線程則是進程的一個實體,是比進程更小的能獨立運行的基本單位,是被系統調度和分配的基本單元。線程自身基本上不擁有系統資源,只擁有一點在運行中必不可少的資源 (如程序計數器、一組寄存器和調用堆棧), 但它與同屬一個進程的其他線程共享所屬進程所擁有的全部資源,同一個進程的多個線程可以併發執行,從而提高了系統資源的利用率
  • 超線程超線程技術就是利用特殊的硬件指令,把兩個邏輯內核模擬成兩個物理芯片,讓單顆CPU都能進行線程級並行計算,進而兼容多線程操作系統和軟件。一般一個CPU對應一個線程,通過超線程可以達到比如8核16線程

老生常談,線程和進程的區別和聯繫:

  1. 一個程序的執行至少有一個進程,一個進程至少包含一個線程(主線程)。
  2. 線程的劃分尺度小於進程,所以多線程程序併發性更高。
  3. 進程是系統進行資源分配和調度的一個獨立單位,線程是CPU調度和分派的基本單位。同一進程內允許多個線程共享其資源。
  4. 進程擁有獨立的內存單元,即進程之間相互獨立;同一進程內多個線程共享內存。因此,線程間能通過讀寫操作對它們都可見的內存進行通信,而進程間的相互通信則需要藉助於消息的傳遞。
  5. 每個線程都有一個程序運行的入口,順序執行序列和程序運行的出口,但線程不能單獨執行,必須依存於進程中,由進程控制多個線程的執行
  6. 進程比線程擁有更多的相應狀態,所以創建或銷燬進程的開銷要比創建或銷燬線程的開銷大得多。因此,進程存在的時間長,而線程則隨着計算的進行不斷地動態地派生和縮並。
  7. 一個線程可以創建和撤銷另一個線程。而且同一進程中的多個線程共享所屬進程所擁有的全部資源;同時進程之間也可以並行執行,從而更好地改善了系統資源的利用率。

線程綁定

計算機系統是由一個或多個物理處理器和內存組成,運行的程序會將內存分爲兩個部分,一部分是共享變量使用的存儲區域, 另一部分供各線程的私有變量使用的存儲區域。線程綁定是將線程綁定在固定的處理器上, 從而在線程與處理器之間建立一對一的映射關係。如果不進行線程綁定,線程可能在不同的時間片運行在不同的處理器上。我們知道,每個處理器是有自己的多級緩存的,如果線程切來切去,那麼cache命中率肯定不高,程序性能也會受到影響。通過線程綁定,程序能夠獲得更高的cache利用率從而提高程序性能。c++中如何進行線程綁定可以參考https://www.cnblogs.com/wenqiang/p/6049978.html

並行算法評價

理論上來說,n個相同的cpu理論上能提供n倍的計算能力。

但是在實際過程中,並行開銷會導致總的執行時間無法線性地減少。這些開銷分別爲:

  1. 線程的建立和銷燬、 線程和線程之間的通信、 線程間的同步等因素造成的開銷。
  2. 存在不能並行化的計算代碼,造成計算由單個線程完成, 而其他線程則處於閒置狀態。
  3. 爲爭奪共享資源而引起的競爭造成的開銷。
  4. 由於各cpu工作負載分配的不均衡和內存帶寬等因素的限制,一個或多個線程由於缺少工作或因爲等待特定事件的發生無法繼續執行而處於空閒狀態。

並行加速比(加速比)

加速比的定義是順序程序執行時間除以計算同一結果的並行程序的執行時間

​式中,t_sts​爲一顆CPU程序完成該任務所需串行執行時間;t_ptp​爲n顆CPU並行執行完成該任務所需時間。由於串行執行時間t_sts​爲n顆CPU並行執行完成該 和並行執行時間t_ptp​有多種定義方式。 這樣就產生了五種不同的加速比的定義,即相對加速比、實際加速比、絕對加速比、漸近實際加速比和漸近相對加速比。

並行效率(效率)

在實際應用中,影響並行加速比的因素主要是串行計算、並行計算和並行開銷三方面。一般情況下, 並行加速比小於CPU的數量。但是,有時會出現一種奇怪的現象,即並行程序能以串行程序快n倍的速度運行,稱爲超線性加速比。產生超線性加速的原因在於CPU訪問的數據都駐留在各自的高速緩存Cache中, 而高速緩存的容量比內存要小, 但讀寫速度卻遠高於內存。
衡量並行算法的另一個主要標準是並行效率,它表示的是多顆CPU在進行並行計算時單顆CPU的平均加速比。

​理想並行效率爲1表明全部CPU都在滿負荷工作。通常情況下,並行效率會小於1, 且隨CPU數量的增加而減小。

伸縮性

伸縮性用於度量並行機器高效運行的能力,代表跟處理器數量成比例的計算能力 (執行速度)。如果問題的規模和處理器的數量同時增加,性能不會下降。

阿姆德爾定律 (Ahmdal’s law)

阿姆德爾定律廣泛使用於處理器設計和並行算法設計。它指出程序能達到的最大加速比被程序的串行部分限制。$S=1/(1-p) $中 1-p1−p 指程序的串行部分。它的意思是,例如一個程序90%的代碼都是並行的,但仍存在10%的串行代碼,那麼系統中即使由無限個處理器能達到的最大加速比仍爲9。

古斯塔夫森定律 (Gustafson’s law)

古斯塔夫森定律在考慮下面的情況之後得出的:

  • 當問題的規模增大時,程序的串行部分保持不變。
  • 當增加處理器的數量時,每個處理器執行的任務仍然相同。

古斯塔夫森定律指出了加速比S(P)=P-\alpha (P-1)S(P)=Pα(P−1), PP 爲處理器的數量, SS 爲加速比,\alphaα 是並行處理器中的非並行的部分。作爲對比,阿姆德爾定律將單個處理器的執行時間作爲定量跟並行執行時間相比。因此阿姆德爾定律是基於固定的問題規模提出的,它假設程序的整體工作量不會隨着機器規模 (也就是處理器數量) 而改變。古斯塔夫森定律補充了阿姆德爾定律沒有考慮解決問題所需的資源總量的不足。古斯塔夫森定律解決了這個問題, 它表明設定並行解決方案所允許耗費的時間的最佳方式是考慮所有的計算資源和基於這類信息。

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章