多核软件开发技术第六讲 OpenMP多线程编程及性能优化

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

多核软件开发技术第六讲:OpenMP多线程编程及性能优化北京大学二零零八年春季*致谢:感谢Intel对本课程项目的资助本讲主要内容•OpenMP编程简介•OpenMP多线程应用程序编程技术•OpenMP多线程应用程序性能分析OpenMP编程简介OpenMP多线程编程发展概况•OpenMP是一种面向共享内存以及分布式共享内存的多处理器多线程并行编程语言•OpenMP是一种能够被用于显示指导多线程、共享内存并行的应用程序编程接口(API)•OpenMP具有良好的可移植性–支持多种编程语言–支持多种平台OpenMP多线程编程基础•OpenMP的编程模型以线程为基础•通过编译指导语句来显示地指导并行化•OpenMP的执行模型采用Fork-Join的形式•在开始时,只有一个叫做主线程的运行线程存在•在运行过程中,当遇到需要进行并行计算的时候,派生出(Fork)线程来执行并行任务•在并行代码结束执行,派生线程退出或挂起,控制流程回到单独的主线程中(Join)MasterThreadParallelRegionNestedParallelRegionOpenMP应用程序运行时的Fork-Join模型编译指导语句•在编译器编译程序的时候,会识别特定的注释,而这些注释就包含着OpenMP程序的一些语义•在一个无法识别OpenMP语意的普通编译器中,这些注释会被当作普通的注释而被忽略•在C/C++程序中,OpenMP所有编译指导语句以#pragmaomp开始,后面跟具体功能指令运行时库函数•OpenMP运行时函数库主要用以设置和获取执行环境相关的信息•它们当中也包含一系列用以同步的API编译指导语句运行时函数库环境变量使用VS2005编写OpenMP程序•当前的VisualStudio.Net2005完全支持OpenMP2.0标准•通过新的编译器选项/openmp来支持OpenMP程序的编译和链接建立一个新的项目配置项目属性设置环境变量OpenMP多线程应用程序编程技术循环并行化•循环并行化是使用OpenMP来并行化程序的最重要的部分•在C/C++语言中,循环并行化语句的编译指导语句格式如下:#pragmaompparallelfor[clause[clause…]]for(index=first;test_expr;increment_expr){bodyoftheloop;}循环并行化语句的限制•并不是所有的循环语句都能够在其前面加上#pragmaompparallel来实现并行化•并行化的语句必须是for循环语句并具有规范格式•能够推测出循环的次数•for(index=start;indexend;increment_expr)•在循环过程中不能使用break语句•不能使用goto和return语句从循环中跳出•可以使用continue语句循环并行化编译指导语句的子句•循环并行化子句可以包含一个或者多个子句来控制循环并行化的实际执行•常见子句有:–作用域子句–控制线程的调度(schedule)子句–动态控制是否并行化(if)子句–进行同步的子句(ordered)子句–控制变量在串行部分与并行部分传递(copyin)子句循环嵌套•可以将嵌套循环的任意一个循环体进行并行化•循环并行化编译指导语句可以加在任意一个循环之前•对应的最近的循环语句被并行化,其它部分保持不变控制数据的共享属性•OpenMP程序在同一个共享内存空间上执行•可以任意使用这个共享内存空间上的变量进行线程间的数据传递•OpenMP还允许线程保留自己的私有变量不能让其它线程访问到使用作用域子句的一些规则•作用域子句作用的变量是已经申明的有名变量•作用域子句在作用到类或者结构的时候,只能作用到类或者结构的整体,而不能只作用域类或者结构的一个部分•一个编译指导语句能够包含多个数据作用域子句•作用域子句只能作用在出现在编译指导语句起作用的语句变量部分规约操作的并行化•在规约操作中,会反复将一个二元运算符应用在一个变量和另外一个值上,并把结果保存在原变量中•在使用规约操作时,只需在变量前指明规约操作的类型以及规约的变量•#pragmaompparallelforprivate(arx,ary,n)reduction(+:a,b)•for(i=0;in;i++){•a=a+arx[i];•b=b+ary[i];•}规约操作并行化的限制•并不是所有的操作都能够使用规约操作•所有能够在OpenMP的C/C++语言中出现的规约操作运算符数据类型默认初始值+整数,浮点0*整数,浮点1-整数,浮点0&整数所有位都开启,~0|整数0^整数0&&整数1||整数0数据相关性与并行化操作•并不是所有的循环都能够使用#pragmaompparallelfor来进行并行化•必须要保证数据两次循环之间不存在数据相关性•数据相关性又被称为数据竞争(DataRace)•当两个线程对同一个变量进行操作,并且有一个操作为写操作的时候,就说明这两个线程存在数据竞争并行区域编程•循环并行化实际上是并行区域编程的一个特例•并行区域简单的说就是通过循环并行化编译指导语句使得一段代码能够在多个线程内部同时执行•在C/C++语言中,并行区域编写的格式如下:#pragmaompparallel[clause[clause]…]blockparallel编译指导语句的执行过程•当程序遇到parallel编译指导语句的时候,就会生成相应数目(根据环境变量)的线程组成一个线程组,并将代码重复地在各个线程内部执行•parallel的末尾有一个隐含的同步屏障(barrier),所有线程完成所需的重复任务有,在这个同步屏障出会和(join)工作队列工作队列的基本工作过程:•为维持一个工作的队列,线程在并行执行的时候,不断从这个队列中取出相应的工作完成,直到队列为空为止根据线程号分配任务•每一个线程在执行的过程中的线程标识号是不同的•可以根据这个线程标识号来分配不同的任务#pragmaompparallelprivate(myid){nthreads=omp_get_num_threads();myid=omp_get_thread_num();get_my_work_done(myid,nthreads);}线程同步OpenMP支持两种不同类型的线程同步机制:•互斥锁:可以用来保护一块共享的存储空间,使得每一次访问这块共享内存空间的线程最多一个,保证了数据的完整性•事件通知:这种机制保证了多个线程之间的执行顺序互斥锁机制•用来对一块内存进行保护•OpenMP提供了三种不同的互斥锁机制:–临界区(critical)–原子操作(atomic)–由库函数来提供同步操作临界区(critical)•临界区通过编译指导语句对产生数据竞争的内存变量进行保护•在程序需要访问可能产生竞争的内存数据的时候,都需要插入相应的临界区代码•#pragmaompcritical[(name)]block•在执行上述的程序块block之前,必须首先要获得临界区的控制权原子操作•现代体系结构的多处理计算机提供了原子更新一个单一内存单元的方法•通过单一一条指令就能够完成数据的读取与更新操作•通过这种方式就能够完成对单一内存单元的更新,提供了一种更高效率的互斥锁机制•#pragmaompatomicxbinop=expr运行时库函数的互斥锁支持函数名称描述voidomp_init_lock(omp_lock_t*)初始化一个互斥锁voidomp_destroy_lock(omp_lock_t*)结束一个互斥锁的使用并释放内存voidomp_set_lock(omp_lock_t*)获得一个互斥锁voidomp_unset_lock(omp_lock_t*)释放一个互斥锁intomp_test_lock(omp_lock_t*)试图获得一个互斥锁,并在成功是返回真(true),失败是返回假(false)事件同步机制•用来控制代码的执行顺序,使得某一部分代码必须在其它的代码执行完毕之后才能执行•OpenMP中的事件同步主要包括:–同步屏障(barrier)–定序区段(orderedsections)–主线程执行(master)隐含的同步屏障(barrier)•在每一个并行区域都会有一个隐含的同步屏障•一个同步屏障要求所有的线程执行到此屏障,然后才能够继续执行下面的代码•#pragmaompfor,#pragmaompsingle,#pragmaompsections程序块都包含自己的隐含的同步屏障•为了避免在循环过程中不必要的同步屏障,可以增加nowait子句到相应的编译指导语句中明确的同步屏障语句•在有些情况下,隐含的同步屏障并不能提供有效的同步措施•程序员可以在需要的地方插入明确的同步屏障语句#pragmaompbarrier•在并行区域的执行过程中,所有的执行线程都会在同步屏障语句上进行同步•#pragmaompparallel{initialization();#pragmaompbarrierprocess();}循环并行化中的顺序语句(ordered)•对于循环并行化中的某些处理需要规定执行的顺序•典型的情况:在一次循环的过程中–一大部分的工作是可以并行执行的,而其余的工作需要等到前面的工作全部完成之后才能够执行•在循环并行化的过程中,可以使用ordered子句使得顺序执行的语句直到前面的循环都执行完毕之后再执行OpenMP多线程应用程序性能分析影响性能的主要因素•程序并行部分的比率•OpenMP本身的开销•负载均衡•局部性•线程同步带来的开销

1 / 37
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功