OpenMP應該是歷史比較悠久的並行工具吧,至少我最早知道的是它,做爲共享存儲標準,它是爲多處理器多核心的設備上編寫並行程序而設計的一個應用編程接口,包括一套編譯知道語言和一個支持它的函數庫。
上述都是比較官方的話語,對我而言,它有兩個優勢:其一爲可結合標準的C/C++(外加Fortran)進行工做,而且基本應用較爲簡單,易於學習(僅限於皮毛);其二爲支持跨平臺,VS中可經過編輯屬性直接開啓此功能,Linux只要包含頭文件就能夠了,支持gcc,g++編譯器,這也就下降了安裝配置的難度。編程
簡單介紹下OpenMP編譯指導語句:函數
除此以外,還有幾個比較關鍵的函數:工具
OpenMP中,標準的並行模式爲fork/join模式,簡單將就是隻有一個主線程(通常是按照串行執行的),當須要並行執行時,就會派生(fork)出多個線程,此時,主線程與這些派生線程協同工做,在並行代碼段執行結束是,派生的線程掛起,控制流從新回到(join)主線程中,知道完成整個程序。(晚些時候會附個圖說明)學習
從如今的應用看,這個組合佔了半壁江山,因此仍是須要好好看看的,先上個示例代碼:線程
#單層for循環更改 int b[300] #pragma omp parallel for for(int i = 0; i < 300; i++) b[i] = i;
上述代碼即完成了此for
循環的並行化,比較簡單,也比較經常使用,但有時候也會出現用到雙重循環,這就須要進化下代碼了:設計
#雙重循環 #pragma omp parallel for private(j) for(int i = 0; i < 100; i++) for(int j = 0; j < n; j++) a[i][j] = j;
雙重循環就有點難度了,須要講解下, parallel for
不用解釋了, private
聲明私有變量,保證 j
的獨立性,使其餘線程沒法訪問此該變量。code
parallel for
及其附屬佔了半壁江山,那剩下的半壁江山就是即將介紹的:parallel sections
,該方法是爲了實現功能並行,簡單講就是你能夠分配線程a實現功能A,線程b實現功能B......待所有完成後,再統一回到主線程中:索引
#代碼塊功能並行 #pragma omp parallel sections { #pragma omp section { a = A; } #pragma omp section { b = B; } }
其中,#pragma omp section
中執行具備獨立功能的代碼塊,方便靈活使用。接口