Dear Jeff, following the failure I just reported I changed the CC=icc to CC=cc and reran and got this:
fred@prandtl:~/test/fortran-c-2d-char> make CC=cc FC=ifort cc -g -c -o c_func.o c_func.c ifort -g main.o c_func.o -g -o main fred@prandtl:~/test/fortran-c-2d-char> ./main Got leading dimension: 2 Got string len: 14 Found string: 1 2 3 4 Found string: 4 5 6 7 Found string: hello Found string: goodbye Found string: helloagain Found string: goodbyeagain End of the array -- found 6 entries Fred Marquis. On Fri, May 07, 2010 at 10:49:40PM +0100, Jeff Squyres wrote: > Yoinks; I missed that -- sorry! > > Here's a simple tarball; can you try this with your compiler? Just untar it > and > > make CC=icc FC=ifort > ./main > > Do you see only 6 entries in the array? > > (I have icc 9.0, but I'm now running RHEL 5.4, and the gcc version with it is > too new for icc 9.0 -- so I can't run it) > > > On May 7, 2010, at 5:44 PM, Andrew J Marquis wrote: > > > Dear Jeff, > > > > am afraid not, as I said in my original post I am using the Intel ifort > > compiler version 9.0, i.e. > > > > fred@prandtl:~> mpif77 -V > > > > Intel(R) Fortran Compiler for Intel(R) EM64T-based applications, Version > > 9.0 Build 20060222 Package ID: <installpackageid> > > Copyright (C) 1985-2006 Intel Corporation. All rights reserved. > > FOR NON-COMMERCIAL USE ONLY > > > > > > I have been looking at this myself and have noted a couple of things, some > > of these need cross-checking (I am using different computers and different > > setups and different compilers and different openmpi releases !!!!!!) but > > my thoughts at the moment are (point number (4) is possibly the most > > important so far): > > > > 1) If I allocate the string array using an allocate statement then I see > > that ALL of the string locations are initialised to "\0" (character 0). > > > > 2) If I set part of a location in the string array then all the OTHER > > characters in the same location are set to " " (character 32). > > > > 3) If the character array is defined via a dimension statement then the > > locations in the array seem to be initialised at random. > > > > 4) Looking at the output from my test program I noticed and odd pattern in > > the arguments being sent to the slaves (yes I do need to quantify this > > better !!). However this caused me to look at the ompi source, in > > particular I am looking at: > > > > openmpi-1.4.1/ompi/mpi/f77/base/strings.c > > > > In particular at the bottom (line 156( in function > > "ompi_fortran_multiple_argvs_f2c" at the end of the for statement there is > > the line: > > > > current_array += len * i; > > > > The "* i" looks wrong to me I am thinking it should just be: > > > > current_array += len; > > > > making this change improves things BUT like you suggest in your email there > > seems to be a problem locating the end of the 2d-array elements. > > > > > > > > I will try and look at this more over the w/e. > > > > Fred Marquis. > > > > > > On Fri, May 07, 2010 at 10:02:48PM +0100, Jeff Squyres wrote: > > > 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/ > > > > > > > > > _______________________________________________ > > > users mailing list > > > us...@open-mpi.org > > > http://www.open-mpi.org/mailman/listinfo.cgi/users > > > > -- > > ---------------------------------------------------------- > > Dr. A.J. Marquis Tel: +44 (0)20 7594 7040 > > Dept. of Mech. Eng. Fax: +44 (0)20 7594 1472 > > Imperial College > > Exhibition Road E-Mail: a.marq...@imperial.ac.uk > > London SW7 2AZ > > > > BOFH: Maintence window broken > > > > All views expressed are my own ! > > ---------------------------------------------------------- > > _______________________________________________ > > 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/ > _______________________________________________ > users mailing list > us...@open-mpi.org > http://www.open-mpi.org/mailman/listinfo.cgi/users -- ---------------------------------------------------------- Dr. A.J. Marquis Tel: +44 (0)20 7594 7040 Dept. of Mech. Eng. Fax: +44 (0)20 7594 1472 Imperial College Exhibition Road E-Mail: a.marq...@imperial.ac.uk London SW7 2AZ BOFH: Maintence window broken All views expressed are my own ! ----------------------------------------------------------