Exp1.MPI集群搭建与代码编程

1.代码见附录代码文件
大数组各元素开平方求和:susum.c
计算积分:calint.c
2.运行说明及截图
2.1集群搭建完成多机运行,使用hellompi测试:
在这里插入图片描述
可以看到三个主机 host、host1、host2都参与工作,可以互相接通(ssh测试结果不展示了就,后边的程序结果可以说明这一点)
10个任务的分配可以看到是按顺序分的:host:0,3,6,9 host1:1,4,7 host2:2,5,8
2.2 用MPI_Reduce接口改写大数组各元素开平方求和
(单机调试过程及结果不再展示,遇到的问题及解决会在后续中说明)
在这里插入图片描述
采用了交互式方法进行输入变量(在下一个程序中使用main函数进行输入变量,从而确定俩个方法均可以执行)
3个进程分配给了三个节点,下边进行运算速度和进程数、参与节点数之间的比较。
在这里插入图片描述
当进程数翻一倍后,计算结果任然保持一致,速度有提升,但由于仍然使用三个节点,且三个虚拟机都在同一个pc上运行,故效果不是很明显。
在这里插入图片描述
当参与节点数由3个变为2个后,运算速度明显下降,可以说明参与运算的节点对并行运算速度有明显影响。
2.3用MPI_Send和MPI_Receive接口改写计算积分
在这里插入图片描述
使用main函数输入三个参数,分别为积分区间[a,b]和区间划分个数N
当N为10000是 结果为332.999999392499717,下面通过调整N来说明其对精确度和计算时间的影响。
在这里插入图片描述
可以看到当N增大到1000000后(增大了100倍),精确度有了明显提升,误差为原来的1/100,同时由于运算量的倍数级增大,运算速度明显下降,需要15秒多。
3.问题总结及解决方案
编译时报错 提示:undefined reference to ‘sqrt’
解决:编译时涉及 math.c\h库中的函数,要在编译后加-lm参数。
在这里插入图片描述
因为数学函数位于libm.so库文件中(这些库文件通常位于/lib目录下),-lm选项告诉编译器,我们程序中用到的数学函数要到这个库文件里找。其他的大部分库函数(例如printf)位于libc.so库文件中,使用libc.so中的库函数在编译时不需要加-lc选项,当然加了也不算错,因为这个选项是gcc/mpicc的默认选项。
从控制台输入参数的问题
错误示范:当把输入放到MPI_Init之前 如下:
在这里插入图片描述
会导致输入不能结束,无法正常进入并行程序
在这里插入图片描述
所以不能通过这种方法来输入
解决方法:(解决参数输入问题)
1.通过main函数传参
int main(int argc, char **argv)
argc 代表传入参数的个数 argv是储存变量的二维字符数组
在这里插入图片描述
在这里插入图片描述
2.通过交互式方法输入
MPI 一般只允许 0 号进程访问标准输入,否则不能判断哪个进程应该得到输入数据。所以用 0 号进程获得输入,再通过MPI_Bcast方法发送给其他进程。
在这里插入图片描述
动态数组在多线程中的应用
通过myid ==1时输入数组大小N,其他进程也要对数组进行自己的定义
在这里插入图片描述
即如上,各个进程自己定义后,在一个进程中完成了数组元素的赋值后,通过MPI_Bcast广播给其他数组。
解决同一台PC生成的虚拟机IP一样的问题
Oracle VM VirtualBox默认的网络选项为网络地址转换(NAT),这会导致同一台PC上生成的三个虚拟机IP一样,可通过将连接方式换为NAT 网络(如下)来解决。
在这里插入图片描述
也可以手动设置固定IP,但不如前一种方法简单,具体可参考文章链接https://blog.csdn.net/wolf_soul/article/details/46409323 ,此处不展开解释。
MPI跨节点运行:Fatal error in PMPI_Bcast: Unknown error class, error stack:
主要是ssh配备过程中修改了主机名没有在hosts文件中手动修改,使得自己的电脑ip与主机名不匹配(或自己的IP修改后未在此处同步修改)。这种情况下,各个虚拟机节点之间的访问即ssh 是可以实现的,但同一节点在集群环境下并行运行时会发生信息传递错误。
解决方法:在每个节点上sudo gedit /etc/hosts 更新,使得IP与主机名匹配。
在这里插入图片描述
(只展示了一个节点,其他节点类似)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值