【C++】OpenMP简介

这篇具有很好参考价值的文章主要介绍了【C++】OpenMP简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景知识

1、program作用

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

#pragma 的语法如下:

#pragma directive_name optional_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 -x c++  /dev/null | grep -F __cplusplus

版本对照表

C++标准 __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 .
它是一个跨平台的多线程实现, 能够使串行代码经过最小的改动自动转化成并行的。具有广泛的适应性。这个最小的改动,有时候只是一行编译原语!(在高阶示例中,我们将演示并评估加速性能)
具体实现是通过分析编译原语#pragma,将用原语定义的代码块,自动转化成并行的线程去执行。每个线程都将分配一个独立的id. 最后再合并线程结果。

OpenMP 入门与实例分析

三、关键字

1、reduction 作用

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

#pragma omp parallel for reduction(+:sum)
for (i = 0; i < n; i++) {
    sum += a[i];
}

在这个例子中,我们使用了 + 运算符作为 reduction 操作符,并且要对变量 sum 进行归约。在执行并行循环时,每个线程都会计算一部分的 sum 值,最终将这些值相加得到最终的结果。
其他的 reduction 操作符包括 -、*、&、|、^ 和 &&、||。可以根据具体应用场景选择适当的操作符。
需要注意的是,被归约的变量必须满足以下条件之一:

  • 全局变量(全局作用域)
  • 静态变量(静态存储期)
  • 分配在堆上的变量
  • 在 parallel 或 task region 中定义的私有变量

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

2、default(shared)作用

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

请注意,使用default(shared)可能会导致数据竞争和不一致的结果。因此,在使用并行计算时,必须小心谨慎地选择变量的共享方式,并采取适当的同步措施来避免数据冲突。文章来源地址https://www.toymoban.com/news/detail-450845.html

到了这里,关于【C++】OpenMP简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 1分钟了解C语言正确使用字节对齐及#pragma pack的方法

    ​ C/C++编译器的缺省字节对齐方式为自然对界。即在缺省情况下,编译器为每一个变量或是数据单元按其自然对界条件分配空间。 在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储(成员之间可能有

    2024年02月02日
    浏览(57)
  • 第一章 C++语言简介之——c++语言的特点

    C++是一种 编译式的、通用式、大小写敏感 的编程语言, 完全支持面向对象程序设计 。 C++语言与C语言相比,在求解问题方法上进行的最大改进是 面向对象 Windows环境下,由C++源程序文件编译而成的 目标文件的扩展名是.obj , 源文件的扩展名为.cpp , 所有的obj文件连接成为

    2024年01月16日
    浏览(45)
  • C语言结构体字节对齐(内存对齐)之#pragma pack和__attribute__((packed)的使用

    在不使用 #pragma pack 和 __attribute__((packed) 等选项来自定义字节对齐大小的情况下,关于正常字节对齐的描述,可参考博文: C/C++计算类/结构体和联合体(union)所占内存大小(内存对齐问题)_联合体占用的内存空间_SOC罗三炮的博客-CSDN博客 同学可以尝试将char f 注释,最后将

    2024年02月12日
    浏览(46)
  • 【C++ 程序设计】第 1 章:C++ 语言简介

    目录 一、C++ 语言的发展简史 二、C++ 语言的特点 (1)基本的输入/输出 (2)头文件和命名空间 (3)强制类型转换运算符  (4)函数参数的默认值  (5)引用和函数参数的传递 ① 引用的定义 ② 引用在函数中的使用 (6)const 与指针共同使用 (7)内联函数  (8)函数的

    2024年02月07日
    浏览(90)
  • 科普系列:CAN总线错误帧及排查方法简介:错误帧的基础知识 | 错误帧的作用 | 错误类型 | 错误帧的类型 | 实车上出现错误帧的主要原因 | 错误帧的排查方法示例

    CAN帧有多种格式,错误帧作为CAN帧中独特的一种,了解其作用,类型与产生原因,对于进行测试以及开发有很大的帮助,本文将对错误帧的相关基础知识以及后续的分析排查进行介绍。 错误帧是CAN总线用于进行错误通知的报文,可以将任何一个节点发现的错误通知给其他节点

    2024年02月03日
    浏览(49)
  • 从C语言到C++:C++入门知识(2)

    朋友们、伙计们,我们又见面了,本期来给大家解读一下有关C++的基础知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏: C语言:从入门到精通 数据结构专栏: 数据结构 个  人  主  页 : stackY、 目录 前言: 1. 函数重载

    2024年02月08日
    浏览(44)
  • 从C语言到C++:C++入门知识(1)

    朋友们、伙计们,我们又见面了,本期来给大家解读一下有关C++语言的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏: C语言:从入门到精通 数据结构专栏: 数据结构 个  人  主  页 : stackY、   目录 前言: 1. 什么

    2024年02月07日
    浏览(58)
  • 江科大自化协STM32学习笔记(部分C语言知识、STM32简介和GPIO口的使用)

    本篇文章是根据B站UP主江科大自化协的教学视频STM32入门教程-2023持续更新中,在了解、学习与实操后整理的学习笔记,内容部分来自UP主的课程资料,并包含了一些个人的理解,如有谬误欢迎指正,详细知识点可以观看UP主的视频进行了解。 希望大家都能早日掌握单片机。

    2024年02月01日
    浏览(53)
  • 【C++】——C++基础知识点(C++和C语言的区别)

    C++是在C的基础之上,容纳进去了面向对象编程思想,并增加了许多有用的库,以及编程范式 等。熟悉C语言之后,对C++学习有一定的帮助。 本博客目标: 1.补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的,比如:作用域方面、IO方面、函数方面、指

    2024年02月03日
    浏览(53)
  • C++入门知识点——解决C语言不足

    😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️ 💥个人主页:🔥🔥🔥大魔王🔥🔥🔥 💥所属专栏:🔥魔王的修炼之路–C++🔥 如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的 点赞 👍和 关注 💖,支持一下博主

    2024年02月12日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包