燕山大学多核程序设计实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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));//用时间作随机数种子

相关文档
最新文档