关于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)可能会导致数据竞争和不一致的结果。因此,在使用并行计算时,必须小心谨慎地选择变量的共享方式,并采取适当的同步措施来避免数据冲突。

关于关于C++和OpenMP的介绍就分享到这里了,希望以上内容可以对大家有一定的参考价值,可以学以致用。如果喜欢本篇文章,不妨把它分享出去让更多的人看到。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


咪咕视频怎么进行投屏?咪咕视频是一款视频播放器,用户们可以在咪咕视频中观看短视频、热门综艺等,那么在咪咕视频该怎么进行投屏呢?下面就给大家分享咪咕视频投屏方法。咪咕视频怎么进行投屏方法
阿里云盘设备登录满了怎么踢人?阿里云盘有同时登陆的人数限制,如果登陆满了,别人就不能登陆了,但是我们可以踢人,下面我们就来看看阿里云盘设备登录满了无法登陆的解决办法。阿里云盘设备登录满了怎么退详细操作
今天小编给大家分享的是关于Express框架定制路由的介绍,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
这篇文章主要介绍了SpringBoot实现自动装配的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。1. 什么是自动装配在传统的Spring框架中...
今天小编给大家分享的是关于C++和OpenMP的介绍,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。
本篇文章和大家了解一下C语言结构体指针具体怎么使用。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。在 C语言中,结构体指针是一种非常有...
今天小编给大家分享的是MongoDB连接本地失败如何解决,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的...
本篇文章和大家了解一下DockerCompose中限制容器的CPU和内存使用的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。正文最近我在...
今天小编给大家分享的是jupyternotebook如何更换环境,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有
今天小编给大家分享的是如何使用R语言实现自动文摘,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦...
今天小编给大家分享的是parseInt()函数异常行为是什么原因,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收...
今天小编给大家分享的是在ASP.NETCoreWebAPI中处理Patch请求的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结...
这篇文章主要介绍了TS从目录中提取所有指定扩展名文件的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。“.ts”是一种高清视频封装
这篇文章主要介绍了Pycharm如何安装第三方库、安装位置以及镜像,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。前言Pycharm安装第三方库继...
今天小编给大家分享的是Anaconda查看自己目前安装的包的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有
本篇文章和大家了解一下JS的鼠标监听mouseup鼠标抬起失效如何解决。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。一、起因及解决由于很少...
本篇文章和大家了解一下Rust语言中Copy和Clone的用法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1.CopytraitCopytr...
今天小编给大家分享的是js如何获取今天、昨天、明天的日期,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收...
这篇“axuer怎么调分辨率”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章...
MAC文件已损坏打不开怎么办?在MAC电脑中安装软件的时候会遇到XXX软件已损坏的错误提示,导致软件无法安装,该如何解决呢?下面小编给大家介绍下解决方法。解决方法1、MacOS10.15及以上新系统出现应用提示损坏打不开的解决方法:打开终端(屏幕下方D...