pragma omp parallel for与pragma omp critical理解

pragma omp parallel for

#pragma omp parallel for是OpenMP API中的一个编译器指令,用于在C/C++程序中实现并行计算。这个指令告诉编译器下面的for循环应该被并行执行,即循环的迭代被分配到多个线程中,以便同时执行。这样做的目的是为了利用现代多核处理器的并行处理能力,从而加速循环的执行时间。

#pragma omp:表示通过指令前缀调用OpenMp指令

parallel:告诉编译器要创建一个并行区域,需要执行多线程

forr:表示下面的紧随其后的for循环是要执行并行的循环

#include <omp.h>
#include <stdio.h>int main() {#pragma omp parallel forfor(int i = 0; i < 10; i++) {printf("Thread %d is executing iteration %d\n", omp_get_thread_num(), i);}return 0;
}
//这个表示:for循环进行并行执行,每次循环在不同的线程执行
//同时:omp_get_thread_num()表示通过函数获取当前执行该迭代的线程编号

我的思考:

循环迭代的线程应该是独立的,即:每次迭代的结果不应该依赖于其他迭代得到的结果,不然不能执行多线程

要设置合理的线程数量执行函数,

#pragma omp critical

在多线程中必须考虑到不同的线程同一个变量进行读写访问引起的data race问题。

如果线程之间不存在互斥,那么多个线程,如果到达同一个变量的时间相同,那么访问顺序变得混乱,可能导致错误的执行结果。

线程同步机制:互斥机制    |    事件同步机制

互斥锁机制

对一块共享的存储空间进行保护,保证任何时候最多只能有一个线程对这块存储空间进行访问,从而保证数据的完整性,这块存储空间称为“临界区”。可以通过critical等命令进行实现事件同步机制的设计思路是控制线程的执行顺序,可以通过设置barrier同步路障、ordered定序区段、master主线程执行等实现。

//互斥锁的定义
#pragma omp critical{需要被保护的代码块 }
#include <iostream>#include "omp.h"
using namespace std;
void main() {int sum = 0;
#pragma omp parallel for
//并行执行紧随其后的for循环for (int i = 0; i < 10000; i++) {
#pragma omp critical
#这样保证了如果到达了多个i,需要等待上一个进入了critical的i执行完成后,下一个i在进入执行程序
#防止顺序混乱{ sum += i; }}cout << sum << endl;
}

关注这段代码中的  —— { sum += i; }

事件同步之barrier(同步路障)

barrier是OpenMP线程同步的一种方法,在多线程代码块中插入barrier,则先完成计算任务的线程到达此处会等待,直到最后一个线程也完成了计算任务。barrier相当于设置了一个线程的集合点,所有线程都到达之后才能继续往下执行。我们在使用 barrier 的时候每个并行域的线程组都有一个自己的 barrier 。我们可以通过下面的程序进行分析。

#include <iostream>#include "omp.h"
using namespace std;
int sum = 0;
void Initialization() {for (int i = 0; i < 5; i++) sum += i;
}
void main() {
#pragma omp parallel{Initialization();
#pragma omp barrierprintf("i=%d, thread_id=%d\n", sum, omp_get_thread_num());}
}
#pragma omp barrier //在当前位置设置一个栅栏

#pragma omp critical //critical构造定义了一个以相互排斥的方式执行的代码块(临界区),即一次只有一个线程执行代码,另外的线程有可能在构造的开始处等待,直到轮到自己。当代码块只包含一条语句时,不需要大括号。

大佬的博客 写的很好 作参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/9745.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】手把手带你玩转线性表

前言&#xff1a; 哈喽大家好&#xff0c;我是野生的编程萌新&#xff0c;首先感谢大家的观看。数据结构的学习者大多有这样的想法&#xff1a;数据结构很重要&#xff0c;一定要学好&#xff0c;但数据结构比较抽象&#xff0c;有些算法理解起来很困难&#xff0c;学的很累。我…

弱监督语义分割-对CAM的生成过程进行改进1

一、仿射变换图像结合正则项优化CAM生成 论文&#xff1a;Self-supervised Equivariant Attention Mechanism for Weakly Supervised Semantic Segmentation &#xff08;CVPR,2020&#xff09; 1.SEAM方法 孪生网络架构&#xff08;Siamese Network Architecture&#xff09…

2024.5.10

TCP服务器端 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//设置窗口大小和窗口大小固定this->resize(727,879);this->setFixedSize(727,879);//创建…

2024- 人工智能药物设计- AIDD- 胶质母细胞瘤的相关论文研究

胶质母细胞瘤的相关论文研究 1. 胶质母细胞瘤的相关的论文 Natural Small Molecules Targeting NF-κB Signaling in Glioblastoma: This review discusses the role of NF-κB signaling in glioblastoma and highlights natural small molecules that can interfere with t…

STC8增强型单片机开发【定时器Timer⭐】

目录 一、引言 二、定时器基础知识 三、STC8定时器配置 四、代码示例 五、总结 一、引言 在单片机开发中&#xff0c;定时器&#xff08;Timer&#xff09;是一个极其重要的组件&#xff0c;它允许开发者基于时间触发各种事件或任务。STC8增强型单片机作为一款功能丰富的…

使用2G内存求20亿个数字中出现次数最多的N个

又是一个TOP -N的题目 我看了一下CSDN上大多数人的回答和GPT说的差不多&#xff0c;都是说使用哈希之类的&#xff1b; 我今天说一下我的解法&#xff0c;首先说一下不太快的基础解法 20亿数字使用uint32需要80GB&#xff0c; &#xff08;1&#xff09;分为40块读取&#…

Vue.js 组件 - 自定义事件

父组件是使用 props 传递数据给子组件&#xff0c;但如果子组件要把数据传递回去&#xff0c;就需要使用自定义事件&#xff01; 我们可以使用 v-on 绑定自定义事件, 每个 Vue 实例都实现了事件接口(Events interface)&#xff0c;即&#xff1a; 使用 $on(eventName) 监听事…

c++opencv Project3 - License Plate Detector

俄罗斯车牌识别案例&#xff1a;实时识别车牌&#xff0c;并且读取到指定文件夹中。 惯例先展示结果图&#xff1a; 对于摄像头读取图片进行车牌匹配&#xff0c;原理和人脸识别其实是一致的。 利用训练好的模型进行匹配即可。可参考&#xff1a; 对视频实现人脸识别-CSDN博…

电能表远程抄表系统是什么?

电能表远程抄表系统是一种优秀的电力管理方法&#xff0c;它通过自动化的形式搜集、解决与分析电能表的信息&#xff0c;进而取代了传统人工抄水表方法。其主要原理是运用物联网技术、通讯技术和大数据处理技术&#xff0c;完成对电度表数据信息实时、远程控制获取和管理方法。…

探索无界知识:用 ChatGPT 的原理学习任何事物!

为避免文章重复&#xff0c;您的文本已通过更改句式、用词以及句子结构进行了修改。现在的文本应该能更好地满足去重的需求&#xff1a; 从ChatGPT原理出发&#xff0c;我们探讨GPT如何启发人类学习和构建个人知识体系。 1. 明确学习目标 机器学习必须依靠目标函数。同样&…

【Qt 开发基础体系】QMap 类和 QHash 类以及 QVector 类

文章目录 1.QMap 详解1.1 QMap 的介绍1.2 QMap 的具体用法如下1.3 QmultiMap类 2.QHash 详解3. QMap 和 QHash 的对比4. QVector 详解 1.QMap 详解 1.1 QMap 的介绍 &#x1f427;① QMap<key,T>提供一个从类型为Key的键到类型为T的值的映射。通常&#xff0c;QMap存储的…

STC8增强型单片机开发【串口调试UART⭐⭐】

目录 一、引言 二、UART基础知识 三、STC8 UART配置 四、代码示例 上列代码中所需的库函数文件&#xff1a; 引入库函数的流程&#xff1a; 五、总结 一、引言 在单片机开发中&#xff0c;串口调试&#xff08;UART&#xff09;是一种常用的通信方式&#xff0c;用于实现…

LC719

719. 找出第 K 小的数对距离 719. 找出第 K 小的数对距离 - 力扣&#xff08;LeetCode&#xff09; 数对 (a,b) 由整数 a 和 b 组成&#xff0c;其数对距离定义为 a 和 b 的绝对差值。 给你一个整数数组 nums 和一个整数 k &#xff0c;数对由 nums[i] 和 nums[j] 组成且满足 …

linux grep命令搜索指定路径

在Linux开发的过程中grep这个搜索命令&#xff0c;是必不可少的存在。它可以快速的搜索出来我们需要的关键字所在的位置。 有助于我们快速分析定位问题。 下面&#xff0c;分享一个简单实用的小技巧。 原始grep 最终grep grep过滤掉二进制的文件 -I选项 结论 这样子是不…

126.删除链表的倒数第N个节点(力扣)

题目描述 代码解决&#xff08;双指针&#xff09; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, Li…

【QT教程】QT6信号与槽 QT信号与槽

QT6信号与槽 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免费QT视…

C++-Primer-Plus 习题解答(第十六章-string类和标准模板库)

题目&#xff1a;16.1 回文指的是顺读和逆读都一样的字符串。例如&#xff0c;“tot”和“otto”都 是简短的回文。编写一个程序&#xff0c;让用户输入字符串&#xff0c;并将字符串引用传 递给一个bool函数。如果字符串是回文&#xff0c;该函数将返回true&#xff0c;否则返…

全视通助力珠海市井岸镇卫生院新院,建设智慧病房

5月6日&#xff0c;位于珠海市斗门区的井岸镇卫生院新院正式启用&#xff0c;面向市民开诊。新院各诊区就医秩序井然&#xff0c;总体情况良好。据统计&#xff0c;截至开诊当天11点30分&#xff0c;新院门诊共接诊347人次&#xff0c;预防接种81人次&#xff0c;儿童体检33人次…

网络相关笔记

IPv4地址 IPv4地址通常以“点分十进制”形式书写&#xff0c;即四个0-255之间的十进制数&#xff0c;各数之间用英文句点&#xff08;.&#xff09;分隔&#xff0c;例如&#xff1a;192.0.2.1。总共32位的地址空间可以表示大约42亿个不同的地址。 IPv4地址结构包括&#xff…

HashSet扩容机制

HashSet底层是HashMap,第一次添加的时候,table数组扩容到16,临界值是16*加载因子(默认是0.75),到达临界值进行扩容。 HashSet<Integer> hashSet = new HashSet<>();hashSet.add(5);hashSet.add(2);hashSet.add(5);hashSet.add(8);hashSet.add(1);当new一个H…