OpenMP - 介绍
OpenMP是基于线程的并行编程模型。OpenMP采用Fork-Join并行执行方式:OpenMP程序开始于一个单独的主线程(Master Thread),然后主线程一直串行执行,直到遇见第一个并行域(Parallel Region),然后开始并行执行并行区域。其程序由一组编译制导、运行时库函数(Run-Time routines)和环境变量组成。
其过程如下:
Fork:主线程创建一个并行线程队列,然后,并行域中的代
码在不同的线程上并行执行;
Join:当并行域执行完之后,它们或被同步或被中断,最后只有主线程在执行。
常用制导命令:
- parallel 用在一个代码段之前,表示这段代码将被多个线程并行执行
- for 用于for循环之前,将循环分配到多个线程中并行执行,必须保证每 次循环之间无相关性。
- parallel for parallel 和 for语句的结合,也是用在一个for循环之前,表示for 循环的代码将被多个线程并行执行。
- sections 用在可能会被并行执行的代码段之前
- parallel sections parallel和sections两个语句的结合
- critical 用在一段代码临界区之前
- single 用在一段只被单个线程执行的代码段之前,表示后面的代码段将 被单线程执行
- barrier,用于并行区内代码的线程同步,所有线程执行到barrier时要停止 直到所有线程都执行到barrier时才继续往下执行。
- Atomic 用于指定一块内存区域被制动更新
- Master 用于指定一段代码块由主线程执行
- Ordered 用于指定并行区域的循环按顺序执行
- threadprivate 用于指定一个变量是线程私有
常用库函数:
- omp_get_num_procs, 返回运行本线程的多处理机的处理器个数。
- omp_get_num_threads, 返回当前并行区域中的活动线程个数。
- omp_get_thread_num, 返回线程号
- omp_set_num_threads, 设置并行执行代码的线程个数
- omp_init_lock, 初始化一个简单锁
- omp_set_lock, 上锁操作
- omp_unset_lock, 解锁操作,要和omp_set_lock函数配对使用。
- omp_destroy_lock, omp_init_lock函数的配对操作函数,关闭一个锁。
常用子句:
- private, 指定每个线程都有它自己的变量私有副本。
- firstprivate,指定每个线程都有它自己的变量私有副本,并且变量要被 继承主线程中的初值。
- lastprivate,主要是用来指定将线程中的私有变量的值在并行处理结束后 复制回主线程中的对应变量。
- reduction,用来指定一个或多个变量是私有的,并且在并行处理结束后 这些变量要执行指定的运算。
- nowait,忽略指定中暗含的等待
- num_threads,指定线程的个数
- schedule,指定如何调度for循环迭代
- shared,指定一个或多个变量为多个线程间的共享变量
- ordered,用来指定for循环的执行要按顺序执行
- copyprivate,用于single指导中的指定变量广播到并行区中其它线程
- copyin,用来指定一个threadprivate的变量的值要用主线程的值进行初始化
- default,用来指定并行处理区域内的变量的使用方式,缺省是shared
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧