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
posted @   酥炸小黄瓜  阅读(204)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示