openmp 通用核心 学习 1

目录

函数:

编译指令:

子句:


#pragma omp parallel

函数:

int omp_get_thread_num() //获取线程ID

int omp_get_num_threads() //获取线程数量(只能在并行区域内使用,在并行区域外使用只能得到1)

void omp_set_num_threads() //设置线程数量

export OMP_NU7M_THREADS=N,命令行运行时通过设置环境变量设置线程数量。

double omp_get_wtime() //获得当前时间,start - end获取SPMD算法的运行时间(秒)

编译指令:

#pragma omp barrier //在当前位置设置一个栅栏

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

图4-11:

#include <stdio.h>
#include <omp.h>static long num_steps = 100000000;
double step;
int main ()
{int i, j, nthreads;double pi, full_sum = 0.0;double start_time, run_time;step = 1.0/(double) num_steps;full_sum = 0.0;start_time = omp_get_wtime();
#pragma omp parallel
{int i, id = omp_get_thread_num();int numthreads = omp_get_num_threads();double x, partial_sum = 0;if (id == 0)nthreads = numthreads;for (i = id; i < num_steps; i += numthreads) {x = (i + 0.5) * step;partial_sum += 4.0 / (1.0 + x * x);}
#pragma omp criticalfull_sum += partial_sum;
} // end of parallel regionpi = step * full_sum;run_time = omp_get_wtime() - start_time;printf("\n pi  \%f in \%f secs \%d threds \n ",pi,run_time,nthreads);
}	  

#pragma omp for //共享工作循环构造

此指令自带栅栏barrier,可以通过使用nowait字句去除栅栏:

图5-8:

double A[big], B[big], C[big];#pragma omp parallel 
{int id = omp_get_thread_num();A[id] = big_calc1(id);#pragma omp barrier #pragma omp forfor (i = 0; i < N; i++) {C[i] = big_calc3(i,A);}#pragma omp for nowaitfor (i = 0; i < N; i++) { B[i] = big_calc2(C, i); }A[id] = big_calc4(id); 
}

#pragma omp parallel for //组合式并行共享工作循环构造

子句:

循环中可能会存在循环携带依赖性:即任何给定循环的迭代中计算的值,都依赖前面迭代产生的值。

归约是一种常见的循环模式,它涉及将一个迭代中的一系列值进行组合(通常是求和、求积等),以生成一个聚合结果。

在归约操作中,每个迭代步骤都会更新聚合结果,直到迭代完成并得到最终的聚合值。由于每个迭代步骤的结果依赖于前一次迭代的结果,因此归约操作中存在循环携带依赖性。

reduction(op:list) //跨组内线程的值归约

图5-5:

int i;
double ave = 0.0, A[N]; InitA(A, N);#pragma omp parallel for reduction (+:ave)for (i = 0; i < N; i++) { ave + = A[i];}
ave = ave/N;

图5-9:

#include <stdio.h>
#include <omp.h>#define NTHREADS 4static long num_steps = 100000000;
double step;int main()
{double x, pi, sum = 0.0;double start_time, run_time;int i;step = 1.0 / (double) num_steps;omp_set_num_threads(NTHREADS);start_time = omp_get_wtime();#pragma omp parallel{double x;#pragma omp for reduction(+:sum) for (i = 0; i < num_steps; i++) {x = (i + 0.5) * step;sum += 4.0 / (1.0 + x * x);}}pi = step * sum;run_time = omp_get_wtime() - start_time;printf("pi is %f in %f seconds \n", pi, run_time);
}

schedule(static,chunk) //静态调度

schedule(dynamic,chunk) //动态调度

schedule(static,1)这种情况实际上是循环迭代的周期分配。如图4-6,

schedule(static)实际上是块状分配。如图4-7.

循环级并行策略:

假设起点是一个串行程序或MPI程序,要添加openmp以在“一个节点”上利用并行性:

第一步:

找到计算密集型的循环(书中建议使用openmp概要分析工具OpenMP Compilers & Tools - OpenMP)

第二步:

检查是否可以并行执行,大多数情况下会存在循环携带依赖,需要改造循环(寻找和利用归约,将用增量更新的变量替换成由循环控制索引计算除了的变量,将只读、共享的数据私有化,使循环迭代独立):

图5—-10:

// Sequential code with loop dependence
int i, j, A[MAX];
j = 5;
for (i = 0; i < MAX; i++) {j += 2;A[i] = big(j);
}// Parallel code with loop dependence removedint i, A[MAX];
#pragma omp parallel forfor (i = 0; i < MAX; i++) { int j = 5 + 2*(i+1);A[i] = big(j); }

测试循环迭代是否真正独立的一个有用的技术三通过交换起始条件和结束条件来反向执行循环。如果反向和正向的结果相同,那这个循环很可能没有循环携带的依赖性。

如果循环没有循环携带依赖,就可以添加openmp指令(#pragma omp parallel for)如果有归约添加归约子句。

最后一步:

        尝试用不同的线程数量和循环调度来优化程序,

        密切关注隐式栅栏,尝试使用nowait子句安全地关闭。 

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

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

相关文章

【NUMA平衡】浅入介绍NUMA平衡技术及调度方式

在云计算方案设计或项目问题处理的时候&#xff0c;经常会遇到NUMA平衡的问题&#xff0c;进行让人不清楚NUMA到底有何用&#xff0c;如何发挥作用&#xff0c;本文就NUMA技术原理和调度进行简要整理&#xff0c;方便后续需要时候查阅学习。 一.背景 一般的对称多处理器中&am…

【Java学习之道】异常的处理方式

引言 今天我们将聚焦于异常处理&#xff0c;这是每一个Java程序员都应该掌握的核心技能之一。通过学习这些内容&#xff0c;你将能够更好地应对程序中的意外情况&#xff0c;提高程序的健壮性和可靠性。 一、异常的处理方式 在Java中&#xff0c;异常处理主要通过使用try-ca…

竞赛选题 深度学习 大数据 股票预测系统 - python lstm

文章目录 0 前言1 课题意义1.1 股票预测主流方法 2 什么是LSTM2.1 循环神经网络2.1 LSTM诞生 2 如何用LSTM做股票预测2.1 算法构建流程2.2 部分代码 3 实现效果3.1 数据3.2 预测结果项目运行展示开发环境数据获取 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

信创办公–基于WPS的EXCEL最佳实践系列 (单元格与行列)

信创办公–基于WPS的EXCEL最佳实践系列 &#xff08;单元格与行列&#xff09; 目录 应用背景操作步骤1、插入和删除行和列2、合并单元格3、调整行高与列宽4、隐藏行与列5、修改单元格对齐和缩进6、更改字体7、使用格式刷8、设置单元格内的文本自动换行9、应用单元格样式10、插…

[Java] 重写equals为什么要重写hashcode方法?

背景 假设我们可能会遇到两个对象&#xff0c;它们的属性都是一样。 而我们的需求 要认为这两对象是同一个&#xff0c;但是在JAVA上它们两是不同的对象&#xff0c;使用equals时就会返回false。 所以我们要重写equals。 public class MyUser {public String id;public MyUs…

1312. 序列统计

1312. 序列统计 - AcWing题库 L~R范围可以等同于0~R-L范围 相当于在R-L1个数中选出k个数 令 则变为 相当于在R-Lk个数中选出k个数 需要计算 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing namespace std;t…

本地vscode安装GPU版本PyTorch

操作系统 windows, IDE环境vscode&#xff0c;本地GPU 可以新建一个jupyter文件&#xff0c;运行一些测试代码 确保装好显卡驱动 在底下调出终端窗口&#xff0c;默认是power shell&#xff0c;我喜欢用cmd窗口 激活自己的虚拟环境&#xff0c;输入命令 nvidia-smi 确保自己…

大模型的超级“外脑”——向量数据库解决大模型的三大挑战

随着AI大模型产品及应用呈现爆发式增长,新的AI时代已经到来。向量数据库可与大语言模型配合使用,解决大模型落地过程中的痛点,已成为企业数据处理和应用大模型的必选项。在近日举行的华为全联接大会2023期间,华为云正式发布GaussDB向量数据库。GaussDB向量数据库基于GaussD…

PHP - 遇到的Bug - 总结

BUG记录1 [问题] 除数为0&#xff0c;不符合规则 [问题描述] // 报错信息 DivisionByZeroError&#xff1a;is thrown when an attempt is made to divide a number by zero.// example public class Example {public static void Main(){int number1 3000;int number2 0;tr…

ubuntu 通过apt-get快速安装 docker

在使用 apt-get 安装 Docker 之前,你需要确保你的系统已经准备好并且已经更新了软件包列表。以下是在 Ubuntu 系统上使用 apt-get 安装 Docker 的步骤: 更新软件包列表: sudo apt-get update 安装依赖软件包,以确保可以通过 HTTPS 使用存储库: sudo apt-get install apt-t…

【2023年11月第四版教材】第24章《法律法规与标准规范》(合集篇)

第24章《法律法规与标准规范》(合集篇&#xff09; 1 民法典&#xff08;合同编&#xff09;2 招标投标法2.1 关于时间的总结2.2 内容 3 政府采购法4 专利法5 著作权法6 商标法7 网络安全法8 数据安全法 1 民法典&#xff08;合同编&#xff09; 1、要约是希望和他人订立合同的…

实施运维02

一.网线制作 1.所需材料 网线&#xff0c;水晶头&#xff0c;网线钳&#xff0c;水晶头, 路由器或者网络测速仪 网线钳 网线制作标准 T568A标准&#xff08;交叉线&#xff09;&#xff1a;适用链接场合&#xff1a;电脑-电脑、交换机-交换机、集线器-集线器 接线顺序&…

3.2python使用 matplotlib 实现可视化_python量化实用版教程(初级)

使用 matplotlib 实现可视化 Matplotlib 的主要模块是 pyplot&#xff0c;它提供了类似于 Matlab 的绘图接口。 安装命令&#xff1a;pip install matplotlib 下面是一个简单的示例代码&#xff0c;演示了如何使用 Matplotlib 绘制折线图&#xff1a; import matplo…

Session和分布式Session

参考下面的文章 https://blog.csdn.net/qq_15096707/article/details/74012116 https://blog.51cto.com/u_15239532/2836488 思考 一、session是如何用在登录中的 session可以用在登录中吗&#xff1f;可以。 0.第一次访问未登录&#xff0c;服务端重定向跳转到登录验证 1.在…

mac 版hadoop3.2.4 解决 Unable to load native-hadoop library 缺失文件

mac 版hadoop3.2.4或其他版本 Unable to load native-hadoop library 缺失文件 Native 包报错缺失&#xff1a; 1. hadoop-3.2.4/lib/native里加*.dylib 2. hadoop-3.2.4/etc/hadoop/hadoop-env.sh 加或修改 export HADOOP_OPTS"-Djava.library.path/Users/lvan/Documen…

Python jieba库的使用说明

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 一、jieba库基本介绍 jieba库概述 jieba是优秀的中文分词第三方库 中文文本需要通过分词获得单个的词语 jieba是优秀的中文分词第三方库&#xff0c;需要额外安…

Java实验一 Java语言基础(12题)

文章目录&#xff1a; 1、我国历法中的天干、地支和生肖的排列是有规律的。天干的顺序是“甲乙丙丁戊己庚辛壬癸”&#xff0c;地支的顺序是“子丑寅卯辰巳午未申酉戌亥”&#xff0c;生肖的顺序是“鼠牛虎兔龙蛇马羊猴鸡狗猪”。天干、地支、生肖的计算方法非常简单&#xff…

新手如何快速上手HTTP爬虫IP?

对于刚接触HTTP爬虫IP的新手来说&#xff0c;可能会感到有些困惑。但是&#xff0c;实际上HTTP爬虫IP并不复杂&#xff0c;只要掌握了基本的操作步骤&#xff0c;就可以轻松使用。本文将为新手们提供一个快速上手HTTP爬虫IP的入门指南&#xff0c;帮助您迅速了解HTTP爬虫IP的基…

速通RabbitMQ的五种常见消费模型

目录 引言1. 简单队列模型&#xff08;Simple Queue Model&#xff09;优缺点及适用场景代码示例 2. 工作队列模型&#xff08;Work Queue Model&#xff09;优缺点及适用场景代码示例 3. 发布/订阅模型&#xff08;Publish/Subscribe Model&#xff09;优缺点及适用场景代码示…

08. 机器学习- 线性回归

文章目录 线性回归 LINEAR REGRESSION 从本次课程开始&#xff0c;大部分时候我将不再将打印结果贴出来了&#xff0c;因为太占用篇幅。小伙伴可以根据我的输出执行敲一遍代码来进行学习和验证。 同样是为了节省篇幅&#xff0c;我也不会再一行行那么仔细的解释代码了&#xff…