OpenMP入门教程(一)hello world
生活随笔
收集整理的這篇文章主要介紹了
OpenMP入门教程(一)hello world
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
原文鏈接
代碼在git
什么是OpenMP
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)
- OpenMP僅通過線程來完成并行
- 一個線程的運行是可由操作系統調用的最小處理單
- 線程們存在于單個進程的資源中,沒有了這個進程,線程也不存在了
- 通常,線程數與機器的處理器/核數相匹配,然而,實際使用取決與應用程序
明確的并行
- OpenMP是一種顯式(非自動)編程模型,為程序員提供對并行化的完全控制
- 一方面,并行化可像執行串行程序和插入編譯指令那樣簡單
- 另一方面,像插入子程序來設置多級并行、鎖、甚至嵌套鎖一樣復雜
Fork-Join模型
- OpenMP就是采用Fork-Join模型
- 所有的OpenML程序都以一個單個進程——master thread開始,master threads按順序執行知道遇到第一個并行區域
- Fork:主線程創造一個并行線程組
- Join:當線程組完成并行區域的語句時,它們同步、終止,僅留下主線程
數據范圍
- 由于OpenMP時是共享內存模型,默認情況下,在共享區域的大部分數據是被共享的
- 并行區域中的所有線程可以同時訪問這個共享的數據
- 如果不需要默認的共享作用域,OpenMP為程序員提供一種“顯示”指定數據作用域的方法
嵌套并行
- API提供在其它并行區域放置并行區域
- 實際實現也可能不支持
簡單使用
具體的:新建一個C/C++程序,注意一定要加上<omp.h>頭文件。
寫一個并行的Hello World
#include <omp.h> #include <stdio.h> #include <stdlib.h>int main() {int nthreads, tid;/* Fork a team of threads giving them their own copies of variables */#pragma omp parallel private(nthreads, tid){/* Obtain thread number */tid = omp_get_thread_num();printf("Hello World from thread = %d\n", tid);/* Only master thread does this */if (tid == 0){nthreads = omp_get_num_threads();printf("Number of threads = %d\n", nthreads);}} /* All threads join master thread and disband */return 0; }也可以直接使用gcc加上-fopenmp編譯,For example:
g++ test.cpp -o test -fopenmp ./test gcc test.cpp -o test -fopenmp -lstdc++ 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的OpenMP入门教程(一)hello world的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: isp 图像算法(四)之white ba
- 下一篇: OpenMP入门教程(二)reduce