mpi冒泡排序并行化.docx

上传人:b****5 文档编号:29701694 上传时间:2023-07-26 格式:DOCX 页数:15 大小:445.12KB
下载 相关 举报
mpi冒泡排序并行化.docx_第1页
第1页 / 共15页
mpi冒泡排序并行化.docx_第2页
第2页 / 共15页
mpi冒泡排序并行化.docx_第3页
第3页 / 共15页
mpi冒泡排序并行化.docx_第4页
第4页 / 共15页
mpi冒泡排序并行化.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

mpi冒泡排序并行化.docx

《mpi冒泡排序并行化.docx》由会员分享,可在线阅读,更多相关《mpi冒泡排序并行化.docx(15页珍藏版)》请在冰豆网上搜索。

mpi冒泡排序并行化.docx

mpi冒泡排序并行化

北京科技大学 计算机与通信工程学院

 

实验报告

 实验名称:

冒泡排序的并行化 

学生姓名:

  朱帅    

专 业:

 计算机科学与技术

班 级:

   计1203  

学  号:

    

指导教师:

  李建江  

实验成绩:

  

实验地点:

 机电楼301

实验时间:

 2015年4月8日

一、实验目的与实验要求

1、实验目的

(1)学会将串行程序改为并行程序.

(2)学会mpich2的使用。

(3)学会openmp的配置。

(4)mpi与openmp之间的比较。

2、实验要求

(1)将串行冒泡程序局部并行化,以降低时间消耗。

(2) 理论上求出时间复杂度之比,根据结果得出时间消耗之比,进行比对分析.

二、实验设备(环境)及要求

Vs2013,mpich2

三、实验内容与步骤

1、实验一mpi并行

(1)实验内容

1、写出一个冒泡排序程序,求出其时间复杂度,并运行得到相应的时间消耗.

2、将冒泡程序改为mpi并行程序:

将全部需要排序的数分成4等份,分给四个进程一起冒泡,最后将所得的结果归到一个进程,进行归并排序,得到结果,得到时间消耗。

算出时间复杂度。

3、对得出的结果进行讨论与分析。

 

(2)主要步骤

1、串行冒泡程序

时间复杂度:

取所要排序的数的个数为n个,时间复杂度为n*n/2。

代码实现:

//maopao.cpp:

 定义控制台应用程序的入口点。

//

#include"stdafx。

h"

#include”stdlib.h"

#include"time。

h”

constintARRAY_SIZE =120000;

int main(intargc,char*argv[])

{

int zongshu[ARRAY_SIZE];

srand(10086);

time_tnow_time, end_time;

ﻩfor (inti=0; i 〈ARRAY_SIZE;i++){

ﻩzongshu[i]=rand();

}

now_time=time(NULL);

for (inti= 0;i<ARRAY_SIZE;i++)

for (int j= ARRAY_SIZE-1; j〉 i;j-—)

ﻩﻩ{

ﻩﻩif(zongshu[j] <=zongshu[j— 1])

ﻩ{

ﻩﻩﻩintz=zongshu[j— 1];

ﻩﻩzongshu[j-1]=zongshu[j];

ﻩzongshu[j]= z;

ﻩﻩ}

ﻩﻩ}

}

end_time=time(NULL);

ﻩlongshijian = end_time -now_time;

ﻩfor(inti =0;i<ARRAY_SIZE;i++){

   printf(”%d",zongshu[i]);

ﻩ}

ﻩprintf(”所用时间:

%ld”,shijian);

ﻩwhile(true);

}

2、并行程序

时间复杂度:

取所要排序的数的个数为n个,进程数为m个.时间复杂度:

((n/m)*(n/m)/2)+n+4*n。

代码实现:

// MPITest.cpp :

定义控制台应用程序的入口点.

//

#include"stdafx.h"

#include"mpi。

h"

#include〈stdio.h〉

#include〈math。

h>

#include ”stdlib。

h”

#defineSIZE4//进程数

constintARRAY_SIZE=30000;//每个进程分配的个数

int shuzu[SIZE][ARRAY_SIZE];

intzonghanshu[SIZE][ARRAY_SIZE];

doubleendwtime;

voidScatter_1(int);

intmain(intargc,char*argv[]){

intmyid;

MPI_Init(&argc,&argv);

MPI_Comm_rank(MPI_COMM_WORLD, &myid);

Scatter_1(myid);

ﻩMPI_Finalize();

}

void Scatter_1(intmyid){

intnumtasks;

ﻩsrand(10086);

for(inti=0;i

ﻩfor(intj =0; j〈ARRAY_SIZE;j++){

ﻩshuzu[i][j]=rand();

ﻩ}

}

ﻩ//随机生成数组

ﻩintxiaopaixu[ARRAY_SIZE];

ﻩdouble startwtime= MPI_Wtime();

ﻩMPI_Comm_size(MPI_COMM_WORLD,&numtasks);

ﻩif (numtasks==SIZE){

ﻩMPI_Scatter(shuzu,ARRAY_SIZE, MPI_INT, xiaopaixu,ARRAY_SIZE,MPI_INT,0, MPI_COMM_WORLD);

ﻩﻩfor (inti=0;i 〈ARRAY_SIZE;i++){

ﻩﻩfor(int j=ARRAY_SIZE— 1;j〉i; j-—){

ﻩif(xiaopaixu[j] <=xiaopaixu[j—1]){

ﻩﻩintz= xiaopaixu[j-1];

xiaopaixu[j- 1]=xiaopaixu[j];

ﻩxiaopaixu[j]=z;

ﻩﻩﻩ}

ﻩ}//每个进程里的冒泡排序

ﻩMPI_Gather(xiaopaixu, ARRAY_SIZE,MPI_INT,zonghanshu,ARRAY_SIZE,MPI_INT,0,MPI_COMM_WORLD);

ﻩint time[SIZE];

ﻩfor(int i=0;i〈SIZE;i++){

ﻩtime[i]=0;

ﻩinta[SIZE];

ﻩintzongpaixu2[ARRAY_SIZE*SIZE];

ﻩfor(intj= ARRAY_SIZE*SIZE—1; j〉=0; j-—){

ﻩﻩfor (intk=0;k

ﻩﻩﻩif(time[k]>= ARRAY_SIZE){

ﻩﻩa[k]=0;

ﻩﻩﻩﻩ}

ﻩﻩelse

ﻩﻩ{

ﻩﻩﻩa[k]= zonghanshu[k][ARRAY_SIZE-time[k]-1];

ﻩ}

ﻩﻩﻩ}

ﻩﻩ

ﻩﻩﻩint x=a[0];

for (int i =1;i

ﻩﻩif(a[i]>x){

ﻩx =a[i];

ﻩﻩ}

ﻩﻩﻩ}

ﻩﻩfor(int n=0;n< SIZE;n++){

ﻩﻩif(x ==a[n]){

ﻩﻩtime[n]= time[n]+1;

ﻩﻩbreak;

ﻩﻩ}

ﻩﻩ}

ﻩﻩzongpaixu2[j]=x;

}

ﻩendwtime =MPI_Wtime();

ﻩif(myid);

ﻩelse

ﻩﻩfor (inti=0;i 〈SIZE*ARRAY_SIZE;i++){

ﻩﻩﻩprintf(”%d”,zongpaixu2[i]);

ﻩ}

}

ﻩif(myid);

ﻩelse

ﻩprintf("wallclocktime=% f\n”, endwtime—startwtime);

2、实验2

在实验一的基础上将程序改为openmp。

 代码实现:

(水平不高,写的程序通用性不好,只写了四线程的)

 // Openmp。

cpp:

定义控制台应用程序的入口点。

//

#include"stdafx。

h”

#include

h〉

#include <math。

h>

#include”stdlib.h"

#include”time.h"

#include

#define SIZE4

const int ARRAY_SIZE=12000;

intshuzu[SIZE][ARRAY_SIZE];

intxiaopaixu1[ARRAY_SIZE];

intxiaopaixu2[ARRAY_SIZE];

intxiaopaixu3[ARRAY_SIZE];

int xiaopaixu4[ARRAY_SIZE];

int zonghanshu[SIZE][ARRAY_SIZE];

intzongpaixu[ARRAY_SIZE*SIZE];

voidxiaohansu(int *A, intl,int u){

for(int i=l;i

ﻩfor (intj=u- 1;j>i; j—-){

if(A[j]〈= A[j—1]){

ﻩﻩintz = A[j-1];

ﻩﻩﻩA[j- 1] =A[j];

ﻩﻩA[j]=z;

ﻩ}

ﻩ}

}

//每个线程排序

intmain(intargc,char*argv[])

{

ﻩint t1,t2;

inti;

intid;

ﻩclock_tnow_time, end_time;

ﻩsrand(10086);

for(inti= 0;i 

ﻩfor (intj=0;j〈ARRAY_SIZE;j++){

ﻩﻩshuzu[i][j]=rand();

ﻩ}

}

//随机生成数组

now_time =clock();

#pragmaomp parallel default(none)shared(shuzu,xiaopaixu1,xiaopaixu2,xiaopaixu3,xiaopaixu4,ARRAY_SIZE) private(i)

#pragma ompfor

ﻩﻩfor(i=0;i

ﻩ{

ﻩﻩxiaopaixu1[i]=shuzu[0][i];

ﻩﻩxiaopaixu2[i]= shuzu[1][i];

ﻩﻩxiaopaixu3[i]= shuzu[2][i];

ﻩﻩxiaopaixu4[i]=shuzu[3][i];

ﻩﻩ}

}

#pragmaompparallel default(none) shared(xiaopaixu1,xiaopaixu2,xiaopaixu3,xiaopaixu4,ARRAY_SIZE)

ﻩ{

#pragmaompparallelsections 

ﻩﻩ{

#pragmaomp section

ﻩﻩﻩxiaohansu(xiaopaixu1, 0,ARRAY_SIZE-1);//排序

#pragmaomp section 

ﻩﻩﻩxiaohansu(xiaopaixu2,0,ARRAY_SIZE);

#pragmaomp section

xiaohansu(xiaopaixu3,0, ARRAY_SIZE);

#pragma ompsection

ﻩxiaohansu(xiaopaixu4, 0,ARRAY_SIZE);ﻩ

}

ﻩ}

for(i=0; i

ﻩ{

ﻩzonghanshu[0][i]=xiaopaixu1[i];

ﻩzonghanshu[1][i]=xiaopaixu2[i];

ﻩzonghanshu[2][i]=xiaopaixu3[i];

ﻩﻩzonghanshu[3][i]=xiaopaixu4[i];

ﻩ}

inttime[SIZE];

for(inti =0;i 

ﻩtime[i]=0;

}

inta[SIZE];

ﻩfor(intj=ARRAY_SIZE*SIZE-1;j 〉= 0; j--){

ﻩfor (intk=0;k 〈SIZE;k++){

ﻩﻩif(time[k]>= ARRAY_SIZE){

ﻩﻩﻩa[k] =0;

ﻩ}

ﻩﻩelse

ﻩﻩﻩ{

ﻩa[k]=zonghanshu[k][ARRAY_SIZE-time[k]-1];

ﻩﻩ}

ﻩ}

ﻩintx =a[0];

ﻩfor(inti=1; i〈SIZE;i++){

ﻩif(a[i]>x){

ﻩﻩﻩx=a[i];

ﻩﻩ}

ﻩ}

for(intn = 0;n<SIZE; n++){

ﻩﻩif(x==a[n]){

ﻩﻩtime[n] =time[n]+1;

ﻩﻩbreak;

ﻩﻩ}

zongpaixu[j] =x;

}

//归并

end_time =clock();

doubleshijian=end_time-now_time;

for (inti=0;i〈SIZE*ARRAY_SIZE;i++){

ﻩprintf("%d”,zongpaixu[i]);

}

printf(”所用时间:

%lf”, shijian/CLK_TCK);

while(true);

}

四:

实验结果与分析

Mpi:

串行

Mpi

1.2万

 2。

4万

3。

6万

4。

8万

6。

0万

7。

2万

串行(秒)

 0。

441

1.766

3.951

6。

877

10.469

14.687

6线(秒)

0。

029

0.108

0.242

0.435

0。

656

0。

940

4线(秒)

0。

035

 0。

151

0.339

 0.615

0.969

1.409

2线(秒)

0。

119

0。

502

1。

108

 2。

040

 3。

121

4。

516

从表中可以看出4线程的时候,并行程序的速度是串行程序速度的十倍之多,而理论上大概8倍.这就跟改的程序有关.在并行程序中,最后采用的是归并,由此,发生了这些奇妙的情况:

实则本身的算法就比冒泡优一些,但又不能只采用冒泡算法,那样在最后又来个冒泡,其程序就没有意义了。

Openmp:

这是4.8万个数排序的结果,可以看出用了2.876秒,比MPI慢了四倍之多,这可能是程序的不合理,带来了多余的时间消耗(通信)。

但比串行还是要快很多。

五:

结论(讨论)

1、实验结论

1、就这冒泡排序改为并行的,虽然时间缩短了很多倍,但与快排等排序算法并行相比,其速度又不堪入目。

2、就冒泡排序而言,其mpi并行远远优于openmp(就我写的程序而言.。

),虽然最后都用了并归。

2、讨论

1、这些程序都实现在一台电脑上完成的,还未试过与其他电脑通信,所以其所表现出来的结果并不完全按正确,毕竟并行计算涉及到不同主机之间的通信。

2、由于个人编程能力不高,在这里只讨论了一些时间上的差异,并未对空间上进行比对(不会。

)。

3、就openmp程序而言,应该还可以改写,增加其通用性和减少通信.

六、教师评审

教师评语

实验成绩

 

    签名:

        日期:

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

当前位置:首页 > 人文社科

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

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