- 1、本文档共30页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
[计算机]多核程序设计
多核技术 OpenMP多线程编程基础 共享内存多线程应用程序的Fork-Join模型如图 主线程运行中,遇到并行编译指导语句,根据环境变量派生出线程 某个派生线程遇到另一个编译指导语句,又派生出另外一组线程。 新线程组在通过一个隐含的同步屏障后,汇合成原有的线程。 OpenMP多线程编程基础 OpenMP同时支持C/C++语言和Fortran语言,可选择任意一种语言及支持OpenMP的编译器编写OpenMP程序。 OpenMP应用程序的三个组成部分 编译指导语句 运行时库函数 环境变量:通过环境变量的方式可以灵活控制程序的运行。 例如:通过环境变量OMP_NUM_THREADS值控制运行的线程的数目 OpenMP多线程编程基础 运行时库函数 使用运行时函数库所包含的函数,必须在相应的源文件中包含OpenMP头文件,即#include “omp.h” 四个最常用的OpenMP库函数 int omp_get_num_threads(void)返回当前使用的线程个数。 int omp_set_num_threads(int NumThreads)在进入并行区域前,该函 数设置将要使用的线程个数。 int omp_get_thread_num(void)返回当前线程号,值在0(主线程)到线 程总数减1之间。 int omp_get_num_procs(void)返回可用的处理核(处理器)个数。支持超 线程技术的处理核或处理器将被算作两个处理核(或两个处理器)。 环境变量的设置 OpenMP程序编写步骤 生成Console项目; 配置项目,使之支持OpenMP; 编写代码,加入#include “omp.h”; 编写源程序; 配置环境变量OMP_NUM_THREADS,确定线程数目; 执行程序。 OpenMP编程技术——循环并行化 循环并行化语句的限制 循环并行化的语句必须具有如下的形式 for (index = start ; index end ; increment_expr) 其中小于号()也可以被其他的比较操作符替代,即可以替换成=,,=。 循环语句块应该是单入口与单出口的 不能使用break语句,也不能使用goto和return从循环中跳出,会使循环次数无法确定。但可以使用continue,其不影响循环执行的次数。 OpenMP编程技术——循环并行化 简单循环并行化(实验1) 例将两个向量相加,并将结果保存到第三个向量中, 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]; 例 for(int i=0;in;i++) z[i]=z[i-1]+x[i]+y[i]; 此循环具有循环依赖性,进行并行化时必须考虑,不能简单进行。 循环并行化编译指导语句的子句 循环并行化编译指导语句的子句 数据作用域子句 作用域用来控制某一个变量是否是在各线程之间共享或者是某一个线程所私有。 数据作用域子句用shared表示一个变量在各线程之间共享,用private表示一个变量是某个线程私有的。 在OpenMP中,默认的变量作用域是共享的。 用来控制线程调度的子句(schedule子句) 动态控制是否并行化子句(if子句) 进行同步的子句(ordered子句) 控制变量在串行部分与并行部分传递的子句(copyin子句) 循环并行化——循环嵌套 循环嵌套(实验2) 循环并行化编译指导语句可以加在任意一个循环之前,则对应的最近的循环语句被并行化,其它部分保持不变。实际上并行化是作用于嵌套循环中的某一个循环。 循环并行化——数据作用域子句 确定数据共享属性的数据作用域子句有以下4个 shared用来显示定义的一个变量作用域是共享的。 private用来显示定义的一个变量作用域是私有的。 firstprivate将串行的变量值复制到同名的私有变量中,且在每一个线程开始执行的时候初始化一次。 lastprivate将并行执行中的最后一次循环的私有变量值复制到同名的串行变量中。 default语句用来改变变量的默认私有属性。 只在Fortran里面有,在C/C++语言中没有default(shared) 循环并行化中firstprivate与lastprivate子句 私有变量的初始化和终结操作 OpenMP编译指导语句使用firstprivate在循环并
文档评论(0)