哈工大软件学院《并行程序设计》课程实验报告之二.doc_第1页
哈工大软件学院《并行程序设计》课程实验报告之二.doc_第2页
哈工大软件学院《并行程序设计》课程实验报告之二.doc_第3页
哈工大软件学院《并行程序设计》课程实验报告之二.doc_第4页
哈工大软件学院《并行程序设计》课程实验报告之二.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

并行程序设计课程实验报告实验2:基于Windows Thread和OpenMP的多线程编程姓名*院系软件学院学号*任课教师张伟哲指导教师苏统华实验地点软件学院五楼机房实验时间2015年4月8日实验课表现出勤、表现得分实验报告得分实验总分操作结果得分一、实验目的要求:需分析本次实验的基本目的,并综述你是如何实现这些目的的? 一、1熟练掌握C+语言;。2、掌握Visual Studio* .NET*集成开发环境的使用;3、掌握Windows32 Thread API开发多线程程序;4、掌握Windows32 Thread API中互斥机制的使用方式二、1掌握OpenMP的基本功能、构成方式、句法; 2、掌握OpenMP体系结构、特点与组成;3、掌握采用OpenMP进行多核架构下多线程编程的基本使用方法和调试方法。二、实验内容该部分填写在实验过程中,你都完成了哪些工作。一、1. 定位到文件夹Win32 Threads HelloThreads,用Microsoft Visual studio打开文件HelloThread.sln,编译并运行程序;2. 对main.cpp中函数进行修改,要求输出线程创建顺序(例如:Hello Thread 0, Hello Thread 1, Hello Thread 2 等等);注意:利用CreateThread()循环变量作为每个线程的执行顺序唯一标识3. 编译并多次运行程序,记录线程执行顺序,分析线程程序执行顺序是否不可预见及其产生原因4. 定位到文件夹Win32 Threads Pi,用Microsoft Visual studio打开文件Pi.sln,编译并运行程序;5. 对此串行代码使用Windows32 Thread API进行线程化,要求4线程实现,且每次迭代计算仅由一个线程完成6. 使用CRITICAL_SECTION机制和Semaphors机制对多线程共享变量进行互斥操作,避免数据竞争。二、1、关闭病毒扫描和监控程序;2、采用Microsoft Visual Studio工具打开实验程序文件:/Helloworlds/Helloworlds.c;3、编译,运行程序并记录实验结果;4、在源程序代码中的找到主程序体:printf(Hello Worldn);for(i=0;iicl /Qopenmp HelloWorlds.c;6、设定Openmp线程数:C:Set OMP_NUM_THREADS=2;7、重新运行程序,观测实验结果,并记录。实验二 积分方法求PI值的并行处理化算法 1、关闭病毒扫描和监控程序;2、采用Microsoft Visual Studio工具打开实验程序文件:/pi/pi.sln;3、编译,运行程序并记录实验结果;4、在源程序代码中的找到主程序体中进行omp方式优化5、采用/Qopenmp重新编译程序;三、实验结果记录实验结果。2.1一、(1)直接编译运行:(2)打印数值(3)每次打印10个 Hello ,会发现明显的乱序执行现象(4)运行程序(5)使用下面的多线程代码进行计算#include #include CRITICAL_SECTION cSection;const int numThreads = 4;static long num_steps=100000; double step, pi;double x, sum = 0.0;DWORD WINAPI helloFunc(LPVOID pArg) int s = *(int *)pArg;step = 1.0/(double) num_steps;for (int i=s; i s + 25000; i+)x = (i+0.5)*step;EnterCriticalSection(&cSection);sum = sum + 4.0/(1.0 + x*x);LeaveCriticalSection(&cSection);return 0;void main() InitializeCriticalSection(&cSection);HANDLE hThreadnumThreads;int tNumnumThreads; for (int i = 0; i numThreads; i+) tNumi = i * 25000; hThreadi = CreateThread(NULL, 512, helloFunc, (void *)&tNumi, 0, NULL);WaitForMultipleObjects(numThreads, hThread, TRUE, INFINITE); pi = step * sum; printf(Pi = %12.9fn,pi); getchar();得到结果:(6)使用 mutex 进行互斥DWORD WINAPI CountWords(LPVOID arg) BOOL bDone = FALSE ; char inLine132;while (!bDone) bDone = (GetNextLine(fd, inLine) = EOF); if (!bDone) WaitForSingleObject(hMutex, INFINITE); TotalWords += GetWordAndLetterCount(inLine) ; ReleaseMutex(hMutex); return 0;二、(1)修改程序如下#pragma omp parallelprintf(Hello Worldn);for(i=0;i6;i+)printf(Iter:%dn,i);使用 cl直接编译运行使用 icl /Qopenmp 编译,并设置Set OMP_NUM_THREADS=2,运行结果如下:(2)积分法求 PI直接运行使用 OpenMP 优化#pragma omp parallel for private(x) reduction(+: sum)for (i=0; inum_steps; i+)x = (i + .5)*step;sum = sum + 4.0/(1.+ x*x);结果如下:八线程:(3)1.直接运行:2.使用 OMP 优化vslNewStream( &stream, BRNG, (int)clock() ); #pragma omp parallel for private(r) reduction(+: dUnderCurve) for(j=0;jiter/BLOCK_SIZE;j+) vdRngUniform( METHOD, stream, BLOCK_SIZE*2, r, 0.0, 1.0 ); /Create random numbers into array r #pragma omp parallel for private(x,y) reduction(+:dUnderCurve) for (i=0;iBLOCK_SIZE;i+) x=ri; /X Coordinate y=ri+BLOCK_SIZE; /Y Coordinate if (x*x + y*y = 1.0) /is distance from Origin under Curve dUnderCurve+; 3. 八线程四、思考题思考题1:串行程序采用Windows32 Thread API进行线程化基本步骤?1、将需要线程化执行的代码块抽出来,改写成函数。2、使用CreateThread函数创建线程,并把上一步的得到的函数的函数名作为参数传入CreateThread中。3、注意线程直接的竞争现象,通过加锁等手段避免线程之间的竞争影响运行结果思考题2:Windows32 Thread API几种共享数据互斥机制可以采用,如何应用?Windows32 Thread API共享数据互斥机制总共有四种:事件(Event)、临界区(Critical section)、互斥量(Mutex)、信号量(Semaphore)。现分别叙述如下:1、 事件(Event):是WIN32提供的最灵活的线程间同步方式。使用方法:用CreateEvent创建一个事件。对于需要手工设置的事件,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。2、临界区(Critical section):防止多个线程同时执行一个代码段。使用方法:1) 需要设置临界区时,要先定义临界区对象,采用CRITICAL_SECTION g_cs; 2) 使用前需初始化临界区,采用InitializeCriticalSection(&g_cs);函数3) 需要进入临界区时,采用:EnterCriticalSection(&g_cs);函数,从而阻止其他的线程进入。4) 离开临界区时,采用:LeaveCriticalSection(&g_cs);,从而让其他的线程可以进入该临界区。5) 当该临界区不再有使用价值时,需销毁临界区,采用:DeleteCriticalSection(&g_cs);3、互斥量(Mutex):互斥量通常用于协调多个线程或进程的活动,控制对资源的“锁定”和“取消锁定”,从而控制对共享资源的访问。使用方法:1) 首先,建立互斥体对象,得到句柄使用HANDLE CreateMutex()函数;2) 然后,在线程可能产生冲突的区域前调用WaitForSingleObject函数,将句柄传给函数,请求占用互斥对象:dwWaitResult = WaitForSingleObject(hMutex,5000L); 3) 共享资源访问结束,释放对互斥体对象的占用:ReleaseMutex(hMutex); 4) 最后使用CloseHandle函数删除互斥体对象。4、信号量(Semaphore):信号对象允许多个有限个数的线程同时访问共享资源。 使用方法:1) 当需要信号量时要先调用CreateSemaphore函数创建信号量2) 在需要请求资源时,调用WaitForSingleObject函数或者WaitForMultipleObject函数等待信号量。3) 资源使用完毕后,调用ReleaseSemaphore函数释放信号量思考题3:OpenMP的主要功能,基本构成体有哪些?主要功能:OpenMP提供了对并行算法的高层的抽象描述,程序员通过在源代码中加入专用的pragma来指明自己的意图,由此编译器可以自动将程序进行并行化,并在必要之处加入同步互斥以及通信。提供标准性、可移植性。基本构成体:OpenMp由三大部分

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论