版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
多核软件开发技术
第六讲:OpenMP多线程编程及性能优化
北京大学二零零八年春季*致谢:感谢Intel对本课程项目的资助本讲主要内容OpenMP编程简介OpenMP多线程应用程序编程技术OpenMP多线程应用程序性能分析OpenMP编程简介OpenMP多线程编程基础OpenMP的编程模型以线程为基础通过编译指导语句来显示地指导并行化OpenMP的执行模型采用Fork-Join的形式在开始时,只有一个叫做主线程的运行线程存在在运行过程中,当遇到需要进行并行计算的时候,派生出(Fork)线程来执行并行任务在并行代码结束执行,派生线程退出或挂起,控制流程回到单独的主线程中(Join)MasterThreadParallelRegionNestedParallelRegionOpenMP应用程序运行时的Fork-Join模型编译指导语句在编译器编译程序的时候,会识别特定的注释,而这些注释就包含着OpenMP程序的一些语义在一个无法识别OpenMP语意的普通编译器中,这些注释会被当作普通的注释而被忽略在C/C++程序中,OpenMP所有编译指导语句以#pragmaomp开始,后面跟具体功能指令使用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;index<end;increment_expr)在循环过程中不能使用break语句不能使用goto和return语句从循环中跳出可以使用continue语句循环嵌套可以将嵌套循环的任意一个循环体进行并行化循环并行化编译指导语句可以加在任意一个循环之前对应的最近的循环语句被并行化,其它部分保持不变控制数据的共享属性OpenMP程序在同一个共享内存空间上执行可以任意使用这个共享内存空间上的变量进行线程间的数据传递OpenMP还允许线程保留自己的私有变量不能让其它线程访问到使用作用域子句的一些规则作用域子句作用的变量是已经申明的有名变量作用域子句在作用到类或者结构的时候,只能作用到类或者结构的整体,而不能只作用域类或者结构的一个部分一个编译指导语句能够包含多个数据作用域子句作用域子句只能作用在出现在编译指导语句起作用的语句变量部分规约操作并行化的限制并不是所有的操作都能够使用规约操作所有能够在OpenMP的C/C++语言中出现的规约操作运算符数据类型默认初始值+整数,浮点0*整数,浮点1-整数,浮点0&整数所有位都开启,~0|整数0^整数0&&整数1||整数0数据相关性与并行化操作并不是所有的循环都能够使用#pragmaompparallelfor来进行并行化必须要保证数据两次循环之间不存在数据相关性数据相关性又被称为数据竞争(DataRace)当两个线程对同一个变量进行操作,并且有一个操作为写操作的时候,就说明这两个线程存在数据竞争并行区域编程循环并行化实际上是并行区域编程的一个特例并行区域简单的说就是通过循环并行化编译指导语句使得一段代码能够在多个线程内部同时执行在C/C++语言中,并行区域编写的格式如下: #pragmaompparallel[clause[clause]…] block工作队列工作队列的基本工作过程:为维持一个工作的队列,线程在并行执行的时候,不断从这个队列中取出相应的工作完成,直到队列为空为止根据线程号分配任务每一个线程在执行的过程中的线程标识号是不同的可以根据这个线程标识号来分配不同的任务#pragmaompparallelprivate(myid){nthreads=omp_get_num_threads();myid=omp_get_thread_num();get_my_work_done(myid,nthreads);}临界区(critical)临界区通过编译指导语句对产生数据竞争的内存变量进行保护在程序需要访问可能产生竞争的内存数据的时候,都需要插入相应的临界区代码#pragmaompcritical[(name)] block在执行上述的程序块block之前,必须首先要获得临界区的控制权原子操作现代体系结构的多处理计算机提供了原子更新一个单一内存单元的方法通过单一一条指令就能够完成数据的读取与更新操作通过这种方式就能够完成对单一内存单元的更新,提供了一种更高效率的互斥锁机制#pragmaompatomic x<binop>=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(); #pragmaompbarrier process();}循环并行化中的顺序语句(ordered)对于循环并行化中的某些处理需要规定执行的顺序典型的情况:在一次循环的过程中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年智能药箱定时提醒与用药管理功能应用
- 护理管理的职业发展
- 2026年地下管线事故应急响应机制:外力破坏事故降幅超92%的北京经验
- 2026年柔性夹爪选型四步法需求建模参数对比实测验证成本优化
- 2026年整车检修能力625辆 年的产线规划与能力提升
- 2026年超大规模智算集群建设提升智能算力高质量供给技术方案
- 2026年网络安全数据保护
- 2026年太极拳入门教程养生课件
- 2026年实验室生物安全柜使用培训
- 2026年上班族养生保健操课件
- 海报设计培训课件
- 燃气公司档案管理制度及实施细则
- 医院应急应对培训课件
- 2026年辽宁生态工程职业学院单招职业技能测试题库附答案
- 医疗服务窗口人员接待技巧
- 2026年内蒙古电子信息职业技术学院单招(计算机)测试模拟题库及答案1套
- DB41∕T 2815-2025 地质灾害标志标牌
- 2026年长沙民政职业技术学院单招职业技能测试题库附答案详解
- 企业管理-云仓储公司组织架构图及各岗位职责SOP
- 国家林业和草原局直属单位招聘笔试真题2025年附答案
- 2025年《数据安全治理》知识考试题库及答案解析
评论
0/150
提交评论