推广 热搜: 二手  净利2626万  北京  二手车  SMM废铜现货交易日评  企业  全国  汽车  三星  公司 

关于C++和OpenMP的介绍

   日期:2024-08-03     来源:www.rcyhyy.com    作者:二手网    浏览:343    评论:0    
核心提示:[db:简介]
1、背景常识1、program用途

#pragma 是 C 和 C++ 语言中的一个预处置指令。它主要用于向编译器发送特定的信息或者指示,以便控制编译过程。#pragma 一般与编译器特定的选项或功能一块用,因此它的具体行为和达成可能因不一样的编译器而有所不同。

#pragma 的语法如下:

#pragmadirective_nameoptional_arguments

其中,directive_name 是一个编译器辨别的指示名字,optional_arguments 是可选的参数。

#pragma 的一些容易见到作用与功效包含:

优化:可以通过向编译器提供优化建议来改变生成的代码性能。比如,#pragma omp parallel for 用于 OpenMP 并行编程,以在循环中达成线程级并行。

诊断:可以启用或禁用特定的编译器警告。比如,#pragma warning(disable: 4996) 可以在 Visual Studio 中禁用特定警告。

代码段:可以将代码段驻留在特定的内存地区。比如,#pragma code_seg(MY_SECTION) 可以将代码段放置在名为 MY_SECTION 的内存地区中。

初始化和终止函数:可以指定在程序启动和退出时自动实行的函数。比如,#pragma startup func1 和 #pragma exit func2 分别指定 func1 和 func2 在程序启动和退出时实行。

数据对齐:可以控制数据结构成员的对齐方法。比如,#pragma pack(push, 1) 和 #pragma pack(pop) 分别设置和恢复数据对齐方法。

因为 #pragma 可能因编译器而异,建议查阅编译器的文档以知道支持的 #pragma 指令和有关功能。对于可移植性考虑,一般应尽可能防止用编译器特定的 #pragma。

2、C++不同版本不同

C++ 有多个版本,其中经常见到的包含:

C++98/03:这是刚开始的 C++ 标准,也称为 ISO/IEC 14882:1998(C++98),后来进行了一些小修订,称为 ISO/IEC 14882:2003(C++03)。该标准引入了类、继承、多态、模板等面向对象编程特质。它还支持异常处置、RTTI(运行时种类辨别)和 STL(标准模板库)等功能。

C++11:也称为 ISO/IEC 14882:2011。该标准在 C++98 的基础上增加了很多新功能,如 lambda 表达式、右值引用、智能指针、constexpr 函数、nullptr 关键词、委托架构函数、变长模板等等。同时,它还对语言规范进行了一些修改和增强,以提升效率、可读性和可维护性。

C++14:也称为 ISO/IEC 14882:2014。该标准在 C++11 的基础上进行了一些小修订和改进。它主要增加了一些新特质,如二进制字面量、泛型 lambda 表达式、返回种类推导等。

C++17:也称为 ISO/IEC 14882:2017。该标准在 C++14 的基础上增加了很多新功能,如结构化绑定、内联变量、if constexpr、折叠表达式等。它还对语言规范进行了很多修改和增强,以便提升效率、可读性和可维护性。

C++20:也称为 ISO/IEC 14882:2020。该标准在 C++17 的基础上增加了很多新特质,如 concepts(定义)机制、三路比较运算符、协程、格式化 I/O 库等等。同时,它还增强了现有些功能,并修复了一些缺点和错误。

查询g++默认用的C++版本

g++-dM-E-xc++/dev/null|grep-F__cplusplus

版本对照表

C++标准__cplusplus值C++ 11201103LC++ 14201402LC++ 17201703L

指定不同版本编译器

vim~/.bashrcechoaliasg17=/g++-std=c++17/~/.bashrcsource~/.bashrc2、什么是OpenMP

OpenMP 是一套 C++ 并行编程框架, 也支持 Forthan .
它是一个跨平台的多线程达成, 可以使串行代码经过最小的改动自动转化成并行的。具备广泛的适应性。这个最小的改动,有时只不过一行编译原语!(在高阶示例中,大家将演示并评估加速性能)
具体达成是通过剖析编译原语#pragma,将用原语概念的代码块,自动转化成并行的线程去实行。每一个线程都将分配一个独立的id. 最后再合并线程结果。

OpenMP共享内存的并行编程框架基础知识解析

3、关键词1、reduction 用途

在 OpenMP 中,reduction 用于将一个变量的值从多个线程中合并为单个结果。该指令提供了一个简单的办法来达成并行计算中的归约操作。
下面是 reduction 的语法示例:

#pragmaompparallelforreduction(+:sum)for(i=0;in;i++){sum+=a[i];}

在这个例子中,大家用了 + 运算符作为 reduction 操作符,并且要对变量 sum 进行归约。在实行并行循环时,每一个线程都会计算一部分的 sum 值,最后将这类值相加得到最后的结果。
其他的 reduction 操作符包含 -、*、、|、^ 和 、||。可以参考具体应用场景选择合适的操作符。
应该注意的是,被归约的变量需要满足以下条件之1、

全局变量(全局用途域)

静态变量(静态存储期)

分配在堆上的变量

在 parallel 或 task region 中概念的私有变量

另外,OpenMP 还支持自概念数据种类的归约操作,需要通过 omp declare reduction 指令来声明自概念操作符和数据种类的归约方法。

2、default(shared)用途

default(shared)是OpenMP的一个指令,用于指定在并行计算中所有变量都是共享的。这意味着变量的存储将在所有线程之间共享,并且任何对变量的更改都将影响所有线程。用此指令可以确保所有线程都用相同的数据,由于它们都可以读取和修改共享变量。

请注意,用default(shared)或许会致使数据角逐和不同的结果。因此,在用并行计算时,需要谨慎地选择变量的共享方法,并采取适合的同步手段来防止数据冲突。

 
标签: C++ OpenMP
打赏
 
更多>同类二手资讯
0相关评论

热门推荐
推荐图文
推荐二手资讯
点击排行
网站首页  |  关于我们  |  联系方式  |  免责声明  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报