It seems to me that this is a bug in the Fortran MPI-2.2 binding.  I always get confused by Fortran characters so I'll recast this as a 2D integer array.  If the interface is:<div><br></div><div>   interface</div><div>
      subroutine foo(count, A)</div><div>         integer :: count, A(count,*)</div><div>      end subroutine</div><div>   end interface</div><div><br></div><div>This is legal Fortran but the callee doesn't know the length of the array.  To process the array you need both dimensions.  I believe the same hold if the type of A is a character.  So I believe MPI needs both dimensions so that the character array dummy is explicit shape, not implicit size.</div>
<div><br></div><div>-craig</div><div><br><div class="gmail_quote">On Tue, May 25, 2010 at 8:26 AM, Jeff Squyres <span dir="ltr"><<a href="mailto:jsquyres@cisco.com">jsquyres@cisco.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
A user recently reported to me a problem with the 2D character array in MPI_COMM_SPAWN_MULTIPLE in Open MPI.  Can you Fortran experts help me in what is supposed to happen?<br>
<br>
The MPI-2.2 binding for MPI_COMM_SPAWN_MULTIPLE in Fortran is as follows:<br>
<br>
MPI_COMM_SPAWN_MULTIPLE(COUNT, ARRAY_OF_COMMANDS, ARRAY_OF_ARGV, ARRAY_OF_MAXPROCS,<br>
     ARRAY_OF_INFO, ROOT, COMM, INTERCOMM, ARRAY_OF_ERRCODES, IERROR)<br>
INTEGER COUNT, ARRAY_OF_INFO(*), ARRAY_OF_MAXPROCS(*), ROOT, COMM, INTERCOMM, ARRAY_OF_ERRCODES(*), IERROR<br>
CHARACTER*(*) ARRAY_OF_COMMANDS(*), ARRAY_OF_ARGV(COUNT, *)<br>
<br>
The ARRAY_OF_ARGV is the problem.<br>
<br>
Notice that the user has to pass COUNT as the first INTEGER argument; so the MPI implementation knows the first dimension size of ARRAY_OF_ARGV.  The compiler passes the string length as an implicit last argument (or, at last the compilers do that we support in Open MPI).  Take the following simplified/non-MPI example:<br>

<br>
      program my_main<br>
      implicit none<br>
      character*20 argvs(2, 3)<br>
<br>
      argvs(1, 1) = '1 2 3 4'<br>
      argvs(1, 2) = 'hello'<br>
      argvs(1, 3) = 'helloagain'<br>
<br>
      argvs(2, 1) = '4 5 6 7'<br>
      argvs(2, 2) = 'goodbye'<br>
      argvs(2, 3) = 'goodbyeagain'<br>
<br>
      call c_func(2, argvs)<br>
      end<br>
<br>
And then I have a C function like this:<br>
<br>
void c_func_backend(int *dim, char ***argvs, int string_len)<br>
{ ... }<br>
<br>
The MPI implementation needs 3 values:<br>
- length of each string (passed as string_len in this case: 20)<br>
- the first dimension size (passed as *dim in this case -- just like in MPI_COMM_SPAWN_MULTIPLE: 2)<br>
- the second dimension size<br>
<br>
MPI doesn't have the 3rd value, so it has to calculate it.<br>
<br>
Open MPI, LAM/MPI, and MPICH1/2 all calculate this value by doing something similar to the following:<br>
<br>
  tmp = malloc(string_len + 1);<br>
  fill_tmp_with_spaces_and_null_terminate_it(tmp, string_len);<br>
  for (i = 0; 1; ++i) {<br>
      if (strcmp((*argv)[0] + i * (*dim) * string_len, tmp) == 0) {<br>
          second_dim_size = i;<br>
          break;<br>
      }<br>
  }<br>
<br>
That is, they strategically look for a string_len sized string *comprised of all blanks* to denote the end of the array.<br>
<br>
This heuristic has apparently worked for years.  But it is apparently not true in at least recent versions of gfortran -- recent gfortran does not seem to guarantee that the (1st_dim * 2nd_dim + 1)th entry is all blanks to denote the end of the array.<br>

<br>
Craig Rasmussen is sitting next to me -- he doesn't think that this behavior is guaranteed by the Fortran spec.<br>
<br>
My question to you: what is the Right way for an MPI implementation to know how to find the end of the ARRAY_OF_ARGVS array?  Or is the MPI-2 binding for MPI_COMM_SPAWN_MULTIPLE incorrect?<br>
<br>
Thanks!<br>
<br>
--<br>
Jeff Squyres<br>
<a href="mailto:jsquyres@cisco.com">jsquyres@cisco.com</a><br>
For corporate legal information go to:<br>
<a href="http://www.cisco.com/web/about/doing_business/legal/cri/" target="_blank">http://www.cisco.com/web/about/doing_business/legal/cri/</a><br>
<br>
<br>
_______________________________________________<br>
mpi3-fortran mailing list<br>
<a href="mailto:mpi3-fortran@lists.mpi-forum.org">mpi3-fortran@lists.mpi-forum.org</a><br>
<a href="http://lists.mpi-forum.org/mailman/listinfo.cgi/mpi3-fortran" target="_blank">http://lists.mpi-forum.org/mailman/listinfo.cgi/mpi3-fortran</a><br>
</blockquote></div><br></div>