- 1、本文档共106页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5、OpenMP及并行程序设计问题的解决办法剖析
outline OpenMP 一些并行程序设计问题的解决办法 OpenMP 提供一种快捷简单的多线程编程方法 形成于1997年,是一种应用程序接口 对编程人员: 无需进行复杂的线程创建、同步、负载平衡和销毁工作。 只需要认真考虑哪些循环应该以多线程方式运行。 Intel编译器提供对OpenMP的支持。 ··· OpenMP 结合了两种并行编程的方式 编译指导语句,在编译过程并行化代码 运行时库函数,在运行时对并行环境支持 OpenMP应用程序的组成部分 三次执行的结果 在Microsoft Visual Studio .Net 2005环境下面编写OpenMP程序的必要步骤 1)生成Console项目; 2)配置项目,使之支持OpenMP; 3)编写代码,加入#include “omp.h”; 4)编写源程序; 5)配置环境变量OMP_NUM_THREADS,确定线程数目; 6)执行程序。 fork-Join执行模式 在开始执行的时候,只有主线程的运行线程存在 主线程在运行过程中,当遇到需要进行并行计算的时候,派生出(Fork,创建新线程或者唤醒已有线程)线程来执行并行任务 在并行执行的时候,主线程和派生线程共同工作 在并行代码结束执行后,派生线程退出或者挂起,不再工作,控制流程回到单独的主线程中(Join,即多线程的会和)。 作用域 并行域结构 并行域中的代码被所有的线程执行 具体格式 #pragma omp parallel [clause[[,]clause]…]newline clause= if(scalar-expression) private(list) firstprivate(list) default(shared | none) shared(list) copyin(list) reduction(operator: list) num_threads(integer-expression) 共享任务结构 共享任务结构将它所包含的代码划分给线程组的各成员来执行 并行for循环 并行sections 串行执行 for编译制导语句 for语句指定紧随它的循环语句必须由线程组并行执行; 语句格式 #pragma omp for [clause[[,]clause]…] newline [clause]= Schedule(type [,chunk]) ordered private (list) firstprivate (list) lastprivate (list) shared (list) reduction (operator: list) nowait for编译制导语句 schedule子句描述如何将循环的迭代划分给线程组中的线程 如果没有指定chunk大小,迭代会尽可能的平均分配给每个线程 type为static,循环被分成大小为 chunk的块,静态分配给线程 type为dynamic,循环被动态划分为大小为chunk的块,动态分配给线程 循环并行化语句的限制 循环并行化的语句必须具有如下的形式 for (index = start ; index end ; increment_expr) index必须是一个整数 小于号()也可以被其它的比较操作符替代 start和end可以是任意的数值表达式,但是在循环的过程中其值不能改变,以保证能够在循环之前就计算出循环的次数。 increment_expr形式如下,其中incr是一个在循环过程中不变的数值表达式 循环语句块应该是单出口与单入口的,在循环过程中不能使用break、goto和return语句 可以使用continue语句,因为这个语句不影响循环执行的次数。 简单循环并行化 将两个向量相加,并将计算的结果保存到第三个向量中,向量的维数为n for(int i=0;in;i++) z[i]=x[i]+y[i]; 各个分量之间没有数据相关性 循环计算的过程也没有循环依赖性 程序改成 #pragma omp parallel for for(int i=0;in;i++) z[i]=x[i]+y[i]; 循环并行化编译指导语句的子句 循环并行化子句可以包含一个或多个子句来控制循环并行化的执行 有多个类型的子句可以用来控制循环并行化编译 最主要的子句是数据作用域子句。 由于有多线程同时执行循环语句中的功能指令,这就涉及到数据的作用域问题 作用域用来控制某一个变量是否是在各个线程之间共享或者是某一个线程是私有的 数据的作用域子句用shared来表示一个变量是各个线程之间共享的 用private来表示一个变量是每一个线程私有的 默认的变量作用域是共享的 其他编译指导子句 用来控制线程的调度(sc
文档评论(0)