



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
OpenMP多线程编程(一)前言 总算学完了OpenMP多线程编程的内容,由于在读者上看到20岁以后,大脑就开始衰老,所以为了保持住不太牢靠的记忆,我决定重新拾起十年前的习惯:归纳总结OpenMP简介 OpenMP诞生于1997年,由此看来,已经是十多年的历史了。目前已经有3.0的版本了,但是我使用的是VS2005自带的2.0版本,所以有些功能还不是很健全,譬如task。注意其支持的语言主要是Fortran和C语言,所以各位朋友在选择的时候要谨慎处理。在这里,我想展开想象的翅膀,跑题到Java语言的多线程编程中看看。 据我目前的知识了解到,Java多线程编程主要是通过继承Thread类或实现Runnable接口来实现的。创建线程是通过new关键字,具体的操作在run()里完成。整体思想可以理解为:1.完成一个能实现具体功能的线程类,其中的“具体功能”体现在内部的run()方法中;2.如果想使用某个线程来完成上述类的具体功能,则需要在相应的位置生成该类的对象从而实现调用。这个过程是比较标准的OO编程思想。 回到我们的主题里,OpenMP可以理解为在C或Fotran语言里,利用自身的编译指导、库函数以及环境变量,对其功能进行拓展,简单易学。给个例子,大家自己体会一下,就很清晰了。1 #include stdafx.h;2 #include /OpenMP头文件3 int _tmain(int argc, _TCHAR* argv)4 5 printf("This is a OpenMPtest!n"); /串行执行6 printf("Start.n");7 #pragma omp parallel /生成多个线程,执行并行语句8 9 printf("Hello world! Thread number is %dn",omp_get_thread_num();10 /并行执行结束11 printf("The end!n");12 return 0;13 其中比较陌生的地方自然就是OpenMP的内容了:其中第7行是编译指导;第9行是库函数调用,为此我们引入了omp.h;其中具体有几个线程被生成,没有提到,这个是通过环境变量设置或默认的。编译环境选择及搭建 结合当前比较火热的编译器,我们选择VS2005,大材小用一次。我们只利用其中C+的控制台程序。但是由于其强大的库函数已包括OpenMP,所以无须自己添加环境,只需要修改配置即可。 在编译之前通过菜单项目OpenMPtest属性,选择配置属性|C/C+|语言,将OpenMP支持一项,修改为:是(/openmp)基本编译指导语句在OpenMP中,创建线程的编译指导语句格式如下:#pragma omp parallel clauseclause /并行区域代码 只有有了这句话,才能体现出“多线程”。而且,可以看出,该语法不是C或Fotran的语法,所以是独立的语句,如果对于不支持OpenMP的编译器,该语句也不会报错,会被当作注释忽略掉而维持单线程的执行模式,其优势不言而喻。由于是创建了多个线程执行相同的事情,可以理解是多个线程做重复的工作,而很多情况下,我们需要的是任务分配,每个线程做不同的工作。于是,有下面的语句可以完成。#pragma omp parallel for clauseclause for( index=first; test_ loop_variable;change_loop_variable) /循环体语句 注意,只是多了个for,之后的内容就是分解完成。对于第一个语句,可以理解为,同学们做作业,每人都需要完成;后者可以理解大家合作做项目,每个人只需要完成一个模块,最后集体完成一个项目即可。以上内容就已经帮我们创建多线程,以及任务分配了。我们需要在具体的需求下做具体的选择。先说到这儿,下次说说数据冲突,就是由于这些并行(多线程)而带来的后患,我们应该怎么处理OpenMP多线程编程(二)数据相关及解决 串行程序改为并行程序,最容易出现的新问题,就是数据相关与冲突了。本来由一个线程做的工作,分给多个线程做,自然会出现一些千丝万缕的瓜葛,如同一个人做的项目,现在由几个人来做,难免需要额外沟通和解释的。 数据相关的解决技术在OpenMP也已经比较完善了。结合OS的思想,数据冲突主要利用临界区和信号量来解决,另外OpenMP增加了数据规约。下面我们分别谈谈各自使用方法。临界区 万不得已的选择,因为它是并行程序中不得不串行的区域集合。所以,我们追求“小”,一个临界区可以拆分的话,尽量拆分。临界区的工作原理,是需要排队,然后依次执行的,所以效率很低。具体语句为:#pragma omp critical例子:累加求和。对于和的结果sum变量是共享的,所以需要临界区保护,但是效率已经降低为串行。数据规约 由于临界区的效率比较低,不能实现真正意义上的并行,而对于某些问题是可以通过分解的思路进行并行的。比如,上面的累加求和,是可以通过分别累加,然后再汇总的思路完成的,于是出现了数据规约的思想。语法:#pragma omp for reduction(+:sum) 上述语句就是将sum变量在每个线程中生成一个副本,计算各自线程中累加的结果,然后最后累加到共享的sum变量中。效率明显提高了吧?不过,这种用法是有局限性的,大家可以体会到写法上涉及到操作,所以,该用法只能用于基本运算符中的操作,譬如加减乘除之类的。原子操作 微型临界区。大家可能都听说过原子性,原子操作就是为了将读写绑定到一起,从而避免与更新有关的冲突,由于该“串行工作量”非常小,所以说原子操作提供了一种更高效率的互斥锁机制。#pragma omp atomic同样,原子操作也是只能用于特定的原子运算符:+,-,*,/,|,&,. 注意:以上语句一般都是在parallel语句内部使用,因为主要是由并发引出的一系列数据冲突问题,所以要在并行代码内解决这些冲突给大家补充一个例子吧:#include stdafx.h#include #include #include long long num_steps = 1000000000;double step;int _tmain(int argc, _TCHAR* argv)/*并行执行计算*/sum=0.0;start = clock();#pragma omp parallel for reduction(+:sum),private(x)/*并行控制语句:另外,对sum变量进行数据规约;对x变量进行私有化*/for (i=0; inum_steps; i+)x = (i + .5)*step;sum += 4.0/(1.+ x*x);pi = sum*s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中央废墟清缴管理办法
- 贵金属交易管理办法
- 《水利工程管理办法》
- 设计后评估管理办法
- 管理办法算不算制度
- 上门收费人员管理办法
- 磷矿石防盗管理办法
- 仓头中学餐馆管理办法
- 素数分析可再生能源-洞察及研究
- 网格员经费管理办法
- 电池及电池系统维修保养师国家职业标准(2024年)
- 软件可行性报告范文
- 脑转移瘤的治疗进展
- 临床成人失禁相关性皮炎的预防与护理团体标准解读
- 脚手架工安全技术交底(完整版)
- DB14-T 3095-2024 致密砂岩气开发排采水回注技术规范
- 接触网运行与检修 课件全套 薛艳红 第1-9章 电气化铁道概述-高速铁路接触网精测精修
- 2024-2030年中国抗衰老产品和服务行业市场发展趋势与前景展望战略研究报告
- 输变电工程质量通病防治手册
- 酒店实美学 课件全套 杨卉 第1-13章 酒店美学概述-酒店服务之美
- 2024年秋季新人教版九年级上册化学全册教案
评论
0/150
提交评论