计算化学公社

标题: 同一个程序在本地和集群运行结果不同 [打印本页]

作者
Author:
wxhwbh    时间: 2020-6-25 19:50
标题: 同一个程序在本地和集群运行结果不同
一个MPI fortran测试程序如下:
  1. program rrr
  2.         use mpi
  3.         implicit real*8(a-h,o-z)
  4.         integer :: world_size, world_rank, mpi_ierr

  5.         call mpi_init(mpi_ierr)
  6.         call mpi_comm_size(mpi_comm_world, world_size, mpi_ierr)
  7.         call mpi_comm_rank(mpi_comm_world, world_rank, mpi_ierr)

  8.         if(world_rank==0)then
  9.                 write(*,*) "input d"
  10.                 read(*,*) d
  11.                 do i=1,world_size-1
  12.                         call mpi_send(d, 1, mpi_double, i, i, mpi_comm_world, mpi_ierr)
  13.                 end do
  14.         end if
  15.         call mpi_barrier(mpi_comm_world,mpi_ierr)
  16.         if(world_rank/=0)then
  17.                 call mpi_recv(d, 1, mpi_double, 0, world_rank, mpi_comm_world, status, mpi_ierr)
  18.         end if

  19.         write(*,*) "d=",d, "id=", world_rank

  20.         call mpi_finalize(mpi_ierr)



  21. end program
复制代码
在我本地的CentOS 7上运行没有任何问题:
  1. [root@localhost:~/wbh/test/mpi#]mpiifort read.f90
  2. [root@localhost:~/wbh/test/mpi#]mpirun -np 4 ./a.out
  3. input d
  4. 4
  5. d=   4.00000000000000      id=           0
  6. d=   4.00000000000000      id=           1
  7. d=   4.00000000000000      id=           2
  8. d=   4.00000000000000      id=           3
复制代码
但是移到集群上编译运行会报错:
  1. [wbh@cu10 mpi]$ mpiifort read.f90
  2. [wbh@cu10 mpi]$ mpirun -np 4 ./a.out
  3. input d
  4. input d
  5. forrtl: severe (24): end-of-file during read, unit -4, file /proc/12535/fd/0
  6. Image              PC                Routine            Line        Source            
  7. a.out              0000000000426BF4  Unknown               Unknown  Unknown
  8. a.out              0000000000407AD0  Unknown               Unknown  Unknown
  9. a.out              0000000000402A27  Unknown               Unknown  Unknown
  10. a.out              000000000040291E  Unknown               Unknown  Unknown
  11. libc.so.6          0000003FEA821B45  Unknown               Unknown  Unknown
  12. a.out              0000000000402819  Unknown               Unknown  Unknown
  13. -------------------------------------------------------
  14. Primary job  terminated normally, but 1 process returned
  15. a non-zero exit code.. Per user-direction, the job has been aborted.
  16. -------------------------------------------------------
  17. forrtl: severe (24): end-of-file during read, unit -4, file /proc/12534/fd/0
  18. Image              PC                Routine            Line        Source            
  19. a.out              0000000000426BF4  Unknown               Unknown  Unknown
  20. a.out              0000000000407AD0  Unknown               Unknown  Unknown
  21. a.out              0000000000402A27  Unknown               Unknown  Unknown
  22. a.out              000000000040291E  Unknown               Unknown  Unknown
  23. libc.so.6          0000003FEA821B45  Unknown               Unknown  Unknown
  24. a.out              0000000000402819  Unknown               Unknown  Unknown
  25. --------------------------------------------------------------------------
  26. mpirun detected that one or more processes exited with non-zero status, thus causing
  27. the job to be terminated. The first process to do so was:

  28.   Process name: [[19269,1],1]
  29.   Exit code:    24
  30. --------------------------------------------------------------------------

复制代码
而且没有看懂也没有搜到这个报错是什么意思。这个要怎么解决呢? 我其实有怀疑是编译器版本不同,但版本不至于导致程序跑不起来吧?(集群上的是ifort 15.0.3)

作者
Author:
hebrewsnabla    时间: 2020-6-25 20:53
本帖最后由 hebrewsnabla 于 2020-6-25 20:55 编辑

在集群上运行 which mpirun 看看,是否和which mpiifort的结果在同一个路径

作者
Author:
wxhwbh    时间: 2020-6-25 21:50
hebrewsnabla 发表于 2020-6-25 20:53
在集群上运行 which mpirun 看看,是否和which mpiifort的结果在同一个路径

还真的不在一个路径:
  1. [wbh@mu01 ~]$ which mpirun
  2. ~/soft/openmpi216/bin/mpirun
  3. [wbh@mu01 ~]$ which mpiifort
  4. /opt/intel/impi/5.0.3.048/intel64/bin/mpiifort
复制代码

mpirun 对应的openmpi是我装ORCA时装的。重新连接到intel的mpirun就没问题了。谢谢你的提醒。
不过这样可能ORCA又跑不了了...
作者
Author:
hebrewsnabla    时间: 2020-6-25 22:01
wxhwbh 发表于 2020-6-25 21:50
还真的不在一个路径:

mpirun 对应的openmpi是我装ORCA时装的。重新连接到intel的mpirun就没问题了。 ...

并存肯定是不行的。只能把一个写在bashrc里,另一个每次提交时用脚本激活 -- 看哪个常用了
作者
Author:
abin    时间: 2020-6-25 22:20
hebrewsnabla 发表于 2020-6-25 22:01
并存肯定是不行的。只能把一个写在bashrc里,另一个每次提交时用脚本激活 -- 看哪个常用了

可并存,毫无影响。
作者
Author:
hebrewsnabla    时间: 2020-6-25 22:30
abin 发表于 2020-6-25 22:20
可并存,毫无影响。

讨教一下怎么并存
两个mpirun同名,怎么控制调用某一个呢
作者
Author:
abin    时间: 2020-6-25 22:52
hebrewsnabla 发表于 2020-6-25 22:30
讨教一下怎么并存
两个mpirun同名,怎么控制调用某一个呢

module
Environment module
其他google
作者
Author:
hebrewsnabla    时间: 2020-6-25 22:57
abin 发表于 2020-6-25 22:52
module
Environment module
其他google

啊这样当然可以相当于动态修改环境变量了。 我指的是没有附加操作情形下的并存。
作者
Author:
pwzhou    时间: 2020-6-26 11:04
hebrewsnabla 发表于 2020-6-25 22:57
啊这样当然可以相当于动态修改环境变量了。 我指的是没有附加操作情形下的并存。

不用module的话就不要把环境变量写在~/.bashrc里面,而是封装在一个简单的脚本里面,用哪个程序调用对应的脚本即可。或者一个写在~/.bashrc里面,一个写在脚本里面。除此之外似乎没有别的办法。要不然就每次直接按绝对路径调用。
作者
Author:
hebrewsnabla    时间: 2020-6-26 12:55
pwzhou 发表于 2020-6-26 11:04
不用module的话就不要把环境变量写在~/.bashrc里面,而是封装在一个简单的脚本里面,用哪个程序调用对应 ...

是的,我在4L说的就是这个意思。

对于mpi,绝对路径是不行的,因为一些库文件也有同名的。




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3