【Linux操作系统、C语言】在Linux中用C语言进行OpenMP并行程序设计之常见指令、库函数和指令总结

在Linux中用C语言进行OpenMP并行程序设计

·············································································································
今天聊一聊OpenMP并行程序中的常见指令、库函数和指令总结

1、OpenMP并行程序运行原理

OpenMP并行程序主要是进行计算机上的并行程序设计而使用的,通过parallel等指令运行的,实际上,OpenMP就是编译器指令和库函数的集合。

OpenMP运行模式是fork/join模式,即在程序尚未进入并行区域时,仅是有主线程,当进入并行区域后,就产生其他并行的线程运行,在并行区域未结束前,主线程的串行部分不会运行,要等并行线程结束后才继续运行主线程剩余部分。

2、OpenMP并行程序目标、优点

OpenMP的编译器指令的目标及优点主要有:

  1. 产生一个并行区域;
  2. 划分线程中的代码块;
  3. 在线程之间分配循环迭代;
  4. 序列化代码段;
  5. 同步线程间的工作

3、OpenMP并行程序常见指令

OpenMP并行程序指令的格式如下:

#pragma omp 指令 [子句[子句]…]

···········································································································

【总结】OpenMP并行程序常见指令有如下:
  • parallel:用在一个代码段之前,表示这段代码将被多个线程并行执行;
  • for:用于for循环之前,将循环分配到多个线程中并行执行,以实现任务分担,必须保证每次循环之间无相关性;
  • parallel for:parallel 和 for语句的结合,也是用在一个for循环之前,表示for循环的代码将被多个线程并行执行,它同时具有并行域的产生和任务分担两个功能;
  • sections:用在可能会被并行执行的代码段之前,用于实现多个结构块语句的任务分担,可并行执行的代码段各自用section指令标出(注意区分sections和section);
  • parallel sections:parallel和sections两个语句的结合,类似于parallel for;
  • critical:用在一段代码临界区之前,保证每次只有一个OpenMP线程进入该区域;
  • single:用在一段只被单个线程执行的代码段之前,表示后面的代码段将被单线程执行。
  • flush:保证各个OpenMP线程的数据影像的一致性;
  • barrier:用于并行区内代码的线程同步,所有线程执行到barrier时要停止,直到所有线程都执行到barrier时才继续往下执行;
  • atomic:用于指定一个数据操作需要原子性地完成;
  • master:用于指定一段代码块由主线程执行;
  • ordered:用于指定并行区域的循环按顺序执行;
  • threadprivate:用于指定一个或多个变量是线程专用;
    【注意】线程专有和私有是有区别的。
    ·····································································································

4、OpenMP并行程序常见库函数

···········································································································

【总结】OpenMP并行程序常见库函数有如下:
  • 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函数的配对操作函数,关闭一个锁;
    ·····································································································

5、OpenMP并行程序常见子句

···········································································································

【总结】OpenMP并行程序常见子句有如下:
  • private:指定一个或多个变量在每个线程中都有它自己的私有副本;
  • firstprivate:指定一个或多个变量在每个线程都有它自己的私有副本,并且私有变量要在进入并行域或任务分担域时,继承主线程中的同名变量的值作为初值;
  • lastprivate:主要是用来指定将线程中的私有变量的值在并行处理结束后复制回主线程中的对应变量;
  • lastprivate:是用来指定将线程中的一个或多个私有变量的值在并行处理结束后复制到主线程中的同名变量中,负责拷贝的线程是for或sections任务分担中的最后一个线程;
  • reduction:用来指定一个或多个变量是私有的,并且在并行处理结束后这些变量要执行指定的归约运算,并将结果返回给主线程同名变量;
  • nowait:指出并发线程可以忽略其他制导指令暗含的路障同步;
  • num_threads:指定并行域内的线程的数目;
  • schedule:指定for任务分担中的任务分配调度类型;
  • shared:指定一个或多个变量为多个线程间的共享变量;
  • ordered:用来指定for任务分担域内指定代码段需要按照串行循环次序执行;
  • copyprivate:配合single指令,将指定线程的专有变量广播到并行域内其他线程的同名变量中;
  • copyin n:用来指定一个threadprivate类型的变量需要用主线程同名变量进行初始化;
  • default:用来指定并行域内的变量的使用方式,缺省是shared。
    ·····································································································

相关技术文章:
【Linux问题解决】Ubuntu Linux 安装gcc4.9 g++4.9报错“没有可供安装的候选者”解决办法
【Linux教程】Ubuntu Linux 更换源教程
【Linux教程】如何实现在Ubuntu Linux和windows之间复制粘贴、拖拽复制文件?
【Linux问题解决】操作系统用C语言多线程编程 对‘pthread_create’未定义的引用 报错解决办法
【Linux教程】Linux中用C语言多线程编程之pthread_join()函数
【Linux操作系统、C语言】在Linux中用C语言进行OpenMP并行程序设计之常见指令、库函数和指令总结

相关技术文章:
【Java Web总结】Java Web项目中 的.classpath、.mymetadata、.project文件作用
【Java Web问题解决】Tomcat报错javax.servlet.ServletException: Error instantiating servlet class.报错404
【比较】什么是“服务器端跳转”“客户端跳转”,二者有什么区别?
【总结】表单提交的get和post有什么不同?
【总结】Java Web 中的4种属性范围(page、request、session、application)
【Java Web问题解决】Tomcat启动时控制台出现中文乱码的问题解决方法
【示例项目】java实现通过身份证号码判断籍贯所在地区
【总结】HTTP协议中的状态码(200、403、404、500等)
【Java Web问题解决】提交表单后显示乱码
【Java Web总结】JSP页面的生命周期详解
【Java Web总结】JSP页面实现类详解
【Java Web 问题解决】Tomcat启动失败 报错:Server Tomcat v9.0 Server at localhost failed to start.
【Java Web问题解决】连接数据库出错:java.sql.SQLException: No suitable driver found for jdbc:mysql://localhost:3306/

你可能感兴趣的:(Linux)