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与主机名匹配。
(只展示了一个节点,其他节点类似)
标签:IP,Exp1,编程,MPI,数组,进程,节点,输入 来源: https://blog.csdn.net/weixin_43973320/article/details/112916212