C++?OpenMP簡(jiǎn)單介紹
一、背景知識(shí)
1、program作用
#pragma 是 C 和 C++ 語(yǔ)言中的一個(gè)預(yù)處理指令。它主要用于向編譯器發(fā)送特定的信息或者指示,以便控制編譯過程。#pragma 通常與編譯器特定的選項(xiàng)或功能一起使用,因此它的具體行為和實(shí)現(xiàn)可能因不同的編譯器而有所不同。
#pragma 的語(yǔ)法如下:
#pragma directive_name optional_arguments
其中,directive_name 是一個(gè)編譯器識(shí)別的指示名稱,optional_arguments 是可選的參數(shù)。
#pragma 的一些常見用途包括:
- 優(yōu)化:可以通過向編譯器提供優(yōu)化建議來(lái)改善生成的代碼性能。例如,#pragma omp parallel for 用于 OpenMP 并行編程,以在循環(huán)中實(shí)現(xiàn)線程級(jí)并行。
- 診斷:可以啟用或禁用特定的編譯器警告。例如,#pragma warning(disable: 4996) 可以在 Visual Studio 中禁用特定警告。
- 代碼段:可以將代碼段駐留在特定的內(nèi)存區(qū)域。例如,#pragma code_seg(“MY_SECTION”) 可以將代碼段放置在名為 “MY_SECTION” 的內(nèi)存區(qū)域中。
- 初始化和終止函數(shù):可以指定在程序啟動(dòng)和退出時(shí)自動(dòng)執(zhí)行的函數(shù)。例如,#pragma startup func1 和 #pragma exit func2 分別指定 func1 和 func2 在程序啟動(dòng)和退出時(shí)執(zhí)行。
- 數(shù)據(jù)對(duì)齊:可以控制數(shù)據(jù)結(jié)構(gòu)成員的對(duì)齊方式。例如,#pragma pack(push, 1) 和 #pragma pack(pop) 分別設(shè)置和恢復(fù)數(shù)據(jù)對(duì)齊方式。
由于 #pragma 可能因編譯器而異,建議查閱編譯器的文檔以了解支持的 #pragma 指令和相關(guān)功能。對(duì)于可移植性考慮,通常應(yīng)盡量避免使用編譯器特定的 #pragma。
2、C++不同版本區(qū)別
C++ 有多個(gè)版本,其中比較常見的包括:
- C++98/03:這是最初的 C++ 標(biāo)準(zhǔn),也稱為 ISO/IEC 14882:1998(C++98),后來(lái)進(jìn)行了一些小修訂,稱為 ISO/IEC 14882:2003(C++03)。該標(biāo)準(zhǔn)引入了類、繼承、多態(tài)、模板等面向?qū)ο缶幊烫匦?。它還支持異常處理、RTTI(運(yùn)行時(shí)類型識(shí)別)和 STL(標(biāo)準(zhǔn)模板庫(kù))等功能。
- C++11:也稱為 ISO/IEC 14882:2011。該標(biāo)準(zhǔn)在 C++98 的基礎(chǔ)上增加了大量新功能,如 lambda 表達(dá)式、右值引用、智能指針、constexpr 函數(shù)、nullptr 關(guān)鍵字、委托構(gòu)造函數(shù)、變長(zhǎng)模板等等。同時(shí),它還對(duì)語(yǔ)言規(guī)范進(jìn)行了一些修改和增強(qiáng),以提高效率、可讀性和可維護(hù)性。
- C++14:也稱為 ISO/IEC 14882:2014。該標(biāo)準(zhǔn)在 C++11 的基礎(chǔ)上進(jìn)行了一些小修訂和改進(jìn)。它主要增加了一些新特性,如二進(jìn)制字面量、泛型 lambda 表達(dá)式、返回類型推導(dǎo)等。
- C++17:也稱為 ISO/IEC 14882:2017。該標(biāo)準(zhǔn)在 C++14 的基礎(chǔ)上增加了許多新功能,如結(jié)構(gòu)化綁定、內(nèi)聯(lián)變量、if constexpr、折疊表達(dá)式等。它還對(duì)語(yǔ)言規(guī)范進(jìn)行了大量修改和增強(qiáng),以便提高效率、可讀性和可維護(hù)性。
- C++20:也稱為 ISO/IEC 14882:2020。該標(biāo)準(zhǔn)在 C++17 的基礎(chǔ)上增加了許多新特性,如 concepts(概念)機(jī)制、三路比較運(yùn)算符、協(xié)程、格式化 I/O 庫(kù)等等。同時(shí),它還增強(qiáng)了現(xiàn)有的功能,并修復(fù)了一些缺陷和錯(cuò)誤。
查看g++默認(rèn)使用的C++版本
g++ -dM -E -x c++ /dev/null | grep -F __cplusplus
版本對(duì)照表
C++標(biāo)準(zhǔn) | __cplusplus值 |
---|---|
C++ 11 | 201103L |
C++ 14 | 201402L |
C++ 17 | 201703L |
指定不同版本編譯器
vim ~/.bashrc echo alias g17=\'g++ -std=c++17\' >> ~/.bashrc source ~/.bashrc
二、什么是OpenMP
OpenMP 是一套 C++ 并行編程框架, 也支持 Forthan .
它是一個(gè)跨平臺(tái)的多線程實(shí)現(xiàn), 能夠使串行代碼經(jīng)過最小的改動(dòng)自動(dòng)轉(zhuǎn)化成并行的。具有廣泛的適應(yīng)性。這個(gè)最小的改動(dòng),有時(shí)候只是一行編譯原語(yǔ)!(在高階示例中,我們將演示并評(píng)估加速性能)
具體實(shí)現(xiàn)是通過分析編譯原語(yǔ)#pragma,將用原語(yǔ)定義的代碼塊,自動(dòng)轉(zhuǎn)化成并行的線程去執(zhí)行。每個(gè)線程都將分配一個(gè)獨(dú)立的id. 最后再合并線程結(jié)果。
三、關(guān)鍵字
1、reduction 作用
在 OpenMP 中,reduction 用于將一個(gè)變量的值從多個(gè)線程中合并為單個(gè)結(jié)果。該指令提供了一個(gè)簡(jiǎn)單的方法來(lái)實(shí)現(xiàn)并行計(jì)算中的歸約操作。
下面是 reduction 的語(yǔ)法示例:
#pragma omp parallel for reduction(+:sum) for (i = 0; i < n; i++) { sum += a[i]; }
在這個(gè)例子中,我們使用了 + 運(yùn)算符作為 reduction 操作符,并且要對(duì)變量 sum 進(jìn)行歸約。在執(zhí)行并行循環(huán)時(shí),每個(gè)線程都會(huì)計(jì)算一部分的 sum 值,最終將這些值相加得到最終的結(jié)果。
其他的 reduction 操作符包括 -、*、&、|、^ 和 &&、||??梢愿鶕?jù)具體應(yīng)用場(chǎng)景選擇適當(dāng)?shù)牟僮鞣?br />需要注意的是,被歸約的變量必須滿足以下條件之一:
- 全局變量(全局作用域)
- 靜態(tài)變量(靜態(tài)存儲(chǔ)期)
- 分配在堆上的變量
- 在 parallel 或 task region 中定義的私有變量
另外,OpenMP 還支持自定義數(shù)據(jù)類型的歸約操作,需要通過 omp declare reduction 指令來(lái)聲明自定義操作符和數(shù)據(jù)類型的歸約方式。
2、default(shared)作用
default(shared)是OpenMP的一個(gè)指令,用于指定在并行計(jì)算中所有變量都是共享的。這意味著變量的存儲(chǔ)將在所有線程之間共享,并且任何對(duì)變量的更改都將影響所有線程。使用此指令可以確保所有線程都使用相同的數(shù)據(jù),因?yàn)樗鼈兌伎梢宰x取和修改共享變量。
請(qǐng)注意,使用default(shared)可能會(huì)導(dǎo)致數(shù)據(jù)競(jìng)爭(zhēng)和不一致的結(jié)果。因此,在使用并行計(jì)算時(shí),必須小心謹(jǐn)慎地選擇變量的共享方式,并采取適當(dāng)?shù)耐酱胧﹣?lái)避免數(shù)據(jù)沖突。
到此這篇關(guān)于C++ OpenMP簡(jiǎn)介的文章就介紹到這了,更多相關(guān)c++ OpenMP簡(jiǎn)介內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Visual C++ 常用數(shù)據(jù)類型轉(zhuǎn)換方法詳解
本文純粹是總結(jié)一下有關(guān)類型轉(zhuǎn)換的貼子,需要的朋友可以參考下2017-06-06關(guān)于c語(yǔ)言中輸出字符指針的相關(guān)問題
這篇文章主要介紹了關(guān)于c語(yǔ)言中輸出字符指針的相關(guān)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07C語(yǔ)言棧與隊(duì)列相互實(shí)現(xiàn)詳解
棧和隊(duì)列,嚴(yán)格意義上來(lái)說,也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為 "一對(duì)一" 的數(shù)據(jù),但由于它們比較特殊,本章講解分別用隊(duì)列實(shí)現(xiàn)棧與用棧實(shí)現(xiàn)隊(duì)列2022-04-04Visual Studio Community 2022(VS2022)安裝圖文方法
這篇文章主要介紹了Visual Studio Community 2022(VS2022)安裝方法,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09初識(shí)C++的const關(guān)鍵字,常量與常變量
這篇文章主要為大家詳細(xì)介紹了C++的const關(guān)鍵字,常量與常變量,使用數(shù)據(jù)庫(kù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03C語(yǔ)言編程中函數(shù)的基本學(xué)習(xí)教程
這篇文章主要介紹了C語(yǔ)言編程中函數(shù)的基本學(xué)習(xí)教程,其中著重講到了傳值調(diào)用與參數(shù),需要的朋友可以參考下2015-12-12C語(yǔ)言計(jì)算字符串最后一個(gè)單詞的長(zhǎng)度
大家好,本篇文章主要講的是C語(yǔ)言計(jì)算字符串最后一個(gè)單詞的長(zhǎng)度,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12C++使用JsonCpp庫(kù)操作json格式數(shù)據(jù)示例
這篇文章主要介紹了C++使用JsonCpp庫(kù)操作json格式數(shù)據(jù),結(jié)合實(shí)例形式詳細(xì)分析了JsonCpp庫(kù)的下載及C++使用JsonCpp庫(kù)對(duì)json格式數(shù)據(jù)序列化相關(guān)操作技巧,需要的朋友可以參考下2017-06-06