平行計算入門 openMP

2021-09-24 23:29:35 字數 2028 閱讀 8399

openmp提供了對於並行描述的高層抽象,降低了並行程式設計的難度和複雜度,這樣程式設計師可以把更多的精力投入到並行演算法本身,而非其具體實現細節。對基於資料分集的多執行緒程式設計,openmp是乙個很好的選擇。同時,使用openmp也提供了更強的靈活性,可以較容易的適應不同的並行系統配置。執行緒粒度和負載平衡等是傳統多執行緒程式設計中的難題,但在openmp中,openmp庫從程式設計師手中接管了部分這兩方面的工作。但是,作為高層抽象,openmp並不適合需要複雜的執行緒間同步和互斥的場合。openmp的另乙個缺點是不能在非共享記憶體系統(如計算機集群)上使用,一般在這樣的系統上,mpi使用較多。

在visual studio中使用openmp其實很簡單,只要將 project 的properties中c/c++裡language的openmp support開啟(引數為 /openmp),就可以讓vc++在編譯時就可以支援openmp 的語法了。而在編寫使用openmp 的程式時,新增#include 即可。下面是乙個例項:

#include

#include

#include

#define max_value 10000000

double _test(int value)

例如,可以寫乙個簡單的並行輸出提示資訊的**:

#pragma omp parallel num_threads(8)

在本機測試將會得到如下結果:

結果表明,printf函式被建立了8個執行緒來執行,並且每乙個執行緒執行的先後次序並不確定。和傳統的建立執行緒函式比起來,openmp相當於為乙個執行緒入口函式重複呼叫建立執行緒函式來建立執行緒並等待執行緒執行完。如果在上面的**中去掉num_threads(8)來指定執行緒數目,那麼將根據實際cpu核心數目來建立執行緒數。

for指令用法

for指令則是用來將乙個for迴圈分配到多個執行緒中執行。for指令一般可以和parallel指令合起來形成parallel for指令使用,也可以單獨用在parallel語句的並行塊中。其語法如下:

#pragma omp [parallel] for [子句]

for迴圈語句

例如有這樣乙個例子:

#pragma omp parallel for

for ( int j = 0; j < 4; j++ )

可以得到如下結果:

從結果可以看出,for迴圈的語句被分配到不同的執行緒中分開執行了。需要注意的是,如果不新增parallel關鍵字,那麼四次迴圈將會在同乙個執行緒裡執行,結果將會是下面這樣的:

sections和section的用法

section語句是用在sections語句裡用來將sections語句裡的**劃分成幾個不同的段,每段都並行執行。用法如下:

複製**

#pragma omp [parallel] sections [子句]

}複製**

例如有這樣乙個例子:

複製**

#pragma omp parallel sections

複製**

可以得到如下結果:

結果表明,每乙個section內部的**都是(分配到不同的執行緒中)並行執行的。使用section語句時,需要注意的是這種方式需要保證各個section裡的**執行時間相差不大,否則某個section執行時間比其他section長太多就達不到並行執行的效果了。

如果將上面的**拆分成兩個sections,即:

複製**

#pragma omp parallel sections

#pragma omp parallel sections

複製**

產生的結果將會是這樣的:

可以看出,兩個sections之間是序列執行的,而section內部則是並行執行的。

小節:用for語句來分攤任務是由系統自動進行的,只要每次迴圈間沒有時間上的差距,那麼分攤是很均勻的,使用section來劃分執行緒是一種手工劃分執行緒的方式,最終並行性的好壞依賴於程式設計師。

本篇文章中講的幾個openmp指令parallel, for, sections, section實際上都是用來如何建立執行緒的,這種建立執行緒的方式比起傳統呼叫建立執行緒函式建立執行緒要更方便,並且更高效。

pthread平行計算入門

實現並行的庫有很多,比如mpi庫,openmp等,同樣pthread也是實現並行的乙個庫。pthread實現並行的是共享記憶體的方式,即如何cpu都可以訪問相同的記憶體區域。這種實現方式實現起來比較簡單,但是會存在臨界區等問題。以下是最簡單的一段並行的 其實現了建立多個執行緒,為多執行緒函式傳遞引數...

平行計算入門案例

首先是cuda程式設計,分三步,把資料從記憶體拷貝進視訊記憶體,gpu進行計算,將結果從視訊記憶體拷貝回記憶體。cuda c程式氣泡排序案例 include cuda runtime.h include device launch parameters.h include include defin...

平行計算 一 OpenMP

openmp是一種用於共享記憶體並行系統的多執行緒庫,其支援c c fortran,並且目前大多數常用編譯器,如vs內建編譯器 gcc icc等都提供了openmp的相關支援,以gcc為例編譯時只需要新增 fopenmp選項即可完成openmp 的編譯。openmp中包含了一套編譯器偽指令 執行時函...