1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
OpenMP编程

多核程序设计 吉林大学计算机科学与技术学院 包铁 邮箱:baotie@jlu.edu.cn 1 体系结构 共享内存多处理器 内存是共享的,某一个处理器写入内存的数据会立刻被其它处理器访问到。 分布式内存 每一个处理器或者一组处理器有一个自己私有的内存单元 共享或者不共享一个公用的内存单元 Fork-Join执行模式 在开始执行的时候,只有主线程的运行线程存在 主线程在运行过程中,当遇到需要进行并行计算的时候,派生出(Fork,创建新线程或者唤醒已有线程)线程来执行并行任务 在并行执行的时候,主线程和派生线程共同工作 在并行代码结束执行后,派生线程退出或者挂起,不再工作,控制流程回到单独的主线程中(Join,即多线程的会和)。 OpenMP的功能 由两种形式提供 编译指导语句 运行时库函数 通过环境变量的方式灵活控制程序的运行,例如:通过OMP_NUM_THREADS值来控制运行线程的数目。 运行时库函数 OpenMP运行时函数库原本用以设置和获取执行环境相关的信息,它们当中也包含一系列用以同步的API 支持运行时对并行环境的改变和优化,给编程人员足够的灵活性来控制运行时的程序运行状况。 对运行阶段给予支持,打破了源代码在串行和并行之间的一致性。 OpenMP头文件omp.h OpenMP应用程序构成 结合了两种并行编程的方式 编译指导语句,在编译过程并行化代码 运行时库函数,在运行时对并行环境支持 OpenMP应用程序的组成部分 实例程序1三次执行的结果 在Microsoft Visual Studio .Net 2005环境下面编写OpenMP程序的必要步骤 1)生成Console项目; 2)配置项目,使之支持OpenMP; 3)编写代码,加入#include “omp.h”; 4)编写源程序; 5)配置环境变量OMP_NUM_THREADS,确定线程数目; 6)执行程序。 循环并行化语句的限制 循环并行化的语句必须具有如下的形式: 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来表示一个变量是每一个线程私有的 默认的变量作用域是共享的 循环并行化编译指导语句的子句 此处与C/C++的数据作用域不同—语言层面的作用域(语法作用域) 其他编译指导子句 用来控制线程的调度(schedule子句) 动态控制是否并行化(if子句) 进行同步的子句(ordered子句) 控制变量在串行部分与并行部分传递的子句(copyin子句) 循环嵌套 循环并行化编译指导语句可以加在任意一个循环之前 对应的最近的循环语句被并行化,其它部分保持不变 int i;int j #pragma omp parallel for private(j) for(i=0;i2;i++) for(j=6;j10;j++) printf(“i=%d j=%d\n”,i,j); 循环嵌套比较(程序段3、4) int i;int j #pragma omp parallel for private(j) for(i=0; i2; i++) for(j=6; j10;

文档评论(0)

bm5044 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档