燕山大学多核程序设计实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一Windows多线程编程
一、实验目的与要求
了解windows多线程编程机制
掌握线程同步的方法
二、实验环境和软件
WindowsXP
VC6.0
三、实验内容
创建线程:
HANDLECreateThread(
LPSECURITY_ATTRIBUTESlpThreadAttributes, SIZE_TdwStackSize,
LPTHREAD_START_ROUTINElpStartAddress, LPVOIDlpParameter, DWORDdwCreationFlags, LPDWORDlpThreadId
);
四、实验程序
#include"stdafx.h"
#include
#include
#include
#include
usingnamespacestd;
voidThreadFrunc1(PVOIDparam)
{
while(1)
{
Sleep(1000);
cout<<"ThisisThreadFrunc1"< } } voidThreadFrunc2(PVOIDparam) { while(1) { Sleep(1000); cout<<"ThisiskjjThreadFrunc2"< } intmain() { inti=0; _beginthread(ThreadFrunc1,0,NULL); _beginthread(ThreadFrunc2,0,NULL); Sleep(3000); cout<<"end"< return0; } 实验结果 实验二蒙特卡罗法求PI 一、实验目的和要求 蒙特卡洛算法可理解为通过大量实验,模拟实际行为,来收集统计数据。本例中,算法随机产生一系列点,模拟这些点落在如下图所示的正方形区域内的情况。其几何解释如下 1 轴 Y X轴 1 图1 如图1所示,正方形边长为1,左下顶点与原点重合,两边分别与x,y轴重合。曲线为1/4圆弧,圆心位于原点,与正方形左下定点重合,半径为 1。正方形面积S1=1,圆弧内面积S2= 121 r。算法模拟大量44 点随机落在此正方形区域内,落在圆弧内的点的数量(n2)与点的总数(n1)的比例与面积成正比关系。即 n 1 n 2 S 1 S 2 4 (1) 由此可得 4n 2 (2) n 1 因此,只要计算出落在圆弧内的点的数量在点总数中所占的比例,就能求出的值。 由图1可知,所有点均落在正方形范围内,因此点的x坐标满足0x1。 2y2又,当点落在 圆弧范围内,则点的二维坐标关系满足x1。 3 二、实验环境和软件 编译器:MicrosoftVisualStudioC++6.0 操作系统:WindowsXP 三、实验内容 3.1串行算法 本项目中使用了标准C语言库中的产生随机数函数。该函数原型为:intrand(void); 此函数产生随机数列,每次调用时均返回0到RAND_MA之X间的一个整数。voidsrand(unsignedintseed); 此函数为rand()函数所生成的伪随机数序列设置起始点,使之产生不同的伪随机数。 算法: 产生2n个随机数据,范围[0,1],对每个数据点计算其坐标是否满足2y2 x1,统计满足此关系的点的数量count,则 count 4n 3.2并行算法描述 算法步骤: 1、确定需要产生的点的个数n,参与运行的处理器数m; 2、对每一个处理器,生成两个随机数x,y,范围[0,1]; 2y2 3、判断两个随机数x,y是否满足x1; 4、若满足,则变量COUNTi++; 5、重复步骤2-4,直至每个处理器均生成n/m个随机点; 6、收集COUNTi的值,并累加至变量COUNT中,此即为随机点落在圆弧内的数量; 7、通过(2)式计算的值。 4 #include #include #include //#include #include #include #include usingnamespacestd; HANDLEevFinish; longcs=0;//总循环次数 longcount=0;//主线程有效次数 longcount_thread=0;//thread线程有效次数 time_tstart,finish;//定义开始结束时间 //thread线程计算量为总数的一半DWORDWINAPIthread(LPVOIDparam) {inti=0; doublex,y; for(i=0;i { x=(longdouble)rand()/(longdouble)RAND_MAX; y=(longdouble)rand()/(longdouble)RAND_MAX; if((x*x+y*y)<=1) count_thread++; //printf("副%d",i); } SetEvent(evFinish); return0; } //主线程计算量为总数的一半 intmain(void) { evFinish=CreateEvent(NULL,FALSE,FALSE,NULL); printf("请输入总循环次数:"); scanf("%d",&cs); cs*=1000000; srand((unsigned)time(NULL));//用时间作随机数种子