多核软件开发技术第六讲 OpenMP多线程编程及性能优化_第1页
多核软件开发技术第六讲 OpenMP多线程编程及性能优化_第2页
多核软件开发技术第六讲 OpenMP多线程编程及性能优化_第3页
多核软件开发技术第六讲 OpenMP多线程编程及性能优化_第4页
多核软件开发技术第六讲 OpenMP多线程编程及性能优化_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、多核软件开发技术 第六讲: OpenMP多线程编程及性能优化,北京大学 二零零八年春季 *致谢:感谢Intel对本课程项目的资助,本讲主要内容,OpenMP编程简介 OpenMP多线程应用程序编程技术 OpenMP多线程应用程序性能分析,OpenMP编程简介,OpenMP多线程编程发展概况,OpenMP是一种面向共享内存以及分布式共享内存的多处理器多线程并行编程语言 OpenMP是一种能够被用于显示指导多线程、共享内存并行的应用程序编程接口(API) OpenMP具有良好的可移植性 支持多种编程语言 支持多种平台,OpenMP多线程编程基础,OpenMP的编程模型以线程为基础 通过编译指导语句

2、来显示地指导并行化 OpenMP的执行模型采用Fork-Join的形式 在开始时,只有一个叫做主线程的运行线程存在 在运行过程中,当遇到需要进行并行计算的时候,派生出(Fork)线程来执行并行任务 在并行代码结束执行,派生线程退出或挂起,控制流程回到单独的主线程中(Join),OpenMP应用程序运行时的Fork-Join模型,编译指导语句,在编译器编译程序的时候,会识别特定的注释,而这些注释就包含着OpenMP程序的一些语义 在一个无法识别OpenMP语意的普通编译器中,这些注释会被当作普通的注释而被忽略 在C/C+程序中,OpenMP所有编译指导语句以#pragma omp开始,后面跟具体

3、功能指令,运行时库函数,OpenMP运行时函数库主要用以设置和获取执行环境相关的信息 它们当中也包含一系列用以同步的API,使用VS 2005编写OpenMP程序,当前的Visual Studio .Net 2005完全支持OpenMP 2.0标准 通过新的编译器选项 /openmp来支持OpenMP程序的编译和链接,建立一个新的项目,配置项目属性,设置环境变量,OpenMP多线程应用程序编程技术,循环并行化,循环并行化是使用OpenMP来并行化程序的最重要的部分 在C/C+语言中,循环并行化语句的编译指导语句格式如下: #pragma omp parallel for clauseclaus

4、e for( index = first ; test_expr ; increment_expr) body of the loop; ,循环并行化语句的限制,并不是所有的循环语句都能够在其前面加上#pragma omp parallel来实现并行化 并行化的语句必须是for循环语句并具有规范格式 能够推测出循环的次数 for (index = start ; index end ; increment_expr) 在循环过程中不能使用break语句 不能使用goto和return语句从循环中跳出 可以使用continue语句,循环并行化编译指导语句的子句,循环并行化子句可以包含一个或者多个

5、子句来控制循环并行化的实际执行 常见子句有: 作用域子句 控制线程的调度(schedule )子句 动态控制是否并行化(if )子句 进行同步的子句(ordered )子句 控制变量在串行部分与并行部分传递(copyin )子句,循环嵌套,可以将嵌套循环的任意一个循环体进行并行化 循环并行化编译指导语句可以加在任意一个循环之前 对应的最近的循环语句被并行化,其它部分保持不变,控制数据的共享属性,OpenMP程序在同一个共享内存空间上执行 可以任意使用这个共享内存空间上的变量进行线程间的数据传递 OpenMP还允许线程保留自己的私有变量不能让其它线程访问到,使用作用域子句的一些规则,作用域子句作

6、用的变量是已经申明的有名变量 作用域子句在作用到类或者结构的时候,只能作用到类或者结构的整体,而不能只作用域类或者结构的一个部分 一个编译指导语句能够包含多个数据作用域子句 作用域子句只能作用在出现在编译指导语句起作用的语句变量部分,规约操作的并行化,在规约操作中,会反复将一个二元运算符应用在一个变量和另外一个值上,并把结果保存在原变量中 在使用规约操作时,只需在变量前指明规约操作的类型以及规约的变量 # pragma omp parallel for private(arx,ary,n) reduction(+:a,b) for(i=0;in;i+) a=a+arxi; b=b+aryi;

7、,规约操作并行化的限制,并不是所有的操作都能够使用规约操作 所有能够在OpenMP的C/C+语言中出现的规约操作,数据相关性与并行化操作,并不是所有的循环都能够使用#pragma omp parallel for来进行并行化 必须要保证数据两次循环之间不存在数据相关性 数据相关性又被称为数据竞争(Data Race) 当两个线程对同一个变量进行操作,并且有一个操作为写操作的时候,就说明这两个线程存在数据竞争,并行区域编程,循环并行化实际上是并行区域编程的一个特例 并行区域简单的说就是通过循环并行化编译指导语句使得一段代码能够在多个线程内部同时执行 在C/C+语言中,并行区域编写的格式如下: #

8、pragma omp parallel clauseclause block,parallel编译指导语句的执行过程,当程序遇到parallel编译指导语句的时候,就会生成相应数目(根据环境变量)的线程组成一个线程组,并将代码重复地在各个线程内部执行 parallel的末尾有一个隐含的同步屏障(barrier),所有线程完成所需的重复任务有,在这个同步屏障出会和(join),工作队列,工作队列的基本工作过程: 为维持一个工作的队列,线程在并行执行的时候,不断从这个队列中取出相应的工作完成,直到队列为空为止,根据线程号分配任务,每一个线程在执行的过程中的线程标识号是不同的 可以根据这个线程标识号

9、来分配不同的任务 #pragma omp parallel private(myid) nthreads=omp_get_num_threads(); myid=omp_get_thread_num(); get_my_work_done(myid,nthreads); ,线程同步,OpenMP支持两种不同类型的线程同步机制 : 互斥锁:可以用来保护一块共享的存储空间,使得每一次访问这块共享内存空间的线程最多一个,保证了数据的完整性 事件通知:这种机制保证了多个线程之间的执行顺序,互斥锁机制,用来对一块内存进行保护 OpenMP提供了三种不同的互斥锁机制 : 临界区(critical) 原子操

10、作(atomic) 由库函数来提供同步操作,临界区(critical),临界区通过编译指导语句对产生数据竞争的内存变量进行保护 在程序需要访问可能产生竞争的内存数据的时候,都需要插入相应的临界区代码 #pragma omp critical (name) block 在执行上述的程序块block之前,必须首先要获得临界区的控制权,原子操作,现代体系结构的多处理计算机提供了原子更新一个单一内存单元的方法 通过单一一条指令就能够完成数据的读取与更新操作 通过这种方式就能够完成对单一内存单元的更新,提供了一种更高效率的互斥锁机制 #pragma omp atomic x =expr,运行时库函数的互

11、斥锁支持,事件同步机制,用来控制代码的执行顺序,使得某一部分代码必须在其它的代码执行完毕之后才能执行 OpenMP中的事件同步主要包括: 同步屏障(barrier) 定序区段(ordered sections) 主线程执行(master),隐含的同步屏障(barrier),在每一个并行区域都会有一个隐含的同步屏障 一个同步屏障要求所有的线程执行到此屏障,然后才能够继续执行下面的代码 #pragma omp for,#pragma omp single, #pragma omp sections程序块都包含自己的隐含的同步屏障 为了避免在循环过程中不必要的同步屏障,可以增加nowait子句到相应的编译指导语句中,明确的同步屏障语句,在有些情况下,隐含的同步屏障并不能提供有效的同步措施 程序员可以在需要的地方插入明确的同步屏障语句#pragma omp barrier 在并行区域的执行过程中,所有的执行线程都会在同步屏障语句上进行同步 #pragma omp parallel initialization(); #pragma omp barrier process(); ,循环并行化中的顺序语句(ordered),对于循环并行化中的某些处理需要规定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论