什麼是openmp?
openmp是由openmp architecture review board牽頭提出的,並已被廣泛接受的,用於共享記憶體並行系統的多處理器程式設計的一套指導性的編譯處理方案(compiler directive)。openmp支援的程式語言包括c語言、c++和fortran;而支援openmp的編譯器包括sun compiler,gnu compiler和intel compiler等。openmp提供了對並行演算法的高層的抽象描述,程式設計師通過在源**中加入專用的pragma來指明自己的意圖,由此編譯器可以自動將程式進行並行化,並在必要之處加入同步互斥以及通訊。當選擇忽略這些pragma,或者編譯器不支援openmp時,程式又可退化為通常的程式(一般為序列),**仍然可以正常運作,只是不能利用多執行緒來加速程式執行。
openmp 和 pthread 一樣都是共享記憶體程式設計的api但是,他們有許多本質的不同。簡單來說pthread 是比較偏底層的程式設計方式,由程式設計師分別管理每乙個程序的行為與姿態。相反的,openmp 則要求編譯器支援某些操作,所以完全有可能本地的編譯器並不能把程式編譯成並行程式。
代價就是,每個執行緒行為的每乙個細節都需要我們自己定義,他被明確的設計為可以用來對已有序列程式進行增量式的並行化。
hello 程式例程
#include#include#includevoid hello(void); int main(int argc,char **argv) void hello(void)
程式使用巨集來啟動每乙個執行緒,類似pthread 明顯,openmp 比pthread 層次更高。 parallel 是一條指令,表明結構化**塊。 注意:標準輸出被所有的執行緒共享,每乙個執行緒都可以執行輸出語句,對於標準輸出的訪問沒有排程,因此執行緒列印他們結果的實際順序是不確定的。 錯誤檢查相關: step 1:檢查傳參是否正確。 step2:編譯器支援openmp
#ifdef _openmp
#include#endif
openmp 的互斥指令
#pragma omp critical
exp.....
指令下的程式只能被互斥的執行。 歸約操作符:是乙個二元操作,歸約就是將相同的歸約操作符重複的應用到運算元序列來得到乙個計算結果。另外,所有操作的中間結果儲存在同乙個變數裡:歸約變數。openmp 建立乙個臨界區,並且在臨界區中,將儲存在私有變數中的值進行相加。
reduction(:)
#pragma omp parallel for num_threads(thread_count) \
for(i = 1;i <= n-1;i++){
注意:只能並行化for 迴圈。不能處理while do_while 迴圈。並且不能並行化帶有其他出口的for迴圈。 要點: openmp不檢查被parallel for指令並行化的迴圈所包含的迭代間的依賴關係。而是由程式設計師來識別這依賴關係。 乙個或者給更多的迭代結果依賴於其他迭代的迴圈,一般不能被openmp 爭取的並行化。一般是資料依賴和迴圈依賴。 迴圈排程: 系統會粗略的優化迴圈,大體使用塊劃分的方式,但是我們有時需要自己規定執行緒的排程方式。api為我們提供了指令schedule 指令幫助我們自定義迴圈的排程。
#pragma omp parallel for num_threads(thread_num) \reduction(+:sum) schedul(static,1)
for( i = 0;i < = n;i++)
sum += f(i)
一般式:
schedule ([,])
OpenMP並行程式設計(一)
openmp並行程式設計 一 openmp是乙個支援共享儲存並行設計的庫,特別適宜多核cpu上的並行程式設計。今天在雙核cpu機器上試了一下openmp並行程式設計,發現效率方面超出想象,因此寫出來分享給大家。在vc8.0中專案的屬性對話方塊中,左邊框裡的 配置屬性 下的 c c 下的 語言 頁裡,...
OpenMP並行程式設計(一)
openmp並行程式設計 一 openmp是乙個支援共享儲存並行設計的庫,特別適宜多核cpu上的並行程式設計。今天在雙核cpu機器上試了一下openmp並行程式設計,發現效率方面超出想象,因此寫出來分享給大家。在vc8.0中專案的屬性對話方塊中,左邊框裡的 配置屬性 下的 c c 下的 語言 頁裡,...
OpenMP並行程式設計(一)
openmp並行程式設計 一 openmp是乙個支援共享儲存並行設計的庫,特別適宜多核cpu上的並行程式設計。今天在雙核cpu機器上試了一下openmp並行程式設計,發現效率方面超出想象,因此寫出來分享給大家。在vc8.0中專案的屬性對話方塊中,左邊框裡的 配置屬性 下的 c c 下的 語言 頁裡,...