轉自 http://www.javashuo.com/article/p-gofebjnh-kd.html程序員
並行編程模型
2017年03月12日 17:19:33
閱讀數:1846
在計算領域,並行編程模型是並行計算機體系架構的一種抽象,它便於編程人員在程序中編寫算法及其組合。一個編程模型的價值能夠經過其通用性(generality)來判斷,如不一樣體系架構的一系列不一樣的問題可否在該模型中很好地表示以及其性能如何,編譯後的程序執行效率有多高等。並行編程模型的實現有兩種方式,做爲已有的語言的一種擴展,經過庫的形式來調用,或者做爲一種全新的語言。算法
圍繞一個實際的編程模型的共識是重要的,由於它會致使構建出支持該模型的不一樣的並行計算機,從而提升軟件的兼容性。在這種意義上說,編程模型是硬件和軟件之間的橋樑。
並行編程模型能夠分爲兩類:(1)進程通訊(process interaction)和問題分解(problem decomposition)。下面咱們簡要介紹這兩類模型有哪些形式。編程
進程通訊:進程通訊涉及並行進程互相通訊的機制。最經常使用的通訊形式是共享內存(shared memory)和消息傳遞(message passing),可是通訊形式也能夠是隱式的,對程序員是不可見的。 1)共享內存:共享內存是進程間傳遞數據的一種高效方法。在共享內存模型中,並行進程共享一個進行異步讀取的全局地址空間。異步併發訪問可能致使條件競爭,所以須要同步機制來避免條件競爭,這些機制包括鎖,信號量,管程(monitor)。傳統的多核處理器是直接支持共享內存的,因此致使不少利用該特性的語言和庫出現,如Cilk、OpenMP和Threading Building Blocks。
2)消息傳遞:在消息傳遞模型中,並行進程是經過消息傳遞來交換數據的。這些通訊能夠是異步的,即消息能夠在接收者作好準備前發送,也能夠是同步的,即只有接受者準備好接收消息時才能發送。消息傳遞的CSP(Communicating sequential processes)模型使用同步通訊channel來鏈接進程,這種模式被Occam、Limbo和Go等語言所採用的。相反,Actor模型則使用異步消息傳遞。這種模式被D,Scala和SALSA等語言所採用。架構
3)隱式通訊(Implicit interaction):在隱式通訊中,進程通訊對程序員來講是不可見的,進程通訊是由編譯器或者運行時來處理和實現。併發被預置在高級操做子中的領域特定語言(domain-specific language)和函數式編程語言是隱式並行的典型例子,由於無反作用(side-effect)容許非依賴的函數能夠併發執行。可是這種並行模式是很難管理的。函數式語言如Concurrent Haskell和Concurrent ML提供了顯示管理並行化的功能。併發
問題分解:並行程序是由同時運行的進程組成。問題分解涉及全部進程如何被組織起來的方式。問題分解包括三種並行模型:(1)任務並行模型(task parallelism);(2)數據並行模型(Data parallelism);(3)隱式並行模型(Implicit parallelism)。dom
1)任務並行化:任務並行模型關注進程或線程的執行。這些進程在行爲上是不一樣的,並且相互之間的通訊是很是重要的。任務並行化是表示消息傳遞通訊的一種天然方式。在Flynn分類法中,任務並行化的三種形式是MIMD、MPMD或者MISD。異步
2)數據並行化:數據並行化關注在數據集上執行的操做。一組任務對數據集進行運算,可是會對不一樣的分區進行運算。在Flynn分類法中,任務並行化的三種形式是SIMD、SPMD或者SIMD。編程語言
3) 隱式並行化:對程序員來講是不可見的,由編譯器、運行時或硬件負責實現。例如,在編譯器領域,自動並行化就是將順序執行的代碼轉換爲並行代碼的過程;在計算機體系架構領域,超標量執行就是一種利用指令級並行來實現並行運算的機制。ide
並行編程模型與並行計算模型是密切相關的。並行計算模型是用於分析計算進程代價的一種抽象,它不是必須具有可行性,便可以在硬件或軟件上能夠被高效地實現。相反,並行編程模型則明確地暗示了軟硬件實現的可行性考慮。一種並行編程語言的實現能夠基於一個或多個並行編程模型。例如,高性能Fortran就是基於共享內存通訊和數據並行問題分解來實現的,Go語言則同時提供了共享內存和消息傳遞兩種通訊機制。函數式編程
並行編程模型的例子
名字
進程通訊類別
問題分解類別
樣例實現
Actor model
Asynchronous
message passing
Task
D, Erlang, Scala, SALSA
Bulk synchronous
parallel
Shared memory
Task
Apache Giraph, Apache Hama, BSPlib
Communicating
sequential processes
Synchronous
message passing
Task
Ada, Occam, VerilogCSP, Go
Circuits
Message passing
Task
Verilog, VHDL
Dataflow
Message passing
Task
Lustre, TensorFlow, Apache Flink
Functional
Implicit
Task
Concurrent Haskell, Concurrent
ML
LogP machine
Synchronous
message passing
Not specified
None
Parallel random
access machine
Shared memory
Data
Cilk、CUDA、OpenMP、Threading Building Blocks、XMTC