1. <acronym id='2met7'><em id='2met7'></em><td id='2met7'><div id='2met7'></div></td></acronym><address id='2met7'><big id='2met7'><big id='2met7'></big><legend id='2met7'></legend></big></address>
      <ins id='2met7'></ins>
        <i id='2met7'></i>
        <i id='2met7'><div id='2met7'><ins id='2met7'></ins></div></i>

        <code id='2met7'><strong id='2met7'></strong></code>
        <dl id='2met7'></dl>

        <span id='2met7'></span>
          1. <tr id='2met7'><strong id='2met7'></strong><small id='2met7'></small><button id='2met7'></button><li id='2met7'><noscript id='2met7'><big id='2met7'></big><dt id='2met7'></dt></noscript></li></tr><ol id='2met7'><table id='2met7'><blockquote id='2met7'><tbody id='2met7'></tbody></blockquote></table></ol><u id='2met7'></u><kbd id='2met7'><kbd id='2met7'></kbd></kbd>
            <fieldset id='2met7'></fieldset>
          2. 用gdb调试mpi程序的一些心得

            • 时间:
            • 浏览:7
            • 来源:124软件资讯网

              Linux下MPI (Message Passage Interface) 的法式不太好调试  ,在windows下vs2005以上的IDE有集成的轻便MPI调试工具 ,没有用过  ,有兴趣的可以试验一下  。下面总结了一些最近在用MPI和c语言写法式时的调试履历(Ubuntu情况 ,c语言, mpich 1.2.7)  。

              需要注重的几个小问题

              在编译法式的时间 –g 是一定要加的 ,否则在gdb调试的时间可能会报类似“source is not available”的错误 。最先我调法式的时间我都把我的法式的每个调试版本 ,划分发送到集群中的每台机械上面 ,然后在mpirun –machinefile host –np 3 myprogram 运行我的法式  ,这种要领没有用率  ,只能在最后记载实验效果的时间或者最后调试阶段才气用 。有用率的方式是 mpirun –np 3 myprogram 在本机直接运行法式  ,这样mpi就会在本机开3个myprogram的历程 ,这样不接网线都可以利便的调试mpi的法式  。这是几个小问题  ,下面切入要害部门  。

              用gdb来调试mpi的法式

              首先 ,本文所用的mpich版本为1.2.7  ,可能跟其他版本有一定的差异  ,RTFM  ,看看自己所用版本的使用手册来解决版本上的差异  。

              Mpi法式运行的时间都是通过mpirun 后接参数和你的法式  ,gdb也是类似的历程  ,以是你不行以直接 gdb mpirun –np 3 myprogram  ,但你可以直接mpirun –gdb –np 3 myprogram 。这样你就可以再gdb中调试你的法式了 。

              不外 ,这样有个问题  ,你可以调试在主节点运行的部门  ,也就是相对于集群而言  ,你本机所运行的部门  ,法式运行到子各个节点部门以后  ,你的gdb就不能继续调下去了  ,这个就是个问题  。Gdb实在可以在法式已经执行了以后 ,再挂载你的法式  ,这样你可以在法式执行的时代把gdb挂载进来  。简而言之就是把法式暂停起来(好比读个键盘输入getchar()之类的) ,用gdb myprogram pid (myprogram是你法式的历程名  , pid是你法式历程的pid号)怎样检察pid号呢  ? 在终端内里运行 ps –a 就可以了 ,这样就可以找到你自己法式的历程名和PID号  ,gdb myprogram 1234 这样就可以挂载到你要调试的位置了 。

              但子节点有两种情形  ,一种情形是子节点运行的那部门法式运行在集群中其他的盘算机上面;另一种情形是都在本机运行 。第一种情形较容易解决  ,只要在法式运行后  ,暂停子节点运行的那部门法式(在子节点就不行以用getchar()了  ,我用sleep()函数来解决这个问题) ,ssh上去子节点盘算机上面  ,在子节点上面ps –a查历程信息 gdb mp 1234 挂载进去调试  ,不外要确保子节点上面也安装了GDB  。第二种情形  ,由于在本机运行上面开了多个你自己法式的历程 ,这样会同时泛起 3个myprogram ,虽然pid各不相同  ,不外法式名完全一样 ,占用内存不是有内存泄露也险些一样  ,其中一个是主节点的历程 ,另外几个是子节点的历程  ,这样要知道哪个历程是子节点部门的 ,就要在子节点部门获取所对应的历程的pid ,很简朴  ,只要在代码中加入:

              #include

              #include

              //…

              int pid;

              pid = getpid();

              printf ( “\n%d\n”, pid );

              //…

              这样就可以凭据获取的pid信息来确定要挂载到哪个历程内里