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/
fortran-c-2d-char.tar.bz2
Description: BZip2 compressed data