ImageVerifierCode 换一换
格式:DOCX , 页数:13 ,大小:442.30KB ,
资源ID:7767588      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7767588.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(mpi冒泡排序并行化.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

mpi冒泡排序并行化.docx

1、mpi冒泡排序并行化北京科技大学计算机与通信工程学院实 验 报 告 实验名称: 冒泡排序的并行化 学生姓名: 朱帅 专 业: 计算机科学与技术 班 级: 计1203 学 号: 41255072 指导教师: 李建江 实验成绩: 实验地点: 机电楼301 实验时间: 2015年4月8日 一、实验目的与实验要求1、实验目的(1)学会将串行程序改为并行程序。 (2)学会mpich2的使用。 (3)学会openmp的配置。(4)mpi与openmp之间的比较。2、实验要求(1)将串行冒泡程序局部并行化,以降低时间消耗。 (2) 理论上求出时间复杂度之比,根据结果得出时间消耗之比,进行比对分析。二、实验设

2、备(环境)及要求Vs2013,mpich2三、实验内容与步骤1、实验一 mpi并行(1)实验内容1、写出一个冒泡排序程序,求出其时间复杂度,并运行得到相应的时间消耗。2、将冒泡程序改为mpi并行程序:将全部需要排序的数分成4等份,分给四个进程一起冒泡,最后将所得的结果归到一个进程,进行归并排序,得到结果,得到时间消耗。算出时间复杂度。3、对得出的结果进行讨论与分析。 (2)主要步骤1、串行冒泡程序 时间复杂度:取所要排序的数的个数为n个,时间复杂度为n*n/2。代码实现:/ maopao.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include stdlib

3、.h#includetime.hconst int ARRAY_SIZE = 120000;int main(int argc, char* argv) int zongshuARRAY_SIZE; srand(10086); time_t now_time, end_time; for (int i = 0; i ARRAY_SIZE; i+) zongshui=rand(); now_time = time(NULL); for (int i = 0; i i; j-) if (zongshuj = zongshuj - 1) int z = zongshuj - 1; zongshuj

4、- 1 = zongshuj; zongshuj = z; end_time = time(NULL); long shijian = end_time - now_time; for (int i = 0; i ARRAY_SIZE; i+) printf(%d , zongshui); printf(所用时间:%ld,shijian); while (true);2、并行程序时间复杂度:取所要排序的数的个数为n个,进程数为m个。时间复杂度:((n/m)*(n/m)/2)+n+4*n。代码实现:/ MPITest.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#

5、include mpi.h#include #include #include stdlib.h#define SIZE 4/进程数const int ARRAY_SIZE = 30000;/每个进程分配的个数int shuzuSIZEARRAY_SIZE;int zonghanshuSIZEARRAY_SIZE;double endwtime;void Scatter_1(int);int main(int argc, char *argv) int myid; MPI_Init(&argc, &argv); MPI_Comm_rank(MPI_COMM_WORLD, &myid); Sca

6、tter_1(myid); MPI_Finalize();void Scatter_1(int myid) int numtasks; srand(10086); for (int i = 0; i SIZE; i+) for (int j = 0; j ARRAY_SIZE; j+) shuzuij = rand(); /随机生成数组 int xiaopaixuARRAY_SIZE; double startwtime = MPI_Wtime(); MPI_Comm_size(MPI_COMM_WORLD, &numtasks); if (numtasks = SIZE) MPI_Scatt

7、er(shuzu, ARRAY_SIZE, MPI_INT, xiaopaixu, ARRAY_SIZE, MPI_INT, 0, MPI_COMM_WORLD); for (int i = 0; i i; j-) if (xiaopaixuj = xiaopaixuj - 1) int z = xiaopaixuj - 1; xiaopaixuj - 1 = xiaopaixuj; xiaopaixuj = z; /每个进程里的冒泡排序 MPI_Gather(xiaopaixu, ARRAY_SIZE, MPI_INT, zonghanshu, ARRAY_SIZE, MPI_INT, 0,

8、 MPI_COMM_WORLD); int timeSIZE; for (int i = 0; i = 0; j-) for (int k = 0; k = ARRAY_SIZE) ak = 0; else ak = zonghanshukARRAY_SIZE - timek - 1; int x = a0; for (int i = 1; ix) x = ai; for (int n = 0; n SIZE; n+) if (x = an) timen = timen + 1; break; zongpaixu2j = x; endwtime = MPI_Wtime(); if (myid)

9、; else for (int i = 0; i SIZE*ARRAY_SIZE; i+) printf(%d , zongpaixu2i); if (myid); else printf(wall clock time=% fn, endwtime - startwtime);2、实验2在实验一的基础上将程序改为openmp。 代码实现:(水平不高,写的程序通用性不好,只写了四线程的) / Openmp.cpp : 定义控制台应用程序的入口点。/#include stdafx.h#include #include #include stdlib.h#includetime.h#include

10、 #define SIZE 4const int ARRAY_SIZE = 12000;int shuzuSIZEARRAY_SIZE;int xiaopaixu1ARRAY_SIZE;int xiaopaixu2ARRAY_SIZE;int xiaopaixu3ARRAY_SIZE;int xiaopaixu4ARRAY_SIZE;int zonghanshuSIZEARRAY_SIZE;int zongpaixuARRAY_SIZE*SIZE;void xiaohansu(int *A, int l, int u) for (int i = l; i i; j-) if (Aj = Aj

11、- 1) int z = Aj - 1; Aj - 1 = Aj; Aj = z; /每个线程排序int main(int argc, char* argv) int t1, t2; int i; int id; clock_t now_time, end_time; srand(10086); for (int i = 0; i SIZE; i+) for (int j = 0; j ARRAY_SIZE; j+) shuzuij = rand(); /随机生成数组now_time = clock();#pragma omp parallel default(none) shared(shu

12、zu,xiaopaixu1,xiaopaixu2,xiaopaixu3,xiaopaixu4,ARRAY_SIZE) private(i) #pragma omp for for (i = 0; i ARRAY_SIZE; i+)/这个for循环是并行的,将数组分为四份 xiaopaixu1i = shuzu0i; xiaopaixu2i = shuzu1i; xiaopaixu3i = shuzu2i; xiaopaixu4i = shuzu3i; #pragma omp parallel default(none) shared(xiaopaixu1,xiaopaixu2,xiaopaix

13、u3,xiaopaixu4,ARRAY_SIZE) #pragma omp parallel sections #pragma omp section xiaohansu(xiaopaixu1, 0, ARRAY_SIZE-1);/排序 #pragma omp section xiaohansu(xiaopaixu2, 0, ARRAY_SIZE);#pragma omp section xiaohansu(xiaopaixu3, 0, ARRAY_SIZE);#pragma omp section xiaohansu(xiaopaixu4, 0, ARRAY_SIZE); for (i =

14、0; i ARRAY_SIZE; i+)/合到一份 zonghanshu0i=xiaopaixu1i; zonghanshu1i=xiaopaixu2i; zonghanshu2i=xiaopaixu3i; zonghanshu3i=xiaopaixu4i; int timeSIZE; for (int i = 0; i = 0; j-) for (int k = 0; k = ARRAY_SIZE) ak = 0; else ak = zonghanshukARRAY_SIZE - timek - 1; int x = a0; for (int i = 1; ix) x = ai; for

15、(int n = 0; n SIZE; n+) if (x = an) timen = timen + 1; break; zongpaixuj = x; /归并end_time = clock();double shijian = end_time - now_time;for (int i = 0; i SIZE*ARRAY_SIZE; i+) printf(%d , zongpaixui);printf(所用时间:%lf, shijian / CLK_TCK);while (true);四:实验结果与分析Mpi:串行Mpi 1.2万 2.4万 3.6万 4.8万 6.0万 7.2万串行(

16、秒) 0.441 1.766 3.951 6.877 10.469 14.6876线(秒) 0.029 0.108 0.242 0.435 0.656 0.9404线(秒) 0.035 0.151 0.339 0.615 0.969 1.4092线(秒) 0.119 0.502 1.108 2.040 3.121 4.516从表中可以看出4线程的时候,并行程序的速度是串行程序速度的十倍之多,而理论上大概8倍。这就跟改的程序有关。在并行程序中,最后采用的是归并,由此,发生了这些奇妙的情况:实则本身的算法就比冒泡优一些,但又不能只采用冒泡算法,那样在最后又来个冒泡,其程序就没有意义了。Openmp

17、:这是4.8万个数排序的结果,可以看出用了2.876秒,比MPI慢了四倍之多,这可能是程序的不合理,带来了多余的时间消耗(通信)。但比串行还是要快很多。五:结论(讨论)1、实验结论 1、就这冒泡排序改为并行的,虽然时间缩短了很多倍,但与快排等排序算法并行相比,其速度又不堪入目。2、就冒泡排序而言,其mpi并行远远优于openmp(就我写的程序而言。),虽然最后都用了并归。2、讨论1、这些程序都实现在一台电脑上完成的,还未试过与其他电脑通信,所以其所表现出来的结果并不完全按正确,毕竟并行计算涉及到不同主机之间的通信。2、由于个人编程能力不高,在这里只讨论了一些时间上的差异,并未对空间上进行比对(不会。)。3、就openmp程序而言,应该还可以改写,增加其通用性和减少通信。六、教师评审教师评语实验成绩 签名: 日期:

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

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