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