On Sat, Jun 25, 2011 at 06:54:32AM -0400, Jeff Squyres wrote:

> Rob -- can you comment on this, perchance?  Is this a bug in ROMIO, or if 
> not, how is one supposed to use this interface can get consistent answers in 
> all MPI processes?

Maybe the problem here is that shared file pointers were intended for
things like reading from a work queue or writing to a log file.

Determining the file size or the position of the file pointer is a
little racy, since some other process can sneak in and change things
(getting the shared file pointer is independent but setting it is
collective)

When writing a log file or reading from a work queue the exact value
of the shared file pointer is actually irrelevant.  The program just
wants "the next" item, or "the last" item. 

The more robust way to do this file size determination, if that's
really what you want,  is to have rank
0 do the work and broadcast the result to everyone else. 

==rob

> 
> 
> On Jun 23, 2011, at 10:04 AM, Christian Anonymous wrote:
> 
> > I'm having some issues with MPI_File_seek_shared. Consider the following 
> > small test C++ program
> > 
> > 
> > #include <iostream>
> > #include <mpi.h>
> > 
> > 
> > #define PATH "simdata.bin"
> > 
> > using namespace std;
> > 
> > int ThisTask;
> > 
> > int main(int argc, char *argv[])
> > {
> > MPI_Init(&argc,&argv); /* Initialize MPI */
> > MPI_Comm_rank(MPI_COMM_WORLD,&ThisTask);
> > 
> > MPI_File fh;
> > int success;
> > MPI_File_open(MPI_COMM_WORLD,(char *) 
> > PATH,MPI_MODE_RDONLY,MPI_INFO_NULL,&fh);
> > 
> > if(success != MPI_SUCCESS){ //Successfull open?
> > char err[256];
> > int err_length, err_class;
> > 
> > MPI_Error_class(success,&err_class);
> > MPI_Error_string(err_class,err,&err_length);
> > cout << "Task " << ThisTask << ": " << err << endl;
> > MPI_Error_string(success,err,&err_length);
> > cout << "Task " << ThisTask << ": " << err << endl;
> > 
> > MPI_Abort(MPI_COMM_WORLD,success);
> > }
> > 
> > 
> > /* START SEEK TEST */
> > MPI_Offset cur_filepos, eof_filepos;
> > 
> > MPI_File_get_position_shared(fh,&cur_filepos);
> > 
> > //MPI_Barrier(MPI_COMM_WORLD);
> > MPI_File_seek_shared(fh,0,MPI_SEEK_END); /* Seek is collective */
> > 
> > MPI_File_get_position_shared(fh,&eof_filepos);
> > 
> > //MPI_Barrier(MPI_COMM_WORLD);
> > MPI_File_seek_shared(fh,0,MPI_SEEK_SET);
> > 
> > cout << "Task " << ThisTask << " reports a filesize of " << eof_filepos << 
> > "-" << cur_filepos << "=" << eof_filepos-cur_filepos << endl;
> > /* END SEEK TEST */
> > 
> > /* Finalizing */    
> > MPI_File_close(&fh);
> > MPI_Finalize();
> > return 0;
> > }
> > 
> > Note the comments before each MPI_Barrier. When the program is run by 
> > mpirun -np N (N strictly greater than 1), task 0 reports the correct 
> > filesize, while every other process reports either 0, minus the filesize or 
> > the correct filesize. Uncommenting the MPI_Barrier makes each process 
> > report the correct filesize. Is this working as intended? Since 
> > MPI_File_seek_shared is a collective, blocking function each process have 
> > to synchronise at the return point of the function, but not when the 
> > function is called. It seems that the use of MPI_File_seek_shared without 
> > an MPI_Barrier call first is very dangerous, or am I missing something?
> > 
> > _______________________________________________________________
> > Care2 makes it easy for everyone to live a healthy, green lifestyle and 
> > impact the causes you care about most. Over 12 Million members! 
> > http://www.care2.com Feed a child by searching the web! Learn how 
> > http://www.care2.com/toolbar_______________________________________________
> > users mailing list
> > us...@open-mpi.org
> > http://www.open-mpi.org/mailman/listinfo.cgi/users
> > 
> 
> 

-- 
Rob Latham
Mathematics and Computer Science Division
Argonne National Lab, IL USA

Reply via email to