OpenMP入门教程(一)hello world
原文鏈接
代碼在git
什么是OpenMP
Open Multi-Processing的縮寫(xiě),是一個(gè)應(yīng)用程序接口(API),可用于顯式指導(dǎo)多線程、共享內(nèi)存的并行性。
????在項(xiàng)目程序已經(jīng)完成好的情況下不需要大幅度的修改源代碼,只需要加上專用的pragma來(lái)指明自己的意圖,由此編譯器可以自動(dòng)將程序進(jìn)行并行化,并在必要之處加入同步互斥以及通信。當(dāng)選擇忽略這些pragma,或者編譯器不支持OpenMp時(shí),程序又可退化為通常的程序(一般為串行),代碼仍然可以正常運(yùn)作,只是不能利用多線程來(lái)加速程序執(zhí)行。OpenMP提供的這種對(duì)于并行描述的高層抽象降低了并行編程的難度和復(fù)雜度,這樣程序員可以把更多的精力投入到并行算法本身,而非其具體實(shí)現(xiàn)細(xì)節(jié)。對(duì)基于數(shù)據(jù)分集的多線程程序設(shè)計(jì),OpenMP是一個(gè)很好的選擇。
????OpenMP支持的語(yǔ)言包括C/C++、Fortran;而支持OpenMP的編譯器VS、gcc、clang等都行。可移植性也很好:Unix/Linux和Windows
OpenMP編程模型
內(nèi)存共享模型:OpenMP是專為多處理器/核,共享內(nèi)存機(jī)器所設(shè)計(jì)的。底層架構(gòu)可以是UMA和NUMA。即(Uniform Memory Access和Non-Uniform Memory Access)
- OpenMP僅通過(guò)線程來(lái)完成并行
- 一個(gè)線程的運(yùn)行是可由操作系統(tǒng)調(diào)用的最小處理單
- 線程們存在于單個(gè)進(jìn)程的資源中,沒(méi)有了這個(gè)進(jìn)程,線程也不存在了
- 通常,線程數(shù)與機(jī)器的處理器/核數(shù)相匹配,然而,實(shí)際使用取決與應(yīng)用程序
明確的并行
- OpenMP是一種顯式(非自動(dòng))編程模型,為程序員提供對(duì)并行化的完全控制
- 一方面,并行化可像執(zhí)行串行程序和插入編譯指令那樣簡(jiǎn)單
- 另一方面,像插入子程序來(lái)設(shè)置多級(jí)并行、鎖、甚至嵌套鎖一樣復(fù)雜
Fork-Join模型
- OpenMP就是采用Fork-Join模型
- 所有的OpenML程序都以一個(gè)單個(gè)進(jìn)程——master thread開(kāi)始,master threads按順序執(zhí)行知道遇到第一個(gè)并行區(qū)域
- Fork:主線程創(chuàng)造一個(gè)并行線程組
- Join:當(dāng)線程組完成并行區(qū)域的語(yǔ)句時(shí),它們同步、終止,僅留下主線程
數(shù)據(jù)范圍
- 由于OpenMP時(shí)是共享內(nèi)存模型,默認(rèn)情況下,在共享區(qū)域的大部分?jǐn)?shù)據(jù)是被共享的
- 并行區(qū)域中的所有線程可以同時(shí)訪問(wèn)這個(gè)共享的數(shù)據(jù)
- 如果不需要默認(rèn)的共享作用域,OpenMP為程序員提供一種“顯示”指定數(shù)據(jù)作用域的方法
嵌套并行
- API提供在其它并行區(qū)域放置并行區(qū)域
- 實(shí)際實(shí)現(xiàn)也可能不支持
簡(jiǎn)單使用
具體的:新建一個(gè)C/C++程序,注意一定要加上<omp.h>頭文件。
寫(xiě)一個(gè)并行的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++ 《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的OpenMP入门教程(一)hello world的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: isp 图像算法(四)之white ba
- 下一篇: OpenMP入门教程(二)reduce