并行編程模型可以分為兩類:(1)進程通信(processinteraction)和問題分解(problemdecomposition)。下面我們簡要介紹這兩類模型有哪些形式。
進程通信:進程通信涉及并行進程互相通信的機制。最常用的通信形式是共享內存(sharedmemory)和消息傳遞(messagepassing),但是通信形式也可以是隱式的,對程序員是不可見的。
1)共享內存:共享內存是進程間傳遞數據的一種高效方法。在共享內存模型中,并行進程共享一個進行異步讀取的全局地址空間。異步并發訪問可能導致條件競爭,因此需要同步機制來避免條件競爭,這些機制包括鎖,信號量,管程(monitor)。傳統的多核處理器是直接支持共享內存的,所以導致很多利用該特性的語言和庫出現,如Cilk、OpenMP和ThreadingBuildingBlocks。
2)消息傳遞:在消息傳遞模型中,并行進程是通過消息傳遞來交換數據的。這些通信可以是異步的,即消息可以在接收者做好準備前發送,也可以是同步的,即只有接受者準備好接收消息時才能發送。消息傳遞的CSP(Communicatingsequentialprocesses)模型使用同步通信channel來連接進程,這種模式被Occam、Limbo和Go等語言所采用的。相反,Actor模型則使用異步消息傳遞。這種模式被D,Scala和SALSA等語言所采用。
3)隱式通信(Implicitinteraction):在隱式通信中,進程通信對程序員來說是不可見的,進程通信是由編譯器或者運行時來處理和實現。并發被預置在高級操作子中的領域特定語言(domain-specificlanguage)和函數式編程語言是隱式并行的典型例子,因為無副作用(side-effect)允許非依賴的函數可以并發執行。但是這種并行模式是很難管理的。函數式語言如ConcurrentHaskell和ConcurrentML提供了顯示管理并行化的功能。
問題分解:并行程序是由同時運行的進程組成。問題分解涉及所有進程如何被組織起來的方式。問題分解包括三種并行模型:(1)任務并行模型(taskparallelism);(2)數據并行模型(Dataparallelism);(3)隱式并行模型(Implicitparallelism)。
1)任務并行化:任務并行模型關注進程或線程的執行。這些進程在行為上是不同的,而且相互之間的通信是非常重要的。任務并行化是表示消息傳遞通信的一種自然方式。在Flynn分類法中,任務并行化的三種形式是MIMD、MPMD或者MISD。
2)數據并行化:數據并行化關注在數據集上執行的操作。一組任務對數據集進行運算,但是會對不同的分區進行運算。在Flynn分類法中,任務并行化的三種形式是SIMD、SPMD或者SIMD。
3)隱式并行化:對程序員來說是不可見的,由編譯器、運行時或硬件負責實現。例如,在編譯器領域,自動并行化就是將順序執行的代碼轉換為并行代碼的過程;在計算機體系架構領域,超標量執行就是一種利用指令級并行來實現并行運算的機制。
并行編程模型與并行計算模型是密切相關的。并行計算模型是用于分析計算進程代價的一種抽象,它不是必須具備可行性,即可以在硬件或軟件上可以被高效地實現。相反,并行編程模型則明確地暗示了軟硬件實現的可行性考慮。一種并行編程語言的實現可以基于一個或多個并行編程模型。例如,高性能Fortran就是基于共享內存通信和數據并行問題分解來實現的,Go語言則同時提供了共享內存和消息傳遞兩種通信機制。