版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《多核程序设计》实验指导书之二实验2.1Windows32ThreadAPI线程程序设计实验目的1.掌握Windows32ThreadAPI特点和基本使用方法;2.掌握如何采用Windows32ThreadAPI将串行程序转换成多线程程序;3.掌握Windows32ThreadAPI中互斥机制的使用方式;实验要求1.熟练掌握C++语言;2、掌握VisualStudio*.NET*集成开发环境的使用;3、掌握Windows32ThreadAPI开发多线程程序;4、掌握Windows32ThreadAPI中互斥机制的使用方式实验内容1.新建一个Win32控制台应用程序,附加选项选择空项目,添加一个源文件,将2-1文件夹里HelloThreads下的main.cpp的内容拷贝到源文件中;2.对main.cpp中函数进行修改,要求输出线程创建顺序(例如:HelloThread0,HelloThread1,HelloThread2等等);注意:利用CreateThread()循环变量作为每个线程的执行顺序唯一标识3.编译并多次运行程序,记录线程执行顺序,分析线程程序执行顺序是否不可预见及其产生原因4.将2-1文件夹里Pi.cpp的代码拷贝到一个项目中,编译并运行程序;5.对此串行代码使用Windows32ThreadAPI进行线程化,要求4线程实现,且每次迭代计算仅由一个线程完成;6.使用CRITICAL_SECTION机制和Semaphors机制对多线程共享变量进行互斥操作,避免数据竞争。本实验我们要学习windows多线程编程的基本知识,如线程创建、线程等待等,同时要掌握如何使用win32的线程同步机制来实现线程的同步。创建线程:HANDLECreateThread{LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize, LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORD dwCreationFlags, LPDWORDlpThreadId};参数lpThreadAttrubutes 描述施行于这一新线程的security属性,NULL表示使用缺省值dwStackSize 新线程初始的保留堆栈的大小,0表示使用缺省大小:1MBlpStartAddress 新线程将开始的起始地址,这是一个函数指针lpParameter 此值将被传送到上述所指定之新线程函数去,作为参数dwCreationFlags 产生一个暂时挂起的线程,为0表示“立即开始执行”lpThreadId 新线程的ID会被传回到这里线程等待:DWORDWaitForMultipleObject(DWORDnCount,CONSTHANDLE*lpHandle,BOOLbWaitAll,DWORDdwMilliseconds);该函数可以用来同时监测多个对象参数nCount 表示lpHandle所指之handles数组的元素个数lpHandle 指向一个由对象handles所组成的数组,这些handles不需要为相同的类型bWaitAll bWaitAll为true时,表示所有的handles都必须激发函数才返回,否则此函数将在任何一个handle激发时就返回dwMilliseconds 表示一个时间长度,当该时间长度达到时,即使没有任何handles激发,此函数也会返回。可设置为0或INFINITEWin32线程同步实现全局变量事件:当程序中一个线程的运行需要等待另外一个线程中一项特定操作的完成才能继续执行时,就可以使用事件对象来通知等待线程某个条件已满足;临界区:临界区是一种防止多个线程同时执行一个特定代码段的机制如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程奖被挂起,并一直持续到进入临界区的线程离开临界区使用于多个线程操作之间没有先后顺序但要求互斥的同步。在进程使用之前调用如下函数对对象进行初始化:VOIDInitializeCriticalSection(LPCRITICAL_SECTION);当一个线程使用临界区时,调用函数EnterCriticalSection或者TryEnterCriticalSection;当要求占用、退出临界区时,调用函数LeaveCriticalSection,释放对临界区对象的占用,供其他线程使用。互斥量:互斥量通常用于协调多个线程或进程的活动,通过“锁定”和“取消锁定”资源,控制对共享资源的访问。当一个互斥量被一个线程锁定了,其他试图对其加锁的线程就会被阻塞。当对互斥量加锁的线程解除了锁定后,则被阻塞的线程中的一个就会得到互斥量信号量:信号量是一个核心对象,拥有一个计数器,可用来管理大量有限的系统资源。当计数器值大于0时,信号量为有信号状态;当计数值为0时,信号量处于无信号状态。可按下列步骤使用信号量对象:创建信号量对象HANDLE
CreateSemaphore(
LPSECURITY_ATTRIBUTES
IpSemaphoreAttributes,
LONG
IInitialCount,
LONG
IMaximumCount,
LPCTSTR
IpName);参数IpSemaphoreAttributes 表示安全控制,一般直接传入NULL;IInitialCount 表示初始化的信号量;IMaximumCount 表示允许信号量增加到的最大值;IpName 表示信号量的名称;打开一个信号量对象HANDLE
OpenSemaphore(
DWORD
dwDesiredAccess,
BOOL
bInheritHandle,
LPCTSTR
lpName);参数dwDesiredAccess 表示访问权限,一般传入SEMAPHORE_ALL_ACCESSbInheritHandle 表示信号量句柄继承性,一般传入TRUEIpName 表示名称,不同进程中的各线程可以通过名称来确保它们访问同一个信号量在线程访问共享资源之前调用(-操作)DWORDWaitForSingleObject(HANDLEhHandle,DWORDdwMilliseconds);参数hHandle 表示一个能够支持被通知/未通知的信号量对象dwMilliseconds 表示为了等待该信号量对象变为已通知状态,它将等待多长时间共享资源访问完成后,应释放对信号量对象的占用(+操作)BOOLReleaseSemaphore(HANDLEhSemaphore,LONGIReleaseCount,LPLONGIpPreviousCount);参数hSemaphore 表示所要操作的信号量对象的句柄IReleaseCount 表示这个信号量对象在当前基础上所要增加的值IpPreviousCount 指向返回信号量上次值的变量的指针,如果不需要信号量上次的值,那么这个参数可以设置为NULL;5.信号量使用完后,应将其关闭BOOLCloseHandle(HANDLEhObject);参数hObject 表示一个已打开信号量对象的handle实验一、生成和运行一个多线程程序新建项目项目配置:使用HelloThreads文件夹下的main.c多线程程序,实现四个线程分别向屏幕输出“hellothread”,如果想屏幕上输出每个线程的编号,则我们必须给线程函数传一个线程编号参数,请实现这个改变。(提示:传递指针时要先强转成void类型的指针;在这里传递的参数不能直接使用i,想一想,为什么?)实验二、利用中值积分定理计算Pi值串行算法:要多线程实现的话,主要是把for循环的计算过程分到几个线程中去,由于每次计算都要更新sum的值,就有可能发生一个线程已经更新了sum的值,而另一个线程读到的还是旧的sum值,所以在这里使用临界区,把sum放到临界区中,这样一次只能有一个线程访问和修改sum的值。实验三、互斥量的使用先运行一遍2-1文件夹下countWords里的Serial.cpp串行程序,记录实验结果。再使用Threaded_sub.cpp,这是使用信号量完成同样功能的程序,注意,Threaded_sub.cpp中删除了有关信号量操作的代码,请自行补充完整后运行,将运行结果与串行程序相对比,保证运行结果一致。要注意下面2点:1.将InFile1.txt放到相应目录下2.为了fopen能正常运行,在VS的预处理器定义中添加_CRT_SECURE_NO_WARNINGS实验2.2Windows系统下利用OpenMP进行多线程编程实验目的1.掌握OpenMP的基本功能、构成方式、句法;2、掌握OpenMP体系结构、特点与组成;3、掌握采用OpenMP进行多核架构下多线程编程的基本使用方法和调试方法。实验要求1.熟练掌握C++语言;2、掌握VisualStudio*.NET*集成开发环境的使用;3、性能优化及多核技术的基本概念;4、OpenMP并行程序设计基础。实验原理OpenMP应用编程接口API是在共享存储体系结构上的一个编程模型,其包含:编译制导(CompilerDirective)、运行库例程(RuntimeLibrary)和环境变量(EnvironmentVariables)三大部分,并支持增量并行化(IncrementalParallelization),用于实现并行性运算的优化解决方法。实验内容实验一Helloworld程序1、关闭病毒扫描和监控程序;2、将2-2文件夹中hello里的Helloworlds.cpp中的代码拷贝到MicrosoftVisualStudio项目中:3、设定Openmp线程数:C:\>SetOMP_NUM_THREADS=14、编译,运行程序并记录实验结果;5、在源程序代码中找到主程序体: printf("HelloWorld\n"); for(i=0;i<6;i++) printf("Iter:%d\n",i);;加上#pragmaompparallel{}段6、采用/Qopenmp重新编译程序(使用Intel编译器,通过Intel命令窗口进入)C:\>icl/Qopenmp源文件;7、在命令行中设定Openmp线程数:C:\>SetOMP_NUM_THREADS=28、在命令行中重新运行程序,观测实验结果,并记录。实验二积分方法求PI值的并行处理化算法1、关闭病毒扫描和监控程序;2、将2-2文件夹中pi.cpp代码拷贝到MicrosoftVisualStudio项目中3、编译,运行程序并记录实验结果;4、在源程序代码中的找到主程序体中进行omp方式优化①需要并行运算的程序体:加上#pragmaompparallel{}段parallel语句后面被大括号括起来的代码是并行执行的。②找到for循环体引入omp并行处理方法加上#pragmaompforfor(xxx:yyy:zzz){}段#pragmaompfor语句是一个工作分担结构,它使得循环由一个线程池的线程并行执行。③检查所有变量,将需要进行特别声明的变量进行omp处理:#pragmaompparallelprivate(varname,vaname)reduction(+:varname)shared(varname){}段reduction子句为变量指定一个操作符,每个线程都会创建reduction变量的私有拷贝,在OpenMP区域结束处,将使用各个线程的私有拷贝的值通过制定的操作符进行迭代运算,并赋值给原来的变量。④对于特殊的共享变量,可以进行加锁处理#pragmaompcritical{}段(本实验中不用)5、采用/Qopenmp重新编译程序(使用Intel编译器,通过Intel命令窗口进入)如果本来是VS编译器,切换为Intel编译器6、在命令行中设定Openmp线程数:C:\>SetOMP_NUM_THREADS=?7、在命令行中重新运行程序,观测实验结果,并记录。实验三PI值蒙特卡洛算法的改进与编程1、关闭病毒扫描和监控程序;2、将2-2文件夹下MonteCarloPi里pimonte_VSL_serial.cpp的代码拷贝到一个MicrosoftVisualStudio项目中;3、编译,运行程序并记录实验结果;在这里,我们使用蒙特卡罗法计算pi的值,要使用MKL的随机数生成器,所以要在VisualStudio中导入MKL的include和library文件,选择:项目属性配置属性VC++目录,如下图所示设置相关参数:a.Lib中添加:C:\ProgramFiles\Intel\ComposerXE2015\mkl\lib\ia32b.Include中添加C:\ProgramFiles\Intel\ComposerXE2015\mkl\include注意:添加lib时要注意区分,32位、64位的目录是不同的。c.项目属性配置属性IntelPerformanceLibrarys,在useIntelMKL后面的下拉框选择sequential4、在源程序代码的主程序体中进行omp方式优化①需要并行运算的程序体:加上#pragmaompparallel{}段②找到for循环体引入omp并行处理方法加上#pragmaompforfor(xxx:yyy:zzz){}段③检查所有变量,将需要进行特别声明的变量进行omp处理:#pragmaompparallelprivate(varname,vaname)\reduction(+:varname,varname)\shared(varnam
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度参股协议书:网络安全技术研发参股协议范文
- 2025年度房产抵押贷款保险理赔合同范本2篇
- 2025年度城市排水工程中介代理合同
- 榆林学院《现代通信原理》2023-2024学年第一学期期末试卷
- 永州职业技术学院《需求工程》2023-2024学年第一学期期末试卷
- 永州职业技术学院《社会福利和美好生活》2023-2024学年第一学期期末试卷
- 永州师范高等专科学校《药物分析与化学》2023-2024学年第一学期期末试卷
- 2024年土地承包经营权转租合同3篇
- 鹰潭职业技术学院《伦理学》2023-2024学年第一学期期末试卷
- 益阳医学高等专科学校《导游基础及业务》2023-2024学年第一学期期末试卷
- VDA270气味性测试参考标准中文
- 丹麦门萨权威IQ测试(附参考答案)
- 电气试验110kV交接试验细则
- 外立面装修改造工程施工方案(79页)
- 2737市场调查与商情预测-国家开放大学2018年1月至2021年7月期末考试真题及答案(201801-202107不少于6套)
- 汽车吊接地比压计算
- 跨国公司财务管理课后习题答案
- 人教版(2019)高一物理必修第三册 13.5能量量子化 课件(共18张PPT)
- 沟槽管件尺寸对照表
- 美术教案雄伟的塔教学反思
- (完整版)复变函数与积分变换公式
评论
0/150
提交评论