Greetings Fred.

After looking at this for more hours than I'd care to admit, I'm wondering if 
this is a bug in gfortran.  I can replicate your problem with a simple program 
on gfortran 4.1 on RHEL 5.4, but it doesn't happen with the Intel Fortran 
compiler (11.1) or the PGI fortran compiler (10.0).

One of the issues appears how to determine how Fortran 2d CHARACTER arrays are 
terminated.  I can't figure out how gfortran is terminating them -- but intel 
and PGI both terminate them by having an empty string at the end.

Are you using gfortran 4.1, perchance?




On May 5, 2010, at 2:08 PM, Fred Marquis wrote:

> Hi,
> 
>   I am using mpi_comm_spawn_multiple to spawn multiple commands with argument 
> lists. I am trying to do this in fortran (77) using version openmpi-1.4.1 and 
> the ifort compiler v9.0. The operating system is SuSE Linux 10.1 (x86-64).
> 
> I have put together a simple controlling example program (test_pbload.F) and 
> an example slave program (spray.F) to try and explain my problem.
> 
> In the controlling program mpi_comm_spawn_multiple is used to set 2 copies of 
> the slave running. The first is started with the argument list "1 2 3 4" and 
> the second with "5 6 7 8".
> 
> The slaves are started OK and the slaves print out the argument lists and 
> exit. In addition the slaves print out their rank numbers so I can see which 
> argument list belongs to which slave.
> 
> What I am finding is that the argument lists are not being sent to the slaves 
> correctly, indeed both slaves seem to be getting both arguments lists !!!
> 
> To compile and run the programs I follow the steps below.
> 
> Controlling program "test_pbload.F"
> 
>    mpif77 -o test_pbload test_pbload.F
> 
> Slave program "spray.F"
> 
>    mpif77 -o spray spray.F
> 
> Run the controller
> 
>    mpirun -np 1 test_pbload
> 
> 
> 
> 
> The output of which is from the first slave:
> 
>  nsize, mytid: iargs           2           0 :           2
>  spray:   0 1:1 2 3 4   < FIRST ARGUMENT          
>  spray:   0 2:4 5 6 7   < SECOND ARGUMENT            
> 
>  and the second slave:
> 
>  nsize, mytid: iargs           2           1 :           2
>  spray:   1 1:1 2 3 4   < FIRST ARGUMENT            
>  spray:   1 2:4 5 6 7   < SECOND ARGUMENT 
> 
> In each case the arguments (2 in both cases) are the same.
> 
> I have written a C version of the controlling program and everthing works as 
> expected so I presume that I have either got the specification of the 
> argument list wrong or I have discovered an error/bug. At the moment I 
> working on the former -- but am at a loss to see what is wrong !!
> 
> Any help, pointers etc really appreciated.
> 
> 
> Controlling program (that uses MPI_COMM_SPAWN_MULTIPLE) test_pbload.F
> 
>       program main
> c
>       implicit none
> #include "mpif.h"
> 
>       integer error
>       integer intercomm
>       CHARACTER*25 commands(2), argvs(2, 2)
>       integer nprocs(2),info(2),ncpus
> c
>       call mpi_init(error)
> c
>        ncpus = 2
> c
>        commands(1) = ' ./spray '
>        nprocs(1) = 1
>        info(1) = MPI_INFO_NULL
>        argvs(1, 1) = ' 1 2 3 4 '
>        argvs(1, 2) = ' '
> c
>        commands(2) = ' ./spray '
>        nprocs(2) = 1
>        info(2) = MPI_INFO_NULL
>        argvs(2, 1) = ' 4 5 6 7 '
>        argvs(2, 2) = ' '
> c
>       call mpi_comm_spawn_multiple( ncpus,
>      1      commands, argvs, nprocs, info,
>      2      0, MPI_COMM_WORLD, intercomm,
>      3      MPI_ERRCODES_IGNORE, error )
> c
>       call mpi_finalize(error)
> c
>       end
> 
> Slave program (started by the controlling program) spray.F
> 
>       program main
>       integer error
>       integer pid
>       character*20 line(100)
>       call mpi_init(error)
> c
>       CALL MPI_COMM_SIZE(MPI_COMM_WORLD,NSIZE,error)
>       CALL MPI_COMM_RANK(MPI_COMM_WORLD,MYTID,error)
> c
>       iargs=iargc()
>       write(*,*) 'nsize, mytid: iargs', nsize, mytid, ":", iargs
> c
>       if( iargs.gt.0 ) then
>          do i = 1, iargs
>             call getarg(i,line(i))
>             write(*,'(1x,a,i3,20(i2,1h:,a))')
>      1       'spray: ',mytid,i,line(i)
>          enddo
>       endif
> c
>       call mpi_finalize(error)
> c
>       end
> 
> _______________________________________________
> users mailing list
> us...@open-mpi.org
> http://www.open-mpi.org/mailman/listinfo.cgi/users
> 


-- 
Jeff Squyres
jsquy...@cisco.com
For corporate legal information go to:
http://www.cisco.com/web/about/doing_business/legal/cri/


Reply via email to