版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
哈工大软件学院《并行程序设计》课程实验报告之二哈工大软件学院《并行程序设计》课程实验报告之二(2)(2)哈工大软件学院《并行程序设计》课程实验报告之二哈工大软件学院《并行程序设计》课程实验报告之二1/121/12《并行程序设计》课程实验报告实验2:基于WindowsThread和OpenMP的多线程编程任课教师实验地点实验课表现张伟哲软件学院五楼机房出勤、表现得分―任课教师实验地点实验课表现张伟哲软件学院五楼机房出勤、表现得分―操作结果得分指导教师
实验时间
实验报告
得分苏统华2015年4月8日实验总分***院系软件学院学号姓名一、实验目的要求:需分析本次实验的基本目的,并综述你是如何实现这些目的的?1、 熟练掌握C++语言;。2、 掌握VisualStudio*.NET*集成开发环境的使用;3、 掌握Windows32ThreadAPI开发多线程程序; 4、 掌握Windows32ThreadAPI中互斥机制的使用方式 1、 掌握OpenMP的基本功能、构成方式、句法;2、 掌握OpenMP体系结构、特点与组成; 3、 掌握采用OpenMP进行多核架构下多线程编程的基本使用方法和调试方法。二、实验内容该部分填写在实验过程中,你都完成了哪些工作。定位到文件夹Win32Threads'HelloThreads\,用MicrosoftVisualstudio打开文件HelloThread.sln,编译并运行程序;对main.cpp中函数进行修改,要求输出线程创建顺序(例如:HelloThread0,HelloThread1,HelloThread2等等); 注意:利用CreateThread()循环变量作为每个线程的执行顺序唯一标识 编译并多次运行程序,记录线程执行顺序,分析线程程序执行顺序是否不可预见及其产生原因定位到文件夹Win32Threads'Pi\,用MicrosoftVisualstudio打开文件Pi.sln,编译并运行程序;对此串行代码使用Windows32ThreadAPI进行线程化,要求4线程实现,且每次迭代计算仅由一个线程完成 使用CRITICAL_SECTION机制和Semaphors机制对多线程共享变量进行互斥操作,避 免数据竞争。1、 关闭病毒扫描和监控程序;2、 采用MicrosoftVisualStudio工具打开实验程序文件:/Helloworlds/Helloworlds.c;3、 编译,运行程序并记录实验结果;4、 在源程序代码中的找到主程序体:printf("HelloWorld\n");for(i=0;i<6;i++)printf("Iter:%d\n",i);;加上#pragmaompparallel{}段5、 采用/Qopenmp重新编译程序(使用Intel编译器,通过Intel命令窗口进入)C:\>icl/QopenmpHelloWorlds.c;6、 设定Openmp线程数:C:\>SetOMP_NUM_THREADS=2;7、 重新运行程序,观测实验结果,并记录。实验二积分方法求PI值的并行处理化算法1、关闭病毒扫描和监控程序;2、 采用MicrosoftVisualStudio工具打开实验程序文件:/pi/pi.sln;3、 编译,运行程序并记录实验结果;4、 在源程序代码中的找到主程序体中进行omp方式优化5、 采用/Qopenmp重新编译程序;三、实验结果记录实验结果。2.1、⑴直接编译运行:哈工大软件学院《并行程序设计》课程实验报告之二哈工大软件学院《并行程序设计》课程实验报告之二打印数值c:\DocuiBntEmi脆ttingdMiiuimt航京皿并谜序段计離個Z■懊殽1lindnHelloThreadHelloThreadHelloThreadHelloThread⑶每次打印10个Hello,会发现明显的乱序执行现象哈工大软件学院《并行程序设计》课程实验报告之二哈工大软件学院《并行程序设计》课程实验报告之二⑸ 使用下面的多线程代码进行计算#include<windows.h>#include<stdio.h>CRITICAL_SECTIONcSection;constintnumThreads=4;staticlongnum_steps=100000;doublestep,pi;doublex,sum=0.0;DWORDWINAPIhelloFunc(LPVOIDpArg){ints=*(int*)pArg;step=1.0/(double)num_steps;for(inti=s;i<s+25000;i++){x=(i+0.5)*step;EnterCriticalSection(&cSection);sum=sum+4.0/(1.0+x*x);LeaveCriticalSection(&cSection);}return0;voidmain(){InitializeCriticalSection(&cSection);HANDLEhThread[numThreads];inttNum[numThreads];for(inti=0;i<numThreads;i++){tNum[i]=i*25000;hThread[i]=CreateThread(NULL,512,helloFunc,void*)&tNum[i],0,NULL);}WaitForMultipleObjects(numThreads,hThread,TRUE,INFINITE);pi=step*sum;printf("Pi=%12.9f\n”,pi);getchar();}得到结果:(6)使用mutex进行互斥DWORDWINAPICountWords(LPV0IDarg){BOOLbDone=FALSE;charinLine[132];while(!bDone){bDone=(GetNextLine(fd,inLine)==EOF);if(!bDone){WaitForSingleObject(hMutex,INFINITE);TotalWords+=GetWordAndLetterCount(inLine)ReleaseMutex(hMutex);}}return0;} 、⑴修改程序如下#pragmaompparallelprintf("HelloWorld\n");for(i=0;i〈6;i++)printf("Iter:%d\n”,i);使用cl直接编译运行使用icl/Qopenmp编译,并设置Set0MP_NUM_THREADS=2,运行结果如下:(2)积分法求PI
直接运行t*<;:\.DQ>cuaciits:iuk.d.£-&.1«r 面*>■并行程序被什寅聲代鶴之二,賓殁W.IIinHelloHelloHelloHelloHelloHelloHelloUireadThreadHelloHelluIklloHello八线程:HelloHelluIklloHello八线程:使用OpenMP优化#pragmaompparallelforprivate(x)reduction(+:sum)for(i=0;i〈num_steps;i++){x=(i+.5)*step;sum=sum+4.0/(1.+x*x);}结果如下:c:VSoewentsa>4 并行程序,计,装代却之二,linAiThreadThreadThreadThpe^d⑶1.直接运行:哈工大软件学院《并行程序设计》课程实验报告之二哈工大软件学院《并行程序设计》课程实验报告之二2.使用OMP优化vslNewStream(&stream,BRNG,(int)clock());#pragmaompparallelforprivate(r)reduction(+:dUnderCurve)for(j=0;j〈iter/BLOCK_SIZE;j++){vdRngUniform(METHOD,stream,BLOCK_SIZE*2,r,0.0,1.0);//Createrandomnumbersintoarrayr#pragmaompparallelforprivate(x,y)reduction(+:dUnderCurve)for(i=0;i〈BLOCK_SIZE;i++){//XCoordinate//XCoordinate//YCoordinate//isdistancefromOriginunderCurveif(x*x+y*y<=1.0){dUnderCurve++;}}HelloHelloHelioHelloHelloHelloHelioHelloTtiFeadUhrDadIhi-DcJidTtiread3.八线程0、-aZVnAdinM ■A&dl.S»t'tl. ■<ST*.*1^*riflB\JfJJibI-I,業,♦♦■^-leHoThra-nd.11inXLaTliwMiri.HeLl_oThi*O"a«lHisLLoThrociiirt四、思考题思考题1:串行程序采用Windows32ThreadAPI进行线程化基本步骤?1、 将需要线程化执行的代码块抽出来,改写成函数。2、 使用CreateThread函数创建线程,并把上一步的得到的函数的函数名作为参数传入CreateThread中。3、 注意线程直接的竞争现象,通过加锁等手段避免线程之间的竞争影响运行结果思考题2:Windows32ThreadAPI几种共享数据互斥机制可以采用,如何应用?Windows32ThreadAPI共享数据互斥机制总共有四种:事件(Event)、临界区(Criticalsection)>互斥量(Mutex)、信号量(Semaphore)。现分别叙述如下: 1、 事件(Event):是WIN32提供的最灵活的线程间同步方式。使用方法:用CreateEvent创建一个事件。对于需要手工设置的事件,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。2、 临界区(Criticalsection):防止多个线程同时执行一个代码段。使用方法:需要设置临界区时,要先定义临界区对象,采用CRITICAL_SECTIONg_cs;使用前需初始化临界区,采用InitializeCriticalSection(&g_cs);函数需要进入临界区时,采用:EnterCriticalSection(&g_cs);函数,从而阻止其他的线程进入。离开临界区时,采用:LeaveCriticalSection(&g_cs);,从而让其他的线程可以进入该临界区。当该临界区不再有使用价值时,需销毁临界区,采用:DeleteCriticalSection(&g_cs);3、 互斥量(Mutex):互斥量通常用于协调多个线程或进程的活动,控制对资源的“锁定”和“取消锁定”,从而控制对共享资源的访问。使用方法:首先,建立互斥体对象,得到句柄使用HANDLECreateMutex()函数;然后,在线程可能产生冲突的区域前调用WaitForSingleObject函数,将句柄传给函数,请求占用互斥对象:dwWaitResult=WaitForSingleObject(hMutex,5000L);共享资源访问结束,释放对互斥体对象的占用:ReleaseMutex(hMutex);最后使用CloseHandle函数删除互斥体对象。4、 信号量(Semaphore):信号对象允许多个有限个数的线程同时访问共享资源。使用方法:当需要信号量时要先调用CreateSemaphore函数创建信号量在需要请求资源时,调用WaitForSingleObject函数或者WaitForMultipleObject函数等待信号量。资源使用完毕后,调用ReleaseSemaphore函数释放信号量思考题3:OpenMP的主要功能,基本构成体有哪些?主要功能:OpenMP提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。提供标准性、可移植性。基本构成体:Op
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 制造业安全环保培训
- 工程建设廉政培训课件
- 手术应激反应的决策干预策略
- 警察自查自纠事项报告
- 慢病预防的健康促进政策体系完善
- 信息系统监督检查制度及巡检记录表格教程文件
- 学校综合办公室综合措施
- 慢性荨麻疹生活质量评估指南
- 慢性肾病社区分级诊疗绩效评估
- 2025云南省交通投资建设集团有限公司下属云南省交通科学研究院有限公司管理人员招聘16人笔试历年参考题库附带答案详解
- 2025榆林市旅游投资集团有限公司招聘(15人)参考笔试题库及答案解析
- 2025福建三明市总工会三明市工人文化宫招聘工作人1人参考题库带答案解析
- 【人卫课件耳鼻喉9版】鼻科学第一章 鼻的应用解剖学及生理学
- 抵押车过户协议书
- 葡萄种植课件
- 浅析我国政府雇员制的利弊及发展对策研究
- 2025年全国高校辅导员国赛大赛基础知识测试题(附答案)(三套)
- 粉丝群体特征分析-洞察与解读
- 2025年亚氨基二乙酸行业分析报告及未来发展趋势预测
- 2025年江苏省普通高中高二上学期学业水平合格性考试调研历史试题(解析版)
- 学堂在线 雨课堂 学堂云 批判性思维-方法和实践 章节测试答案
评论
0/150
提交评论