|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
初学阶段只要把上课时候学习过的命令练熟就可以了.单靠学习各种命令而成为高手是不可能的。
Linux下MPI(MessagePassageInterface)的程序不太好调试,在windows下vs2005以上的IDE有集成的烦琐MPI调试工具,没有效过,有乐趣的能够实验一下。上面总结了一些比来在用MPI和c言语写程序时的调试履历(Ubuntu情况,c言语,mpich1.2.7)。
必要注重的几个小成绩
在编译程序的时分Cg是必定要加的,否则在gdb调试的时分大概会报相似“sourceisnotavailable”的毛病。入手下手我调程序的时分我都把我的程序的每一个调试版本,分离发送到集群中的每台呆板下面,然后在mpirunCmachinefilehostCnp3myprogram运转我的程序,这类办法没无效率,只能在最初纪录实行了局的时分大概最初调试阶段才干用。无效率的体例是mpirunCnp3myprogram在本机间接运转程序,如许mpi就会在本机开3个myprogram的历程,如许不接网线都能够便利的调试mpi的程序。这是几个小成绩,上面切进关头部分。
用gdb来调试mpi的程序
起首,本文所用的mpich版本为1.2.7,大概跟其他版本有必定的差别,RTFM,看看本人所用版本的利用手册来办理版本上的差别。
Mpi程序运转的时分都是经由过程mpirun后接参数和你的程序,gdb也是相似的历程,以是你不成以间接gdbmpirunCnp3myprogram,但你能够间接mpirunCgdbCnp3myprogram。如许你就能够再gdb中调试你的程序了。
不外,如许有个成绩,你能够调试在主节点运转的部分,也就是相对集群而言,你本机所运转的部分,程序运转到子各个节点部分今后,你的gdb就不克不及持续调下往了,这个就是个成绩。Gdb实在能够在程序已实行了今后,再挂载你的程序,如许你能够在程序实行的时代把gdb挂载出去。简而言之就是把程序停息起来(好比读个键盘输出getchar()之类的),用gdbmyprogrampid(myprogram是你程序的历程名,pid是你程序历程的pid号)怎样检察pid号呢?在终端内里运转psCa就能够了,如许就能够找到你本人程序的历程名和PID号,gdbmyprogram1234如许就能够挂载到你要调试的地位了。
但子节点有两种情形,一种情形是子节点运转的那部分程序运转在集群中其他的盘算机下面;另外一种情形是都在本机运转。第一种情形较简单办理,只需在程序运转后,停息子节点运转的那部分程序(在子节点就不成以用getchar()了,我用sleep()函数来办理这个成绩),ssh上往子节点盘算机下面,在子节点下面psCa查历程信息gdbmp1234挂载出来调试,不外要确保子节点下面也安装了GDB。第二种情形,由于在本机运转下面开了多个你本人程序的历程,如许会同时呈现3个myprogram,固然pid各不不异,不外程序名完整一样,占用内存不是有内存保守也几近一样,个中一个是主节点的历程,别的几个是子节点的历程,如许要晓得哪一个历程是子节点部分的,就要在子节点部分猎取所对应的历程的pid,很复杂,只需在代码中到场:
#include<sys/types.h>
#include<unistd.h>
//…
intpid;
pid=getpid();
printf(“
%d
”,pid);
//…
如许就能够依据猎取的pid信息来断定要挂载到哪一个历程内里
</p>
但不会命令而成为高手也是不可能的.这就好比学英语,什么语法都不懂,只捧着单词手册背单词是学不会英语的,但是没有单词词汇量英语水平也提不高的。 |
|