[MPICH] MPI-IO, vector dataype

Russell L. Carter rcarter at esturion.net
Thu May 3 13:04:22 CDT 2007


Ok,
Made the change, same output.  Looking at the written file with od -i,
and inserting blank lines at block boundaries:

rcarter at feyerabend [344] od -i testfile
0000000           0           1           2           3
0000020           4           5           6           7

0000040           0           2           4           6
0000060           8          10          12          14
 >----------------\
0000100          16          18          20          22
0000120          24          26          28          30

0000140          32          34          36          38
0000160          40          42          44          46

0000200          48          50          52          54
0000220          56          58          60          62
0000240

Given (just the relevant code snippets)
    nprocs = 2, FILESIZE = 256,  INTS_PER_BLK = 4,
    bufsize(FILESIZE/nprocs), nints(bufsize/sizeof(int)),

   filetype.Create_vector(nints/INTS_PER_BLK, INTS_PER_BLK,
                          INTS_PER_BLK * nprocs);

   which works out to  Create_vector(4, 8, 16)  (intrinsic type MPI_INT)

   f.Set_view(INTS_PER_BLK*sizeof(int)*myrank, MPI_INT,
                    filetype, "native", MPI_INFO_NULL);

   which works out to Set_view(32 or 0 bytes, ...)

   f.Write(obuf, nints, MPI_INT, status);

Then shouldn't the number pointed to at 0000100 be 8, not 16?
It should be the first int of the second block of rank 0's data.
Each proc is writing out ints (myrank + 1)*i, so
rank 0's are sequential and rank 1's are even only.

Russell

Rajeev Thakur wrote:
> The write and read should use nints as the count instead of bufsize. (I
> don't know if that alone will solve the problem.)
> 
> Rajeev 
> 
>> -----Original Message-----
>> From: owner-mpich-discuss at mcs.anl.gov 
>> [mailto:owner-mpich-discuss at mcs.anl.gov] On Behalf Of Russell 
>> L. Carter
>> Sent: Wednesday, May 02, 2007 5:21 PM
>> To: mpich-discuss at mcs.anl.gov
>> Subject: [MPICH] MPI-IO, vector dataype
>>
>> Hi folks,
>> I'm having some cognition problems understanding
>> how vector datatype works with readall/writeall.
>> (I.e, I'm likely being stupid).  At any rate,
>> I've appended a short program derived from
>> the UsingMPI2/moreio/read_all.c example that
>> generates the following output.  I expected
>> that there would be no lines output beginning
>> with 'myrank, i, obuf[i]...'.  Any clues on
>> where I'm being clueless?
>>
>> Many thanks,
>> Russell
>>
>>
>>   mpiexec -n 2 /home/rcarter/mpibin/rwall
>> Starting rwall.
>> Starting rwall.
>> process 0 wrote 128process  ints1
>>   wrote 128 ints
>> process process 1 read 0128 read  ints128
>>   ints
>> myrank, i, obuf[i], ibuf[i]: 0 8 8 0
>> myrank, i, obuf[i], ibuf[i]: 0 9 9 2
>> myrank, i, obuf[i], ibuf[i]: 0 10 10 4
>> myrank, i, obuf[i], ibuf[i]: 0 11 11 6
>> myrank, i, obuf[i], ibuf[i]: 0 12 12 8
>> myrank, i, obuf[i], ibuf[i]: 0 13 13 10
>> myrank, i, obuf[i], ibuf[i]: 0 14 14 12
>> myrank, i, obuf[i], ibuf[i]: 0 15 15 14
>> myrank, i, obuf[i], ibuf[i]: 0 17 17 18
>> myrank, i, obuf[i], ibuf[i]: 0 18 18 20
>> myrank, i, obuf[i], ibuf[i]: 0 19 19 22
>> myrank, i, obuf[i], ibuf[i]: 0 20 20 24
>> myrank, i, obuf[i], ibuf[i]: 0 21 21 26
>> myrank, i, obuf[i], ibuf[i]: 0 22 22 28
>> myrank, i, obuf[i], ibuf[i]: 0 23 23 30
>> myrank, i, obuf[i], ibuf[i]: 0 24 24 32
>> myrank, i, obuf[i], ibuf[i]: 0 25 25 34
>> myrank, i, obuf[i], ibuf[i]: 0 26 26 36
>> myrank, i, obuf[i], ibuf[i]: 0 27 27 38
>> myrank, i, obuf[i], ibuf[i]: 0 28 28 40
>> myrank, i, obuf[i], ibuf[i]: 0 29 29 42
>> myrank, i, obuf[i], ibuf[i]: 0 30 30 44
>> myrank, i, obuf[i], ibuf[i]: 0 31 31 46
>> rwall end.
>> rwall end.
>>
>> Here's the program:
>>
>> #include "mpi.h"
>> #include <iostream>
>> using namespace std;
>>
>> struct tester
>> {
>>      tester()
>>          : myrank(MPI::COMM_WORLD.Get_rank()),
>>            nprocs(MPI::COMM_WORLD.Get_size()),
>>            bufsize(FILESIZE/nprocs), nints(bufsize/sizeof(int)),
>>            filetype(MPI::INT),
>>            fname("pvfs2:/mnt/pvfs/tst/testfile")
>>      {
>>          std::ios::sync_with_stdio(false);
>>          filetype.Create_vector(nints/INTS_PER_BLK, INTS_PER_BLK,
>>                                 INTS_PER_BLK * nprocs);
>>          filetype.Commit();
>>          obuf = new int[bufsize];
>>          ibuf = new int[bufsize];
>>      }
>>
>>      ~tester()
>>      {
>>          delete[] obuf;
>>          delete[] ibuf;
>>      }
>>
>>      void write()
>>      {
>>          for (int i = 0; i < nints; ++i) {
>>              obuf[i] = (myrank + 1) * i;
>>          }
>>          MPI::File f = MPI::File::Open(MPI::COMM_WORLD, fname.c_str(),
>>                                        MPI_MODE_CREATE | 
>> MPI_MODE_WRONLY,
>>                                        MPI::INFO_NULL);
>>          f.Set_view(INTS_PER_BLK*sizeof(int)*myrank, MPI_INT,
>>                     filetype, "native", MPI_INFO_NULL);
>>          f.Write(obuf, bufsize, MPI_INT, status);
>>          cerr << "process " << myrank << " wrote "
>>               << status.Get_count(MPI_INT) << " ints" << endl;
>>          f.Close();
>>      }
>>
>>      void read()
>>      {
>>          MPI::File f = MPI::File::Open(MPI::COMM_WORLD, fname.c_str(),
>>                                        MPI_MODE_RDONLY, 
>> MPI::INFO_NULL);
>>          f.Set_view(INTS_PER_BLK*sizeof(int)*myrank, MPI_INT,
>>                     filetype, "native", MPI_INFO_NULL);
>>          f.Read(ibuf, bufsize, MPI_INT, status);
>>          f.Close();
>>          cerr << "process " << myrank << " read "
>>               << status.Get_count(MPI_INT) << " ints" << endl;
>>          for (int i = 0; i < nints; ++i) {
>>              if (obuf[i] != ibuf[i]) {
>>                  cerr << "myrank, i, obuf[i], ibuf[i]: " << 
>> myrank << " "
>>                       << i << " " << obuf[i] << " " << 
>> ibuf[i] << endl;
>>              }
>>          }
>>      }
>>
>> private:
>>      static const int FILESIZE = 256,  INTS_PER_BLK = 8;
>>      int myrank, nprocs, bufsize, nints, *obuf, *ibuf;
>>      MPI::Datatype filetype;
>>      string fname;
>>      MPI::Status status;
>> };
>>
>>
>> int main()
>> {
>>      cerr << "Starting rwall.\n";
>>      try {
>>          MPI::Init();
>>          tester t;
>>          t.write();
>>          t.read();
>>          MPI::Finalize();
>>      } catch (exception &e) {
>>          cerr << "\nCaught exception: " << e.what() << endl;
>>          return -1;
>>      } catch (MPI::Exception& e) {
>>          cerr << "\nError:\n" << e.Get_error_string();
>>          return -2;
>>      }
>>      cerr << "rwall end.\n";
>>      return 0;
>> }
>>
>>
> 


-- 
Russell L. Carter
Esturion, LLC
2285 Sandia Drive
Prescott, Arizona 86301

rcarter at esturion.net
928 308-4154




More information about the mpich-discuss mailing list