Hello,

MPI_File_read/write functions uses  an integer to specify the size of
the buffer, for instance:
int MPI_File_read(MPI_File fh, void *buf, int count, MPI_Datatype
datatype, MPI_Status *status)
with:
count     Number of elements in buffer (integer).
datatype  Data type of each buffer element (handle).

However, using the maximum value of 32 bytes integers:
count = 2^31-1 = 2147483647 (and datatype = MPI_BYTE)
MPI_file_read only reads  2^31-2^12 = 2147479552 bytes.
This means that 4095 bytes are ignored.

I am not aware of this specific limit for integers in (Open) MPI
function calls. Is this supposed to be correct?

MPI_File_read/write does not return an error (but MPI_Get_count states
that only 2147479552 bytes are considered). Find attached a C++ code
example which tries to write and read 2^31-1 bytes.

I am using Open MPI 1.4.2 compiled with the Intel compiler.

Best regards,
German
#include <fstream>
#include <iostream>
#include <iomanip>
#include <math.h>
#ifndef NO_MPI 
#include <mpi.h>
#endif
#include <limits>

using namespace std;

int main( int nargs, char *args[] )
{
  int mpi_rank, mpi_size;
#ifndef NO_MPI
  MPI_Init( &nargs, &args );
  MPI_Comm_rank( MPI_COMM_WORLD, &mpi_rank );
  MPI_Comm_size( MPI_COMM_WORLD, &mpi_size );
#else
  mpi_rank = 0;
  mpi_size = 1;
#endif

  int  nbuf =  std::numeric_limits<int>::max();

  if ( nargs < 2 ){
    if ( mpi_rank == 0 ){
      cerr<<"usage:\n"
	  <<"------\n"
	  <<args[0]<<" filename"<<endl
	  <<"description:\n"
	  <<"------------\n"
	  <<"write 2 x "<<nbuf<<" bytes to file\n"
	  <<"read  1 x "<<nbuf<<" bytes from file\n";
    }
#ifndef NO_MPI
    MPI_Finalize();
#endif
    return 0;
  }

  // filename ---------
  char *sfile = args[1];

#ifndef NO_MPI
  int error, count;
  MPI_File fp;
  MPI_Status stat;
  MPI_Offset fpos;

  if ( mpi_rank == 0 ){
    // allocate buffer
    char *buf  = new char[nbuf];

    // open for write
    error = MPI_File_open( MPI_COMM_SELF, sfile, MPI_MODE_WRONLY | MPI_MODE_CREATE,
			   MPI_INFO_NULL, &fp );
    if( error != MPI_SUCCESS ) {
      cerr<<"error: MPI_File_open for file "<<sfile
	  <<" in mode write|create returns code "<<error<<endl;
      MPI_Abort( MPI_COMM_WORLD, 1 );
    }
    MPI_File_set_size( fp, 0 );

    // write (initial) 
    cout<<"write "<<nbuf<<" bytes"<<endl;
    error = MPI_File_write( fp, buf, nbuf, MPI_BYTE, &stat );
    MPI_Get_count( &stat, MPI_BYTE, &count );
    cout<<"MPI_File_write returns code: "<<error<<" count: "<<count<<endl;

    // write (add)
    fpos = (MPI_Offset) count;
    cout<<"write: add "<<nbuf<<" bytes at file position "<<count<<endl;
    error = MPI_File_write_at( fp, fpos, buf, nbuf, MPI_BYTE, &stat );
    MPI_Get_count( &stat, MPI_BYTE, &count );
    cout<<"MPI_File_write returns code: "<<error<<" count: "<<count<<endl;

    // close
    MPI_File_close( &fp );

    // open for read
    error = MPI_File_open( MPI_COMM_SELF, sfile, MPI_MODE_RDONLY,
			   MPI_INFO_NULL, &fp );
    if( error != MPI_SUCCESS ) {
      cerr<<"error: MPI_File_open for file "<<sfile 
	  <<" in mode read returns code "<<error<<endl;
      MPI_Abort( MPI_COMM_WORLD, 1 );
    }

    // read 
    cout<<"read "<<nbuf<<" bytes"<<endl;
    error = MPI_File_read( fp, buf, nbuf, MPI_BYTE, &stat );
    MPI_Get_count( &stat, MPI_BYTE, &count );
    cout<<"MPI_File_read returns code: "<<error<<" count: "<<count<<endl;

    // close
    MPI_File_close( &fp );
    delete[] buf;
  }

  MPI_Barrier( MPI_COMM_WORLD );
  MPI_Finalize();
#else
  size_t count;
  FILE *fp = fopen( sfile, "w" );
  if ( !fp ){
    cerr<<"error: could not open "<<sfile<<" in write mode\n";
    return 1;
  }

  // allocate buffer
  char *buf  = new char[nbuf];

  cout<<"write "<<nbuf<<" bytes"<<endl;
  count = fwrite( buf, 1, nbuf, fp );
  cout<<"fwrite returns count: "<<count<<endl;

  cout<<"write: add "<<nbuf<<" bytes"<<endl;
  count = fwrite( buf, 1, nbuf, fp );
  cout<<"fwrite returns "<<count<<endl;

  fclose( fp );

  fp = fopen( sfile, "r" );
  if ( !fp ){
    cerr<<"error: could not open "<<sfile<<" in read mode\n";
    return 1;
  }

  cout<<"read "<<nbuf<<" bytes"<<endl;
  count = fread( buf, 1, nbuf, fp );
  cout<<"read returns "<<count<<endl;

  fclose( fp );
  delete[] buf;
#endif

  return 0;
}

Reply via email to