日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenMP入门教程(一)hello world

發布時間:2025/4/5 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。