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

上传人:b****8 文档编号:10235824 上传时间:2023-02-09 格式:DOCX 页数:10 大小:62.82KB
下载 相关 举报
燕山大学多核程序设计实验报告.docx_第1页
第1页 / 共10页
燕山大学多核程序设计实验报告.docx_第2页
第2页 / 共10页
燕山大学多核程序设计实验报告.docx_第3页
第3页 / 共10页
燕山大学多核程序设计实验报告.docx_第4页
第4页 / 共10页
燕山大学多核程序设计实验报告.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

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

《燕山大学多核程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《燕山大学多核程序设计实验报告.docx(10页珍藏版)》请在冰豆网上搜索。

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

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

实验一Windows多线程编程

一、实验目的与要求

了解windows多线程编程机制

掌握线程同步的方法

二、实验环境和软件

WindowsXP

VC

三、实验内容

创建线程:

HANDLECreateThread(

LPSECURITY_ATTRIBUTESlpThreadAttributes,

SIZE_TdwStackSize,

LPTHREAD_START_ROUTINElpStartAddress,

LPVOIDlpParameter,

DWORDdwCreationFlags,

LPDWORDlpThreadId

);

四、实验程序

#include""

#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、实验目的和要求

蒙特卡洛算法可理解为通过大量实验,模拟实际行为,来收集统计数据。

本例中,算法随机产生一系列点,模拟这些点落在如下图所示的正方形区域内的情况。

其几何解释如下

图1

如图1所示,正方形边长为1,左下顶点与原点重合,两边分别与x,y轴重合。

曲线为1/4圆弧,圆心位于原点,与正方形左下定点重合,半径为1。

正方形面积S1=1,圆弧内面积S2=

算法模拟大量点随机落在此正方形区域内,落在圆弧内的点的数量(n2)与点的总数(n1)的比例与面积成正比关系。

(1)

由此可得

(2)

因此,只要计算出落在圆弧内的点的数量在点总数中所占的比例,就能求出

的值。

由图1可知,所有点均落在正方形范围内,因此点的x坐标满足

又,当点落在圆弧范围内,则点的二维坐标关系满足

检验每一个点是否满足此关系即可判定改点是否落在圆弧内。

2、实验环境和软件

编译器:

MicrosoftVisualStudioC++

操作系统:

WindowsXP

三、实验内容

串行算法

本项目中使用了标准C语言库中的产生随机数函数。

该函数原型为:

intrand(void);

此函数产生随机数列,每次调用时均返回0到RAND_MAX之间的一个整数。

voidsrand(unsignedintseed);

此函数为rand()函数所生成的伪随机数序列设置起始点,使之产生不同的伪随机数。

算法:

产生2n个随机数据,范围[0,1],对每个数据点计算其坐标是否满足

,统计满足此关系的点的数量count,则

并行算法描述

算法步骤:

1、确定需要产生的点的个数n,参与运行的处理器数m;

2、对每一个处理器,生成两个随机数x,y,范围[0,1];

3、判断两个随机数x,y是否满足

4、若满足,则变量COUNTi++;

5、重复步骤2-4,直至每个处理器均生成n/m个随机点;

6、收集COUNTi的值,并累加至变量COUNT中,此即为随机点落在圆弧内的数量;

7、通过

(2)式计算

的值。

并行算法在Windows下的一个例子

#include<>

#include<>

#include<>

未排序的数据集合理划分到每个线程后,最后怎么汇合,形成完整的排好序的数据集呢

2.怎么保证可并行执行的线程的数目和核的数目相等或稍微多于核的数目,同时也保证这些线程之间的工作量也尽可能的相同呢

在这个实验中,串行的算法采用标准C语言库中的快速排序函数。

并行算法中,先将要处理的数据集均等的分到每个线程中,并使用C语言库中的快速排序函数各自排序。

然后所有线程开始根据相同的数对自己的数据集进行划分,这个数是依据一定的方法选出来的(详见并行算法描述)。

每个线程的数据集都会被分成K份,(其中P<=K

很显然这个过程选出了K个数,这些数将被成为bound_value,记为X1,X2,X3……XK。

最后每个线程中小于或等于X1的数会被一个独立的线程去归并排序,同样小于或等于X2的数也会被另外一个独立的线程去归并排序,依次类推,直到排好序。

需要指出的是:

这个并行版本最消耗时间的部分是一开始每个线程各自的排序,时间为:

O(

);不过其数据划分和线程生成也相对简单。

最后的归并排序所需时间是线性增长的,即:

O(

),因此即使在最后归并部分线程执行的任务已经是不均衡的,也不会对整个程序的性能产生很大的影响。

1、实验环境和软件

编译器:

MicrosoftVisualStudioC++

操作系统:

WindowsXP

2、实验内容

并行算法描述

算法:

将原始待排序的数据分成P等份,每个处理器上对N0个数据进行排序,称每个被排序后的子集为B0,…,Bp-1

Remain_data=N,设定第0组归并起始位置全部为0,i=0,设置第0组在目标数组中的起始位置为0

循环直至remian_data

选取所有子集中起始位置后续L个元素的最小值bound_value,并获得bound_value的桶号bucket

在所有子集中从起始位置到后续L个元素中选取边界位置,使得边界位置的最后一个元素小于或等于bound_value,而边界位置后的第一元素大于bound_value。

记录所有的边界位置,并设置所有第i+1组的起始位置为第i组的起始位置加上边界位置

累积所有边界值,得到该归并组的大小

根据归并组大小和本组起始位置计算第i+1组在目标数组中的起始位置。

4、设置最后一个归并组的边界为N0

5、对所有归并组进行并行P路归并排序。

3、实验步骤

说明:

A.P和多核处理器的数目相同。

比如是双核的,那么P=2;

B.Remain_data是每个线程处理的数据集中还没有被X1,X2,X3……划分过的数据集的总数目。

比如,根

据X1每个线程划分出来的数据集为x,y,z……,那么Remain_data=n–x–y–z…..

并行算法在Windows下的一个例子

#include<>

#include<>

#include<>

#include<>

#include<>

#include<>

#ifndef_BASIC_SORT_H

#define_BASIC_SORT_H

#ifndef_SORT_P

#define_SORT_P

void*sort(void*parameter);

voidgenerate_data(int*a,intn);

voidsort_s(int*a,intn);

voidview_data(int*a,intn);

intcheck_data_sort(int*a,intn);

intcompare(constvoid*arg1,constvoid*arg2);

#defineMILLION1000000L

#defineP2

#defineN04332539

NN0.

.

voidinite()

{inti;

[j]=d[j];

[%d]=%d\n",i,j,forsorta[i].d[j]);

}*/

}

}

voidmain(){

intdata;

inti;

generate_data(a,N);..\n");

egin[i]=0;

m_list[0].count[i]=0;

}

m_list[0].merge_size=0;lobal_pos=0;=i;

forsorta[i].d=d[i];

structforsort*forsortb=&forsorta[i];

pthread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)sort,forsortb,0,&(thr_id[i]));

}erge_size;

m_list[merge_block].merged=0;

merge_block++;

if(merge_block>=P*P){=i;

tmp2[i].d=d;

tmp2[i].mp=&(m_list[i]);

tmp2[i].b=&(b[m_list[i].global_pos]);

egin[i]=mp->begin[i]+mp->count[i];

mp[1].global_pos=mp->global_pos+mp->merge_size;

}

}

erge_size);

for(j=0;j

intk;

for(k=0;k

printf("%d\t",d[j][mp[i].begin[j]+k]);

}

}

printf("\n");

}

printf("\n");

}

/////////////////////////////////////////////////////////////////////////////////

四、实验结果

测试数据集合:

由随机数函数产生的数据集合总共有4332539个数

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1