openmp 处理数据竞争的问题 reduction

类似 多线程竞争,需要加锁来保护类似,但实现原理不同,reduction 并不会像多线程原子操作那样影响效率,因为它使用了高等代数里的单位元和结合律思想,为每个线程定义一个单位元,开始 分段积累运算操作。

1, 不可避免竞争的示例

hello_without_reduction.cpp

#include <omp.h>
#include <math.h>
#include <iostream>int main()
{float sum = 0;omp_set_num_threads(4);#pragma omp parallel{#pragma omp forfor(int i=0; i<17; i++){sum += cos(i) + sin(i);//printf("%d , th=%d\n", i, omp_get_thread_num());}}std::cout<< sum <<std::endl;}

_______
Makefile:

CXX:=g++hello_nr: hello_without_reduction.o${CXX} -o $@  $< -fopenmp#${CXX} -o $@ -fopenmp $<hello_without_reduction.o: hello_without_reduction.cpp${CXX} -c -o $@  $< -fopenmp.PHONY:clean
clean:-rm -f hello_without_reduction hello_without_reduction.o

出错效果:

2,避免了竞争的示例


hello_with_reduction.cpp
 

#include <omp.h>
#include <math.h>
#include <iostream>int main()
{float sum = 0;omp_set_num_threads(4);#pragma omp parallel{#pragma omp for reduction(+:sum)for(int i=0; i<17; i++){sum += cos(i) + sin(i);//printf("%d , th=%d\n", i, omp_get_thread_num());}}std::cout<< sum <<std::endl;}

_______________________________________________________________
Makefile:

CXX:=g++hello_nr: hello_with_reduction.o${CXX} -o $@  $< -fopenmp#${CXX} -o $@ -fopenmp $<hello_with_reduction.o: hello_with_reduction.cpp${CXX} -c -o $@  $< -fopenmp.PHONY:clean
clean:-rm -f hello_with_reduction hello_with_reduction.o

无错效果图:

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

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

相关文章

RabbitMQ之延迟消息

文章目录 前言一、死信交换机二、延迟消息死信交换机实现延迟消息图解流程 DelayExchange插件实现延迟消息安装插件声明延迟交换机发送延迟消息 总结 前言 死信交换机、延迟消息 一、死信交换机 当一个队列中的消息满足下列情况之一时&#xff0c;可以成为死信&#xff08;dea…

CentOS 7 部署 MariaDB 的 2 种方法

有两种安装 MariaDB 服务器的方法。您可以安装 CentOS 7 存储库中可用的默认版本&#xff0c;也可以通过手动添加 MariaDB 存储库来安装最新版本。 如果安装过MariaDB或MySQL&#xff0c;使用以下命令彻底删除它们: yum remove mariadb* yum remove mysql* 方法一: 使用 Yum…

Python assert断言函数及用法与while循环详解

Python assert断言函数及用法 断言语句和 if 分支有点类似&#xff0c;它用于对一个 bool 表达式进行断言&#xff0c;如果该 bool 表达式为 True&#xff0c;该程序可以继续向下执行&#xff1b;否则程序会引发 AssertionError 错误。 例如如下程序&#xff1a; s_age inpu…

亚马逊,shein,temu如何避免爆品评分低被强制下架

近期&#xff0c;一些Temu卖家反映产品下架问题&#xff0c;无论是日出千单的爆品还是其他商品&#xff0c;都有可能面临下架的风险。这其中最主要的原因之一是产品质量问题&#xff0c;导致消费者差评较多&#xff0c;评分降至4.2分或4.0分以下时&#xff0c;平台可能会强制下…

EDA实验-----正弦信号发生器的设计(Quartus II )

目录 一、实验目的 二、实验仪器 三、实验原理 四、实验内容 五、实验步骤 六、注意事项 七、实验过程&#xff08;操作过程&#xff09; 1.定制LPM_ROM模块 2.定制LPM_ROM元件 3.计数器定制 4.创建锁相环 5.作出电路图 6.顶层设计仿真 一、实验目的 学习使用Ver…

Matlab R2022b 安装成功小记

Matlab R2022b 安装成功小记 前言一、 下载链接二、 安装过程小记 叮嘟&#xff01;这里是小啊呜的学习课程资料整理。好记性不如烂笔头&#xff0c;今天也是努力进步的一天。一起加油进阶吧&#xff01; 前言 windows 10系统之前安装过Matlab R2010b做基础研究&#xff0c;最…

每日一练 | 华为认证真题练习Day138

1、IPv6地址FE80::2EO:FCFF:FE6F:4F36属于哪一类&#xff1f; A. 组播地址 B. 任播地址 C. 链路本地地址 D. 全球单播地址 2、如果IPv6的主机希望发出的报文最多经过10台路由器转发&#xff0c;则应该修改IPv6报文头中的哪个参数&#xff1f; A. Next Header B. Version …

每日一题(LeetCode)----链表--链表中的下一个更大节点

每日一题(LeetCode)----链表–链表中的下一个更大节点 1.题目&#xff08;1019. 链表中的下一个更大节点&#xff09; 给定一个长度为 n 的链表 head 对于列表中的每个节点&#xff0c;查找下一个 更大节点 的值。也就是说&#xff0c;对于每个节点&#xff0c;找到它旁边的第…

一文带你读懂骨传导耳机危害性都有哪些!以及如何选择骨传导耳机!

如果说正常的使用骨传导耳机&#xff0c;是不会有危害的。 那么如何正确的使用骨传导耳机呢&#xff1f; 1、音量不要太大 骨传导耳机是通过震动人体骨骼来传递声音的&#xff0c;而在传递过程中&#xff0c;会出现漏音情况&#xff0c;而漏出的声音&#xff0c;便会通过耳道…

服务器中启动和停止项目

服务器中启动和停止项目 一、前言二、使用命令启动和关闭项目1、启动项目2、停止项目 三、使用可执行脚本启动和关闭项目1、启动项目2、停止项目 一、前言 在服务器上部署项目&#xff0c;一般就是将项目挂在后台&#xff0c;如果是微服务首选docker-compose&#xff0c;但如果…

Selenium 学习(0.15)——软件测试之测试用例设计方法——场景法

1、场景法的基本概念 场景法是黑盒测试中一种重要的测试用例设计方法。它通过场景描述业务流程&#xff0c;包括基本流和备选流设计测试用例遍历软件系统功能&#xff0c;从而验证其正确性。 通过运用场景对系统的功能点或业务流程进行描述&#xff0c;从而提…