OpenMP入門教程(一)

2022-05-02 11:03:06 字數 1610 閱讀 2927

open multi-processing的縮寫,是乙個應用程式介面(api),可用於顯式指導多執行緒、共享記憶體的並行性。

在專案程式已經完成好的情況下不需要大幅度的修改源**,只需要加上專用的pragma來指明自己的意圖,由此編譯器可以自動將程式進行並行化,並在必要之處加入同步互斥以及通訊。當選擇忽略這些pragma,或者編譯器不支援openmp時,程式又可退化為通常的程式(一般為序列),**仍然可以正常運作,只是不能利用多執行緒來加速程式執行。openmp提供的這種對於並行描述的高層抽象降低了並行程式設計的難度和複雜度,這樣程式設計師可以把更多的精力投入到並行演算法本身,而非其具體實現細節。對基於資料分集的多執行緒程式設計,openmp是乙個很好的選擇。

openmp支援的語言包括c/c++、fortran;而支援openmp的編譯器vs、gcc、clang等都行。可移植性也很好:unix/linux和windows

openmp程式設計模型

記憶體共享模型:openmp是專為多處理器/核,共享記憶體機器所設計的。底層架構可以是uma和numa。即(uniform memory access和non-uniform memory access)

基於執行緒的並行性

明確的並行

fork-join模型

資料範圍

巢狀並行

動態執行緒

在vs2017中就可以使用,具體的:新建乙個c/c++程式,專案--屬性--c/c++--語言--openmp支援,把openmp開啟。然後編寫帶編譯指令的並行程式,注意一定要加上標頭檔案。

寫乙個並行的hello world

1 #include 2 #include 3 #include 4

5int

main()623

24 } /*

all threads join master thread and disband

*/25

return0;

26 }

執行結果如下:

注:我的電腦預設是4個執行緒,不同的電腦執行結果不同,就算是同一部電腦每次執行的結果也可能不同(4個執行緒並行執行,沒有確定的先後順序)

也可以直接使用gcc加上-fopenmp編譯,for example:

1 g++ test.cpp -o test -fopenmp

2 ./test

(不知道我的gcc不行,只能用g++,枯了)

補:直到原因了,gcc預設編譯鏈結不會鏈結c++標準庫,可以使用g++編譯鏈結(如上),也可以在gcc鏈結時顯示指定鏈結 -lstdc++

gcc test.cpp -o test -fopenmp -lstdc++
至於openmp詳細的編寫格式和意義可以看這篇部落格。

Docker 入門教程(一)

docker有不少有趣的功能,通過本教程相信你會更好地理解它們。docker的特性主要包括以下幾點 三個基本要素分別是 在討論docker元件和基本要素如何互動之前,讓我們來談談docker的支柱。docker使用以下作業系統的功能來提高容器技術效率 執行任何應用程式,都需要有兩個基本步驟 構建乙個...

c 入門教程 一

事前日常敲黑板 1 從現在開始 我寫的東西不一定完全是正確的,有些只是看了看理論,沒有實際驗證過,有些驗證過但是不同的編譯器會有不同的效果,所以建議有能力的話手動去試一下。我說的和書上寫的都不一定是對的,但是編譯器實際跑出來的結果在這個編譯器 假裝就是昨天那個軟體了 上就是對的。2 明天的內容可能會...

Robotframework入門教程(一)

robotframework 入門教程 一 最近工作中用robot framework框架來做自動化,所以,花時間學習了一下,網上好的文件不多,大多都是複製貼上如何安裝環境。要麼就是介紹了一堆ride的介面,活活把這麼強大的乙個工具講成了個photoshop,我目前用了1個多月,這個工具很強大,簡單...