并行计算与多核多线程技术
课程报告
专业
软件工程
班级
计 133-2
学号
XXXXXXXXX
姓名
XX
成绩 ____________________
2015 年 11 月 19 日
课程报告要求
手写内容:设计目的、意义,设计分析,方案分析,功能
模块实现,最终结果分析,设计体会等。
允许打印内容:设计原理图等图形、图片,电路图,源程
序。硬件类的设计,要有最终设计的照片图;软件类设计,要
有各个功能模块实现的界面图、输入输出界面图等。
评
价
理论基础
实践效果(正确度/加速比)
难度
工作量
独立性
班级____________ 学号_________________ 姓名______________ 算法名称______________
目
录
1. 设计目的、意义(功能描述)..................................................................................... 5
2. 方案分析(解决方案)................................................................................................. 5
3. 设计分析......................................................................................................................... 5
3.1 串行算法设计........................................................................................................ 5
3.2 并行算法设计........................................................................................................ 5
3.3 理论加速比分析.................................................................................................... 5
4. 功能模块实现与最终结果分析..................................................................................... 6
4.1 基于 OpenMP 的并行算法实现...........................................................................6
4.1.1 主要功能模块与实现方法.......................................................................... 6
4.1.2 实验加速比分析.......................................................................................... 6
4.2 基于 MPI 的并行算法实现.................................................................................. 7
4.2.1 主要功能模块与实现方法.......................................................................... 7
4.2.2 实验加速比分析.......................................................................................... 7
4.3 基于 Java 的并行算法实现.................................................................................. 8
4.3.1 主要功能模块与实现方法.......................................................................... 8
4.3.2 实验加速比分析.......................................................................................... 8
4.4 基于 Windows API 的并行算法实现...................................................................8
4.4.1 主要功能模块与实现方法.......................................................................... 8
4.4.2 实验加速比分析.......................................................................................... 8
4.5 基于.net 的并行算法实现 .....................................................................................9
4.5.1 主要功能模块与实现方法.......................................................................... 9
4.5.2 实验加速比分析.......................................................................................... 9
4.6 并行计算技术在实际系统中的应用.................................................................. 10
4.8.1 主要功能模块与实现方法........................................................................ 10
4.8.2 实验加速比分析........................................................................................ 10
5. 设计体会....................................................................................................................... 10
6. 附录............................................................................................................................... 10
6.1 基于 MPI 的并行程序设计................................................................................ 10
6.1.1 代码及注释................................................................................................ 10
6.1.2 执行结果截图............................................................................................ 10
6.1.3 遇到的问题及解决方案............................................................................ 12
6.2 基于 MPI 的并行程序设计................................................................................ 12
班级____________ 学号_________________ 姓名______________ 算法名称______________
6.1.1 代码及注释................................................................................................ 13
6.2.2 执行结果截图............................................................................................ 13
6.2.3 遇到的问题及解决方案............................................................................ 15
6.3 基于 Java 的并行程序设计................................................................................ 15
6.3.1 代码及注释................................................................................................ 15
6.3.2 执行结果截图............................................................................................ 15
6.3.3 遇到的问题及解决方案............................................................................ 17
6.4 基于 Windows API 的并行程序设计.................................................................17
6.4.1 代码及注释................................................................................................ 18
6.4.2 执行结果截图............................................................................................ 18
6.4.3 遇到的问题及解决方案............................................................................ 21
6.5 基于.net 的并行程序设计 ...................................................................................21
6.5.1 代码及注释................................................................................................ 22
6.5.2 执行结果截图............................................................................................ 22
6.5.3 遇到的问题及解决方案............................................................................ 25
6.6 并行计算技术在实际应用系统的应用............................................................... 25
6.6.1 代码及注释................................................................................................ 25
6.6.2 执行结果截图............................................................................................ 25
6.6.3 遇到的问题及解决方案............................................................................ 45
班级____________ 学号_________________ 姓名______________ 算法名称______________
1. 设计目的、意义(功能描述)
蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是二十世纪四十年代中期由于
科学技术的发展和电子计算机的发明,而被提出的一种以概率统计理论为指导的一类非常重
要的数值计算方法。本次大作业主要是对蒙特·卡罗方法进行并行处理,通过 OpenMP、
MPI、.NET、Java、Win32API 等一系列并行技术和并行机制对该算法进行并行处理,从而
也进一步熟悉了蒙特·卡罗方法的串行算法和并行算法,实现了用蒙特·卡罗方法计算出半径
为1 单位的球体的体积,体会到了并行技术在实际生活中的应用。
2. 方案分析(解决方案)
蒙特·卡罗方法(Monte Carlo method)是指使用随机数(或更常见的伪随机数)来解决
很多计算问题的方法。球的体积可以估算为:位于点模型内随机点个数与全体随机点个数
的比值乘以包围盒的体积算的。
3. 设计分析
3.1 串行算法设计
假定球体用 B 表示,半径 r=1 单位,B1 是包含 B 的参考立方体(在本例中是边长为 2 的正
方体),在 B1 中产生 N 个均匀分布的伪随机点。对每个随机点检测其是否在 B 内,假设位
于 B 内的随机点个数为 N(in)(<=N),应用蒙特卡洛算法,则 B 的体积为
其中 V1 是 B1 的体积。如果产生足够多的随机点,理论上可以获得任意逼近精度。
V=V1(N(in)/N)
算法描述如下:
BEGIN
N=_MAX;
FOR I=0;I<_MAX;I++
X=RANDOM();
Y=RANDOM();
Z=RANDOM();
IF (X*X+Y*Y+Z*Z)<=1
COUNT++;
END IF;
END FOR;
BULK=V1*(COUNT/_MAX);
END;
本算法主要是在参考立方体的选取上和定义的_MAX 的值对结果影响较大,所以应该
选择合适的数。
3.2 并行算法设计
对 FOR 循环进行划分使用两个处理器完成计算。例如对一个长为 n 的序列,首先划分得
到两个长为 n/2 的序列,将其交给两个处理器分别处理;而后进一步划分得到四个长为 n/4
的序列,再分别交给四个处理器处理;如此递归下去最终得到结果。当然这是理想的划分情
况,如果划分步骤不能达到平均分配的目的,那么结果的效率会相对较差。
伪代码如下:
5
班级____________ 学号_________________ 姓名______________ 算法名称______________
BEGIN
N=_MAX;
FOR1
I=0;I<_MAX/2;I++
X1=RANDOM();
Y1=RANDOM();
Z1=RANDOM();
IF (X1*X1+Y1*Y1+Z1*Z1)<=1
COUNT1++;
END IF;
END FOR1;
FOR2 I=_MAX/2+1;I<_MAX;I++
X2=RANDOM();
Y2=RANDOM();
Z2=RANDOM();
IF (X2*X2+Y2*Y2+Z2*Z2)<=1
COUNT2++;
END IF;
END FOR2;
BULK=V1*((COUNT1+ COUNT2)/_MAX);
END;
3.3 理论加速比分析
实验中大量数据所产生的加速比比小量数据所产生的加速比要体现得更明显,并且数据生
成的并行加速比随着处理器核的增加而增加。设处理器个数为 p,数据量为 n,由于正常情
况下该快速排序算法的复杂度为 O(nlogn),并行处理的时间复杂度为 O(klogk),其中 k=n/p,
所以并行算法的时间复杂度为 O((n/p)log(n/p)),理论加速比为 nlogn/((n/p)log(n/p))=p+logp.
4. 功能模块实现与最终结果分析
4.1 基于 OpenMP 的并行算法实现
4.1.1 主要功能模块与实现方法
利用了 OpenMP 里面的#omp parallel sections 将对两个 for 循环用两个线程并行化执行,以多
线程方式并行运行程序,并行的算法步骤如下:
(1)初始化_max = 10000000;
(2)创建两个线程;
(3)由 OpenMP 编译指导语句控制产生并行执行代码区段;
(4)将数据存放到 tianqing_count;
(5)各线程调用算法得出结果;
并行算法的部分代码如下:
6
班级____________ 学号_________________ 姓名______________ 算法名称______________
#pragma omp parallel for private(tianqing_x,tianqing_y,tianqing_z) reduction(+:tianqing_count2)
for (tianqing_i = 0; tianqing_i
班级____________ 学号_________________ 姓名______________ 算法名称______________
//用 MPI_Comm_size 获得进程个数 int MPI_Comm_size(MPI_Comm comm, int *size);
MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
MPI_Get_processor_name(processor_name, &namelen);
MPI_Bcast(&tianqing_n,1,MPI_INT,0,MPI_COMM_WORLD);//将 tianqing_n 值广
播出去
算法执行;
MPI_Reduce(&tianqing_bulk, &pi,
1, MPI_DOUBLE, MPI_SUM,
0,
MPI_COMM_WORLD);//各个进程并行计数得到的计数总和
获得结果。
4.2.2 实验加速比分析
实验中使用了两个处理器,因此理论加速比应该为 2,通过多次测试,得出实验结果:加速
比:1.976906139262282,由于客观因素的影响,结果合理。
4.3 基于 Java 的并行算法实现
4.3.1 主要功能模块与实现方法
在 Java 中,创建用户自己的线程类,使用启动线程的 start()方法启动线程对象,使之从新建
状态转入就绪状态,定义线程操作的 run()方法,并定义新的 run()方法覆盖原来的 run()方法。
伪代码如下:
And thread1=new And(1,10000000);
And thread2=new And(2,10000000);
long startTime=System.currentTimeMillis();
启动线程1和线程2;
等待进程结束;
And and=new And(a,10000000);
bulk1=8*((b*1.0)/tianqing_n);
4.3.2 实验加速比分析
实验中创建了两个线程,通过多次测试,得出实验结果:由上面的理论加速比分析可知,当
线程数为 2 时,理论加速比为 2+log2=3.但由于实际操作中硬件设备以及内存分配的影响,
实验加速比达不到理论值 3.实验加速比在 1.9 左右,比较符合常理。
4.4 基于 Windows API 的并行算法实现
4.4.1 主要功能模块与实现方法
这里主要用到了 Win32 API 的进入点函数,在进程中创建一个线程时,也必须给这个线
程提供一个进入点函数。线程函数必须返回一个值,它将成为该线程的退出代码。使用
CreateThread()函数创建线程,用 WaitForMultipleObject()函数管理线程来监测多个对象。采
用 SetEvent 来设置事件处理线程间的同步问题。
伪代码如下:
DWORD WINAPI ThreadOne(LPVOID param)
{
8