好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

chap3openmp多线程编程剖析.ppt

118页
  • 卖家[上传人]:今***
  • 文档编号:107066003
  • 上传时间:2019-10-17
  • 文档格式:PPT
  • 文档大小:1.75MB
  • / 118 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 第三章 OpenMP多线程编程,Reference: [1] OpenMP forum, http://www.openmp.org/forum/ [2] OpenMP tutorial: https://computing.llnl.gov/tutorials/openMP/ [3] Getting Started with OpenMP: http://rac.uits.iu.edu/hpc/openmp_tutorial/C/,内容,OpenMP基本概念 OpenMP编程模型 线程创建与工作分摊 数据处理 任务调度 线程间的同步 OpenMP库函数详解 OpenMP环境变量,1 OpenMP基本概念,OpenMP是为共享存储环境编写并行程序而设计的一个应用编程接口 OpenMP的组成 两种并行编程方式 编译指导语句,在编译过程并行化代码 运行时库函数,在运行时对并行环境支持,1 OpenMP基本概念,基于Fork-Join的形式,1 OpenMP基本概念,优点: 相对简单不需要显式设置互斥锁,条件变量,数据范围以及初始化 可扩展主要是利用添加并行化指令到顺序程序中,由编译器完成自动并行化。

      移植性好可以在不同的产商提供的共享存储体系结构间比较容易地移植 缺点: 当程序比较复杂的时候,编程会显得比较困难,1 OpenMP基本概念,OpenMP具有良好的可移植性 支持多种编程语言 Intel的Fortran C/C++ Microsoft的Visual Studio 2005以上版本 gcc4.2以上版本 支持多种平台 混合模型:OpenMP(共享内存)和MPI(分布式存储),使用Visual Studio编写OpenMP程序 必要步骤: 1)生成Console项目; 2)配置项目,使之支持OpenMP; 3)编写代码,加入#include “omp.h”; 4)配置环境变量OMP_NUM_THREADS,确定线程数目; 5)执行程序1 OpenMP基本概念,1)生成Console项目,,使用Visual Studio编写OpenMP程序,2)配置项目属性,使用Visual Studio编写OpenMP程序,3)编写代码,#include “omp.h” int main() { printf(“Hello from serial.\n”); printf(“Thread number = %d\n”,omp_get_thread_num()); #pragma omp parallel { printf(“Hello from parallel. Thread number=%d\n”, omp_get_thread_num()); } printf(“Hello from serial again.\n”); return 0; },使用Visual Studio编写OpenMP程序,4)设置环境变量,,使用Visual Studio编写OpenMP程序,4)设置环境变量,默认的情况下 OMP_NUM_THREADS=系统中逻辑CPU的数目 在双核的系统中OMP_NUM_THREADS=2 双核超线程的逻辑CPU的数目为4。

      使用Visual Studio编写OpenMP程序,5)执行程序,使用Visual Studio编写OpenMP程序,2 OpenMP的编程模型,编译指导语句格式 OpenMP主要命令 OpenMP主要子句 OpenMP主要库函数,2.1 编译指导语句格式,编译器会识别特定的注释,包括OpenMP的编译指导语句pragma omp directive_name …,parallel,用在一个代码段之前,表示这段代码将被多个线程并行执行 for,用于for循环之前,将循环分配到多个线程中并行执行,必须保证每次循环之间无相关性 parallel for, parallel 和 for语句的结合,也是用在一个for循环之前,表示for循环的代码将被多个线程并行执行 sections,用在可能会被并行执行的代码段之前 parallel sections,parallel和sections两个语句的结合 critical,用在一段代码临界区之前 是线程私有的2.2 OpenMP主要命令,single,用在一段只被单个线程执行的代码段之前,表示后面的代码段将被单线程执行 flush,用来保证线程的内寸视图和实际内存保持一致。

      barrier,用于并行区内代码的线程同步,所有线程执行到barrier时要停止,直到所有线程都执行到barrier时才继续往下执行 atomic,用于指定一块内存区域被自动更新 master,用于指定一段代码块由主线程执行 ordered,用于指定并行区域的循环按顺序执行 threadprivate, 用于指定一个变量是线程私有的2.2 OpenMP主要命令,2.3 OpenMP主要子句,private, 指定每个线程都有它自己的变量私有副本 firstprivate,指定每个线程都有它自己的变量私有副本,并且变量要被继承主线程中的初值 lastprivate,主要是用来指定将线程中的私有变量的值在并行处理结束后复制回主线程中的对应变量 reduce,用来指定一个或多个变量是私有的,并且在并行处理结束后这些变量要执行指定的运算 nowait,忽略指定中暗含的等待 num_threads,指定线程的个数 schedule,指定如何调度for循环迭代,,2.3 OpenMP主要子句,shared,指定一个或多个变量为多个线程间的共享变量 ordered,用来指定for循环的执行要按顺序执行 copyprivate,用于single指令中的指定变量为多个线程的共享变量 copyin,用来指定一个threadprivate的变量的值要用主线程的值进行初始化。

      default,用来指定并行处理区域内的变量的使用方式,缺省是shared,,2.3 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_destroy_lock,关闭一个锁3. 创建线程与工作分摊,创建线程:通过编译指导语句实现 创建线程的命令: parallel for sections section,3.1 parallel命令,parallel命令是用来构造一个并行域,并行域中的代码被所有的线程执行 parallel可以和for、sections配合使用 格式 #pragma omp parallel [for|sections] [子句[子句]…],int main() { #pragma omp parallel { printf(“hello world! \n”); } },程序的输出结果: hello world! hello world! hello world! hello world!,3.1 parallel命令,执行过程: 当主线程遇到parallel指令,则创建一组线程(包含主线程),主线程的线程号为0。

      从这个并行区域开始,代码被复制并被所有线程执行 并行区域结束时有个隐藏的关卡,只有主线程能在此之后继续执行 并行区域内的任何线程终止都会终止所有的线程,3.1 parallel命令,指定线程数量: num_threads子句的设置 omp_set_num_threads() 库函数 OMP_NUM_THREADS 环境变量 默认——计算机的CPU数量int main() { #pragma omp parallel num_threads(8) { printf(“hello world! ,ThreadId=%d\n”,omp_get_thread_num()); } },3.1 parallel命令,支持的子句 if(线程数) private (list) firstprivate (list) default(shared|none) shared (list) copyin (list) reduction (operator: list) num_threads(线程数),3.2 for和parallel for命令,for指令:将一个for循环分配到多个线程中执行; for指令可以和parallel合并使用,parallel for; for指令也可以单独用在parallel语句的并行域中。

      格式 #pragma omp [parallel] for [子句] for循环语句,3.2 for和parallel for命令,例:for指令没在一个并行区域 int j = 0; #pragma omp for for ( j = 0; j 4; j++ ) { printf(“j = %d, ThreadId = %d\n”, j, omp_get_thread_num()); },执行结果 j = 0, ThreadId = 0 j = 1, ThreadId = 0 j = 2, ThreadId = 0 j = 3, ThreadId = 0,例:for指令在一个并行区域 int j = 0; #pragma omp parallel { #pragma omp for for ( j = 0; j 4; j++ ) { printf(“j = %d, ThreadId = %d\n”, j, omp_get_thread_num()); } },执行结果: j = 1, ThreadId = 1 j = 3, ThreadId = 3 j = 2, ThreadId = 2 j = 0, ThreadId = 0,3.2 for和parallel for命令,3.2 for和parallel for命令,例:parallel和for组合 int j = 0; #pragma omp parallel for { for ( j = 0; j 4; j++ ) { printf(“j = %d, ThreadId = %d\n”, j, omp_get_thread_num()); } },执行结果: j = 0, ThreadId = 0 j = 3, ThreadId = 3 j = 2, ThreadId = 2 j = 1, ThreadId = 1,parallel for : #pragma omp parallel for for( i = first ; ilast ; i++){ body of the loop; } parallel与for分离的版本: #pragma omp parallel { #pragma omp for for( i = first ; ilast ; i++){ body of the loop; } },3.2 for和parallel for命令,,parallel 将紧跟的程序块扩展为若干相同的并行区域 for 将循环中工作分配到线程组中,#pragma omp parallel for (int i=0; i5; i++) printf (“hello world i=%d\n”, i);,#pragma omp parallel for for (int i=0; i5; i++) printf (“hello world i=%d\n”, i);,3.2 for和parallel for命令,例:分析程序输出结果,循环嵌套,外层循环并行化 in。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.