矩阵乘法MPI并行程序报告

上传人:沈*** 文档编号:127992761 上传时间:2022-07-31 格式:DOC 页数:10 大小:422KB
收藏 版权申诉 举报 下载
矩阵乘法MPI并行程序报告_第1页
第1页 / 共10页
矩阵乘法MPI并行程序报告_第2页
第2页 / 共10页
矩阵乘法MPI并行程序报告_第3页
第3页 / 共10页
资源描述:

《矩阵乘法MPI并行程序报告》由会员分享,可在线阅读,更多相关《矩阵乘法MPI并行程序报告(10页珍藏版)》请在装配图网上搜索。

1、1. 实验目的1.1 掌握集群的使用措施。1.2 掌握以并行的方式分析问题、设计并行程序的措施。1.3 掌握如何对并行程序进行简朴的性能分析2. 实验规定122.1 使用MPI、OpenMp等并行程序设计措施设计矩阵乘法的并行程序。2.2 随机产生所需的矩阵元素,数据项不得少于1000*1000。2.3 尽量设计较高的加速比3. 实验环境1233.1 硬件环境:两个集群节点blade13、blade15。3.2 软件环境:Linux、gcc、Win7、VC+6.0。3.3 连接方式:Xmanager Enterprise 4.0远程桌面连接211.69.198.203。4. 实验程序12344

2、.1 随机算法产生矩阵:srand(unsigned int)time(NULL);for (i=0; iN; i+)for (j=0; jN; j+)Aij = rand() % 10;Bij = rand() % 10;Cik = 0;4.2 串行程序设计time(&start);for (i=0; iM; i+)for (k=0; kM; k+)Cik = 0;for (j=0; jM; j+)Cik += Aij*Bjk;time(&end);4.3 并行程序设计MPI_Init(&argc,&argv)和MPI_Finalize()MPI_Init用来初始化MPI执行环境,建立多种M

3、PI进程之间的联系,为后续通信做准备。而MPI_Finalize则是结束MPI执行环境。这两个函数就是定义MPI程序的并行区的,除了检测与否初始化的函数之外,不应当在这两个函数定义的区域外调用其他MPI函数。这两个函数都返回整型值,标记函数与否调用成功。int MPI_Comm_rank(MPI_Comm comm, int *rank) MPI_Comm_rank函数用来标记各个MPI进程,获取调用该函数进程的进程号,将自身与其她进程辨别。MPI_Comm_rank返回整型的错误值,需要提供两个参数:MPI_Comm类型的通信域,标记参与计算的MPI进程组。上面例子中使用的是MPI_COMM

4、_WORLD,这个进程组是MPI实现预先定义好的进程组,指的是所有MPI进程所在的进程组。如果想要申请自己的特殊的进程组,则需要通过MPI_Comm定义并通过其他MPI函数生成。&rank返回调用进程中的标记号。int MPI_Comm_size( MPI_Comm comm, int *size) MPI_Comm_size函数用来获取指定通信域的进程个数,拟定自身需要完毕的任务数。 MPI_Comm类型的通信域,标记参与计算的MPI进程组。上面的例子中用的是MPI_COMM_WORLD。&size返回相应进程组中的进程数。int MPI_Send(void *buf, int count,

5、 MPI_Datatype datatype, int dest, int tag, MPI_Comm comm)MPI_Send 函数用于发送一种消息到目的进程。通信域中的dest进程发送数据,数据寄存在buf中,类型是datatype,个数是count,这个消息的标志是tag,用以和本进程向同一目的进程发送的其他消息区别开来。int MPI_Recv(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status)MPI_Recv 函数用于从指定进程接受一

6、种消息。它的含义是进程从comm域中source进程接受标签号为tag的数据,并保存到buf中。接受缓冲区buf的大小不能不不小于发送过来的消息的长度。否则会由于数组越界导致程序出错。主进程if(process_id = 0)row_aver = N / slave_num;remainder = N % slave_num;offset = 0;for(dest=1; dest=slave_num; dest+) rows = (dest = remainder) ? row_aver+1 : row_aver;printf(sending %d rows to process %dn, r

7、ows, dest); MPI_Send(&offset,1,MPI_INT,dest,FROM_MASTER, MPI_COMM_WORLD);MPI_Send(&rows,1,MPI_INT,dest,FROM_MASTER, MPI_COMM_WORLD);MPI_Send(&Aoffset0,rows*N,MPI_INT,dest,FROM_MASTER, MPI_COMM_WORLD);MPI_Send(&B,N*N,MPI_INT,dest,FROM_MASTER,MPI_COMM_WORLD);offset += rows;start_time = MPI_Wtime();for

8、(source=1; source 0)MPI_Recv(&offset,1,MPI_INT,0,FROM_MASTER,MPI_COMM_WORLD,&status);MPI_Recv(&rows,1,MPI_INT,0,FROM_MASTER,MPI_COMM_WORLD,&status);MPI_Recv(&A,rows*N,MPI_INT,0,FROM_MASTER,MPI_COMM_WORLD,&status);MPI_Recv(&B,N*N,MPI_INT,0,FROM_MASTER,MPI_COMM_WORLD,&status);/矩阵乘法for(i=0; irows; i+)f

9、or (k=0; kN; k+)int tmp = Aik;for (j=0; jN; j+)Cij += tmp*Bkj; /运用MPI_Send(&offset,1,MPI_INT,0,FROM_SLAVE,MPI_COMM_WORLD); MPI_Send(&rows,1,MPI_INT,0, FROM_SLAVE, MPI_COMM_WORLD); MPI_Send(&C,rows*N,MPI_UNSIGNED_LONG_LONG,0,FROM_SLAVE, MPI_COMM_WORLD);MPI_Finalize();return 0;5. 性能分析分析公式:加速比=串行执行时间/并

10、行执行时间效率=加速比/节点数123455.1 串行程序的执行时间(秒) 矩阵规模实验成果100030004000第1次11.00099.000372.000799.000第2次11.00098.000376.000799.000第3次11.00099.000373.000802.000平均值11.00098.667373.667800.000图1. 不同矩阵规模下串行程序的执行时间5.2 八个节点时,不同矩阵规模并行程序的执行时间(秒) 矩阵规模实验成果100030004000第1次0.8296.83323.37255.422第2次0.8326.83823.31555.786第3次0.837

11、6.82023.56055.732平均值0.8336.83023.41655.647加速比13.20514.44615.95814.376效率1.6511.8061.9951.797图2. 八个节点时,不同矩阵规模下并行程序的执行时间图3. 八个节点时,不同矩阵规模下并行程序的加速比图4. 八个节点时,不同矩阵规模下并行程序的效率分析随着矩阵规模的增长执行时间程序的执行时间急剧增长。加速比程序的加速比基本保持不变。效率程序的效率基本保持不变。5.3 矩阵规模为1000*1000时,不同节点数下并行程序的执行时间(秒) 节点个数实验成果2345678第1次5.7922.9171.9451.455

12、1.1700.9730.829第2次5.7932.8991.9441.4741.1670.9710.832第3次5.8382.9151.9351.4531.1690.9750.837平均值5.8082.9101.9411.4611.1690.9730.833加速比1.984 3.780 5.667 7.259 9.410 11.305 13.205 效率0.992 1.260 1.417 1.452 1.568 1.615 1.651 图5.矩阵规模1000*1000时,不同节点下的并行程序的执行时间图6.矩阵规模1000*1000时,不同节点下的并行程序的加速比图7.矩阵规模1000*100

13、0时,不同节点下的并行程序的效率分析随着计算节点数的增长,执行时间程序的执行时间迅速减少,然后趋于平稳。加速比程序的加速比基本呈线性增长,公式趋y=1.8374x+0.022。效率程序的效率逐渐增长,然后趋于平缓。6. 顾客手册1234566.1 连接:ssh 密码:*6.2 登陆:sudo ssh blade13或者blade156.3 切换至工作目录: cd /home/pppusr/*6.4 编译:mpicc -o matrix matrix_multi.c6.5 运营:mpirun -np 8 ./matrix#include #include #include #define N 1

14、000 #define FROM_MASTER 1#define FROM_SLAVE 2int ANN, BNN;unsigned long long CNN;MPI_Status status;/消息接受状态变量,存储也是分布的 int main(int argc, char *argv) intprocess_num; /进程数,该变量为各解决器中的同名变量, 存储是分布的 intprocess_id; intslave_num; intdest; /目的进程标记号intsource; /发送数据进程的标记号introws;introw_aver;intremainder; intoff

15、set;/行偏移量inti, j, k; double start_time, end_time; srand(unsigned int)time(NULL);for (i=0; iN; i+)for (j=0; jN; j+)Aij = rand() % 10;Bij = rand() % 10;Cik = 0;MPI_Init(&argc, &argv);/初始化MPI/*该函数被各进程各调用一次,得到各自的进程id值*/MPI_Comm_rank(MPI_COMM_WORLD, &process_id);/*该函数被各进程各调用一次,得到进程数*/MPI_Comm_size(MPI_CO

16、MM_WORLD, &process_num);slave_num = process_num - 1; if(process_id = 0)row_aver = N / slave_num;remainder = N % slave_num;offset = 0;/有的程序是将时间函数放在这个for循环的两边for(dest=1; dest=slave_num; dest+) rows = (dest = remainder) ? row_aver+1 : row_aver;printf(sending %d rows to process %dn, rows, dest); MPI_Sen

17、d(&offset, 1, MPI_INT, dest, FROM_MASTER, MPI_COMM_WORLD);MPI_Send(&rows, 1, MPI_INT, dest, FROM_MASTER, MPI_COMM_WORLD);MPI_Send(&Aoffset0, rows*N, MPI_INT, dest, FROM_MASTER, MPI_COMM_WORLD);MPI_Send(&B, N*N, MPI_INT, dest, FROM_MASTER, MPI_COMM_WORLD);offset += rows;start_time = MPI_Wtime();for(s

18、ource=1; source 0)MPI_Recv(&offset, 1, MPI_INT, 0, FROM_MASTER, MPI_COMM_WORLD, &status);MPI_Recv(&rows, 1, MPI_INT, 0, FROM_MASTER, MPI_COMM_WORLD, &status);MPI_Recv(&A, rows*N, MPI_INT, 0, FROM_MASTER, MPI_COMM_WORLD, &status);MPI_Recv(&B, N*N, MPI_INT, 0, FROM_MASTER, MPI_COMM_WORLD, &status);for

19、(i=0; irows; i+)for (k=0; kN; k+)int tmp = Aik;for (j=0; jN; j+)Cij += tmp*Bkj; MPI_Send(&offset, 1, MPI_INT, 0, FROM_SLAVE, MPI_COMM_WORLD); /将行偏移量发回主进程MPI_Send(&rows, 1, MPI_INT, 0, FROM_SLAVE, MPI_COMM_WORLD); /将行数发回主进程MPI_Send(&C, rows*N, MPI_UNSIGNED_LONG_LONG, 0, FROM_SLAVE, MPI_COMM_WORLD); /将计算得到的值发回主进程/*关闭MPI,标志并行代码段的结束*/MPI_Finalize();return 0;

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!