text: 在計算機科學中，並行程式設計模型是平行計算機架構的抽象化，透過它可方便的表達演算法和它們在程式中的合成。判別程式設計模型的價值可以透過它的通用性：在各種不同架構上能表達多大範圍的不同問題，和它的效能：編譯的程式在執行時有多高的效率。並行程式設計模型的實現形式可以是從“順序程式設計”語言中呼叫的函式庫，作為現存語言的擴充套件，或作為全新的語言。圍繞特定程式設計模型的共識是很重要的，這可導致建造不同的平行計算機來支援這個模型，從而促進軟體的可移植性。在這個意義上，程式設計模型被稱為在硬體和軟體之間的。並行程式設計模型的分類.並行程式設計模型的分類可以寬泛的在兩個領域主題下進行：程序互動和問題分解。程序互動.程序互動有關於並行程序能夠籍此相互通訊的機制。最常見的互動形式是共享記憶體和訊息傳遞。共享記憶體.共享記憶體是在程序間傳遞資料的高效方式。在共享記憶體模型中，並行程序共享它們可以非同步讀與寫的全域性地址空間。非同步併發訪問可能導致競爭條件，和用來避免它們的機制如：鎖、訊號量和監視器。常規的多核處理器直接支援共享記憶體，很多並行程式語言和庫在設計上利用了它，比如採用分叉會合模型的：Cilk、OpenMP和。訊息傳遞.在訊息傳遞模型中，並行程序透過訊息傳遞相互交換資料。這種通訊可以是非同步的，就是說訊息可以在接收者準備好之前發出；或是同步的，就是說訊息發出前接收者必須準備好。通訊順序程序形式化了使用同步通訊通道來連線程序的訊息傳遞，並引出了重要的語言如：Occam、Limbo和Go。與之相對，演員模型使用非同步訊息傳遞，並被採用於如下語言的設計中：D、Scala和SALSA。分散式記憶體.指稱一類多處理器計算機系統，其中每個處理器都有自己私有的記憶體，計算任務只能在本地資料上運算，如果需要遠端資料，計算任務必須與一個或多個遠端處理器通訊。在分散式記憶體系統程式設計中的關鍵要點是如何把資料分佈到各個記憶體上；依賴於所解決的問題，資料可以靜態分佈，也可以在節點間移動；資料可以在需要時移動，也可以事先推入新的節點。MPI規定了用於分散式記憶體系統的通訊協議，支援點到點通訊和集體通訊的分割槽全域性地址空間模型。問題分解.並行程式由同時執行的程序構成。問題分解有關於規劃成員程序的方式。資料並行.資料並行模型關注進行運算所在的資料集，典型的是正規結構的陣列。一組任務將在這些資料上運算，但是單獨的處於在不相交的分割槽中。資料並行通常對應程式設計模型，相應執行模型對應費林分類法中的SIMD。任務並行.任務並行模型關注程序或執行緒的執行。這些程序通常表現出獨特性，並強調對通訊的需求。任務並行是表達訊息傳遞通訊的自然方式。任務並行通常對應程式設計模型，與的區別在於適合解決的問題而非執行模型。隱式並行.與上述相反，不向程式設計者透露任何編譯器、執行時系統或硬體負責的事情。例如，在編譯器中是把順序程式碼轉變程並行程式碼的過程；而在計算機架構中，超標量執行是採用指令級並行來進行並行運算的機制，因自身限制而被實際利用為同時多執行緒/超執行緒。在隱式並行中，程序互動對程式設計者均不可見，轉而由編譯器和/或執行時系統負責進行互動。函數語言程式設計語言不存在副作用，允許無依賴的函式並行執行，人們已經進行了很多有關的研究實驗。以SISAL和SAC為代表的一類資料流程程式語言，是可以高效隱式並行的函數語言程式設計語言，其關鍵特徵是單賦值和麵向陣列。術語.平行計算模型是計算模型的一大範疇，包括：細胞自動機、PRAM機、LogP機、佩特里網、和等。計算模型是用來分析計算程序代價的一種抽象化，利用它效能，可以不取決於特定實現和技術所特有的各種變化，並行演算法一般而言是針對特定計算模型而編寫的，為PRAM機編寫的偽碼通常會採用某種For迴圈形式的併發程式設計構造。指稱一種程式設計樣式，即透過看起來像庫呼叫的方式引發執行。例子包括POSIX的Pthreads庫和Apache Hadoop中的MapReduce。在這二者情況下，都符合這個庫所用語言的語法卻不能按照其語義來理解。不同於計算模型，程式設計模型特別暗含著對硬體或軟體實現的實際考慮。在平行計算中，執行模型經常必須暴露硬體特徵來達成高效能。並行硬體有大量的變種導致了同時需要類似數量的並行執行模型。對每個執行模型都建立一門新語言是不實際的，因此常見的實踐都是透過某個API來引發並行執行模型的行為。並行程式語言可以基於一種或一個組合的程式設計模型。例如，高效能Fortran基於共享記憶體互動和資料並行問題分解，而Go提供共享記憶體互動和訊息傳遞互動。並行程式設計模型.這裡列出的程式設計模型是可稱為的計算機的抽象模型，它提供了在一個機器的物理實現和程式設計者可獲得的這個機器的抽象概念之間的橋樑；換句話說，它意圖在硬體和軟體工程師之間提供共同的理解層面。成功的程式設計模型可以在現實中有效的實現並被程式設計者有效的作為目標；特別是應當有可能用典型的高階語言編譯器生成良好的程式碼。從程式設計者的角度來看，這種橋接並行程式設計模型一般典型的位於Pthreads、IPC、MPI等之上，而在OpenMP、OpenACC等之下。OpenCL將計算系統視為組成自一組“計算裝置”，它們可以是CPU或是附加的“加速器”比如GPU。它定義了一種用來寫程式。在OpenCL裝置上執行的函式叫做“核心”:17。一個單一的計算裝置典型的組成自一些“計算單元”，它們依次又包含很多“處理元素”。一個單一的核心執行可以在所有或多個PE上並行執行。OpenCL定義了API，允許運行於主機上的程式，啟動在計算裝置上的核心，並管理裝置記憶體，它至少在概念上分離於主機記憶體。用OpenCL語言寫的程式預期會被即時編譯，所以使用OpenCL的應用程式在針對各種裝置的實現之間是可移植的。FPGA可以被用來解決任何可計算的問題，這透過用FPGA能實現的事實就可輕易的證明。它們的好處在於對某些應用它們明顯的要更快速，因為它們有著並行本質和在對用在特定處理上的邏輯閘的數目方面的。近年來開始興起使用OpenCL程式設計來利用FPGA提供的效能和能耗效率。OpenCL允許程式設計者用C語言編碼並把FPGA組合函式作為使用OpenCL構造的OpenCL計算核心的目標。MapReduce是透過並行、分散式演算法在叢集上處理和生成鍵/值對形式的大資料集的程式設計模型和有關實現 ，Apache Hadoop中將它與HDFS分立實現。MapReduce受到了在函數語言程式設計範型中常用的map和reduce函式的啟發，但是它們在MapReduce框架中的用途不同於它們在起初形式中那樣。並行程式設計模型還有很多，比如：馬里蘭大學學院市分校依據PRAM計算模型，建立了指令級並行的多處理器計算機和程式語言，實現了Spawn-Join範型。
metadata: erhwenkuo/wikipedia-zhtw
metadata: 並行程式設計模型
metadata: https://zh.wikipedia.org/wiki?curid=6823009