【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简介
一、背景知识 1、program作用 #pragma 是 C 和 C 语言中的一个预处理指令。它主要用于向编译器发送特定的信息或者指示,以便控制编译过程。#pragma 通常与编译器特定的选项或功能一起使用,因此它的具体行为和实现可能因不同的编译器而有所不同。 #pra…...
Unity HybridCLR 热更工具学习日记(一)
目录 导入HybridCLR包、安装设置相关选项 导入HybridCLR包 先找到HybridCLR包的git地址:https://github.com/focus-creative-games/hybridclr 复制包的http地址,打开unity - window - package Manager;点击左上角的 选择Add Package for…...
内网渗透(七十五)之域权限维持之DCShadow
DCShadow 2018年1月24日,在BlueHat安全会议上,安全研究员Benjamin Delpy 和 Vincent Le Toux 公布了针对微软活动目录域的一种新型攻击技术------DCShaow。利用该攻击技术,具有域管理员权限或企业管理员权限的恶意攻击者可以创建恶意域控,然后利用域控间正常同步数据的功能…...
JAVA日常练习—习题5
1.机器人类及其子类 设计一个机器人的抽象类,具有质量(double)、名字(String)等属性;具有设置属性值方法和获得并打印属性值的方法,还有一个运动的抽象方法move()。设计电动汽车类和飞行器类&a…...
nuitka打包python的PyQt5成exe可执行文件
使用nuitka打包python的PyQt5 可以打包多文件,也可以打包单文件。 使用的python版本是3.8.10 1、下载gcc 方式1:可以到网站下载,点我跳转 方式2:可以直接去网盘下载,点我跳转 提取码:8888 网盘里面也有python3.8.10的安装包,下载后直接安装即可。 下载64位 win…...
数据(安全)治理面临的挑战和机遇
数据治理,数据安全治理面临的挑战就是该市场的机遇,国内外相关实践和成功的商业案例是存在的,国内目前实施主要不在考虑主体数据或另开一个新项目进行数据采集,清洗,展示,但很少有真正的通过深度学习工具提升企业运营效能,正如我上一篇(湖仓智能应用简论-数据驱动设计_…...
Java后端入职第三天,使用CompletableFuture优化查询接口
一、需求背景 相信大家入职到一个新公司(xinkeng),一般都会被分配去解决千古难题(caipigu),这些问题大概率很多不想去解决,并且代码很多复杂,各种套娃。领导为检验新人的能力,就会去让新人去解决这种问题,一方面可以了解业务代码,还能顺手把没人愿意做的事做了。但…...
卷积神经网络实例
文章目录 1. 数据输入2. 创建卷积模型并训练3. 超参数选择 卷积神经网络(CNN)主要由卷积层(Convolutional Layer)、池化层(Pooling Layer)、激活层(Activation Layer)和全连接层(Fully-connected Layer)组成。 卷积层(Convolutional Layer):卷积层是CNN的核心组成部…...
LayerZero有何发展潜力?空投热潮和大额融资双重加持
前言 近期Arbitrum的如愿空投再次点燃了市场「刷空投」的热情,除了ZK系的zkSync、Starknet及Scroll,也有部分用户将注意力投向了估值30亿美元的LayerZero。而 LayerZero刚刚完成的1.2亿美元B轮融资也让其市场热度持续攀升,在「空投热潮」及「…...
深度学习之构建MPL神经网络——泰坦尼克号乘客的生存分析
大家好,我是带我去滑雪! 本期使用泰坦尼克号数据集,该数据集的响应变量为乘客是生存还是死亡(survived,其中1表示生存,0表示死亡),特征变量有乘客舱位等级(pclass&#x…...
一条神奇的sql
背景:人脸闸机,每刷一次人脸,就会有一条记录插入到通行记录表。而闸机可能会多次识别同一个人的人脸,那么这时通行记录表就会插入多次同一个人的记录,同一个人的记录中,只不过通行时间不同而已 需求&#…...
数据结构总结3:栈和队列
后续会有补充和更改 栈和队列 栈和队列也属于线性表 栈 一种特殊的线性表,只允许在固定的一端进行插入和删除元素。该端称为栈顶,另一端称为栈底。 栈中的数据遵循后进先出(LIFO)的原则 压栈/进栈/入栈:数据插入…...
私有化部署的即时通讯软件:消息、文件安全加密,全面可控
如今,数字化转型进入纵深阶段,在企业数字化转型过程中,数据规模激增,结构更为复杂,数据零散化和安全性问题日益显著,使得众多企业在数据资产管理上面临不小的挑战。企业为提高内部沟通效率,通常…...
27-Django项目实战(5)
1 歌曲搜索 音乐平台的每个网页顶部都设置了歌曲搜索功能,歌曲搜索框以网页表单的形式展示,并且以POST请求方式实现歌曲搜索功能,搜索结果显示在歌曲搜索页。歌曲搜索页由项目应用search实现,首先在search的urls.py中定义路由sea…...
【JVM】1. JVM与Java体系结构
文章目录 1.1. 前言🍉1.2. 参考书目🍉1.3. Java及JVM简介🍉1.4. Java发展的重大事件🍉1.5. 虚拟机与Java虚拟机🍉1.6. JVM的整体结构🍉1.7. Java代码执行流程🍉1.8. JVM的架构模型🍉…...
活动回顾|Kyligence x 亚马逊云科技,携手加速零售电商数智化转型
5月19日,Kyligence 与亚马逊云科技联合主办的「指标驱动,加速零售电商行业数智化转型」主题沙龙在上海成功举办。来自乐高、Kyligence、亚马逊云科技的专家分享了如何以数据和指标驱动,加速零售行业的数智化转型,并与现场观众进行…...
本科毕业生10大高薪专业出炉,IT行业赢麻了
据环球网报道,现在大学毕业生转行率高达80%! 非常后悔!有不少粉丝向播妞倾诉,曾经以为读了大学就能找到体面的工作,实际上是掉入了天坑专业,成了现实版孔乙己。 大学生找不到对口好工作,似乎已成…...
工厂安灯呼叫系统解决方案
在选择安灯呼叫系统之前,需要先了解自己的需求。不同的工厂可能有不同的需求,例如生产线的规模、生产过程中可能会出现的问题等。因此,选择安灯呼叫系统之前,需要先考虑自己的需求,以便选择到最适合自己的系统。要从多…...
微信xr-frame官方案例基础能力之渲染目标
前言:什么是渲染目标?(详见:RenderTarget-渲染目标) 在3D计算机图形领域,渲染目标是现代图形处理单元(GPU)的一个特征,它允许将3D场景渲染到中间存储缓冲区或渲染目标纹理…...
自动控制原理笔记-根轨迹法
目录 一,根轨迹的基本概念 1.根轨迹的基本概念 2.根轨迹方程 3.根轨迹方程的应用 二,根轨迹的绘制规则 【规则一】根轨迹有n条分支: 【规则二】根轨迹对称于实轴: 【规则三】根轨迹的起点和终点: 【规则四】…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
