OpenMP

本文深入探讨了OpenMP并行编程的核心概念和技术细节,包括其与OpenMPI的区别、并行区域构造、数据依赖性处理、线程管理和调度策略等。通过具体指令和实例,解析了工作共享、数据范围属性、运行时库例程等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OpenMP Outlin

在这里插入图片描述
OpenMP不同于OpenMPI
OpenMPI: 是一个MPI的library
注意data dependence
平行使用thread

Parallel Region Construct

在这里插入图片描述
Compiler通过Pragma 识别出这是一个OpenMP创建线程的板块
parallel 可以搭配do 或者for ; do 和for不能同时使用
Optional

怎么使用
data
clause 告诉Compile 如何确定 各种变量

OpenMP Directives

在这里插入图片描述

Parallel

并行区域必须是不跨越多个例程或代码文件的结构化块
在并行区域中分支(转到)是非法的,但是您可以在并行区域中调用其他函数

不能 jump/goto 到其他部分 ,不能跳出这个block(代码块)
但是可以调用其他函数,不太建议(call 到最后,flow会变得很乱 )
最好执行完,join回block之后
在这里插入图片描述
1.if 如果是false 只需要comfose成一个threas 视derection不存在
2.true 时再来判断
3.first : num_threads(n)
4.如果不写, 在程序码中call library function: omp_set_num_threads()
肯定相同,避免出错(设定default值)
(在进入parallel region 之前,调用)
优点:threads是固定的,并不需要每次都call它,在程序码一开始call omp_set_num_threads() ,这个是默认的值,每个parallel region都将默认
5.都不写时:看 OMP_NUM_THREADS Compiler查看系统的环境变数
6.最终,默认询问有多少CPUS
在这里插入图片描述

Parallel region 嵌套

在这里插入图片描述

Working_Sharing Construct

定义: 1.工作共享结构将封闭代码区域的执行划分为遇到该代码区域的线程
            2.工作共享结构不启动新线程(所以使用parallel for 只有在parallel(已经形成线程组的情况下),才能Working_Sharing Construct)
            3.在进入工作共享结构时没有隐含的障碍,但是在工作共享结构的末尾存在隐含的障碍
              (join(),是个线程block到同一时间点)

section:可以set不同的function, 在call的这个水平去做平行,一个section就是一个call,分配给一个threads
            将各个部分的section一 一写出来,每个section 不会被重复做
SINGLE :是section的特例,只会执行section中的一个 
               用途:解决同步化的问题:做I/O (会出现 同步化 的问题 所以使用SINGLE) 

在这里插入图片描述
1.DO/FOR
1.nowait: 空闲进程不必等待,继续执行parallel rection中剩下的代码
2.schedule: 分配线程的算法
3. order:线程以一定的顺序结束(开始顺序不受影响,结束顺序与serials core相同),order会降低程序的并行程度
4. collapse: 用在nested loop(嵌套循环)上,指定嵌套循环中应将多少个循环折叠成一个大的迭代空间并根据schedule子句进行划分(变成一个一维顺序队列)

DO/for Directive在这里插入图片描述

在这里插入图片描述
适用情况:
STATIC: 项目的数量很banlance 但是不同task间执行时间大相径庭(会Blocking在执行时间最长的那个thread) 优点: 相当于一开始就对tasks进行了数量上均分,所以schedule 很简单。适用于各task之间差距不大,且总数不小
Dynamic: (动态的): 与STATIC恰好相反,一次分配一个task,他实现了threads之间执行时间相近,但是在不断地分配task, schedule会很复杂。适用于,不同task之间,执行时间差距很大,数量有限
Guided: 综合个前两者

Scheduling Examples

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
  每一个section只会被做到一次
  section 量不多,通常3到4个

SECTIONS Directive在这里插入图片描述在这里插入图片描述### SINGLE Directive在这里插入图片描述

Synchronization Construc

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Data Scope Attribute Clauses


在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Run-Time Library Routines

在这里插入图片描述

### OpenMP 并行编程模型概述 OpenMP 是一种基于共享内存的并行编程模型,旨在简化多核处理器上的并行程序开发[^1]。此模型利用编译指示(即指令集)来定义代码中的并行区域,使得程序员能够轻松地标记可并行化的部分。 #### 编程模型特点 - **简易性**:通过简单的编译指示语句即可实现复杂功能,无需深入理解底层硬件架构。 - **灵活性**:支持多种类型的循环、函数调用和其他控制结构作为并行单元。 - **高效能**:自动处理线程创建、同步等问题,减少开发者负担的同时提高了效率。 - **兼容性好**:可以在不改变原有串行代码的基础上增加少量注解完成转换工作[^2]。 ```cpp #include <omp.h> #include <iostream> int main() { int n = 10; #pragma omp parallel for num_threads(4) for (int i = 0; i < n; ++i) { std::cout << "Thread ID: " << omp_get_thread_num() << ", Value of i: " << i << '\n'; } } ``` 这段 C++ 代码展示了如何使用 `#pragma omp` 来声明一个并行循环,并指定了四个线程参与执行。每个迭代可能由不同的线程负责,在这里打印出了当前工作的线程编号及其对应的索引值[^3]。 #### 最佳实践建议 为了更好地应用 OpenMP 进行高效的并行计算: - 合理设置线程数量,通常不超过物理核心数目以避免过度竞争资源; - 对于 I/O 密集型操作应谨慎考虑其影响,因为这些活动可能会成为瓶颈; - 利用数据分片策略提高缓存命中率,降低访问延迟; - 尽量保持负载均衡,确保各线程间的工作量大致相等,防止某些线程过早结束等待其他仍在忙碌的任务完成; - 定期评估性能指标,根据实际情况调整参数配置或算法设计[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值