[MPICH] MPI-IO, vector datatype
Rob Ross
rross at mcs.anl.gov
Thu May 3 19:33:29 CDT 2007
Hi Russell,
The "nblocks(1)" sets that variable to 1, yes? Sorry, C++ isn't my thing.
A vector with a count of 1 is the same as a contig with a count equal to
the blocksize of the vector. This would explain what you're seeing. The
stride is only used if the count is greater than 1.
Regards,
Rob
Russell L. Carter wrote:
>
>> It is easy to run on a single machine. With MPD, all you need to do is
>> % mpd &
>> % mpiexec -n 2 a.out
>
> Works great. No difference between pvfs2 and unix.
>
>> blocks of 4 ints each because you have defined INTS_PER_BLK=4.
>
> I'm guilty of a transcription error, crap. Sorry about that,
> that's a stupid waste of time. Should have been INTS_PER_BLK=8.
> With INTS_PER_BLK=4, I agree with your values but the problem
> is still there. I have found what appears to be the problem.
> The stride arg in the Create_vector method appears to be
> ignored. It doesn't matter what I set it to, 0 on up to
> nprocs*blocksize, the block data for each proc is written
> out contiguously.
>
> If I set the view displacement to be myrank*nints,
> the file always looks like this, without
> any holes, for any number of blocks and stride I set
> (nprocs is 2, neg is rank 0, pos is rank 1):
>
> 0000000 0 -1 -2 -3
> 0000020 -4 -5 -6 -7
> 0000040 -8 -9 -10 -11
> 0000060 -12 -13 -14 -15
> 0000100 -16 -17 -18 -19
> 0000120 -20 -21 -22 -23
> 0000140 -24 -25 -26 -27
> 0000160 -28 -29 -30 -31
> 0000200 0 1 2 3
> 0000220 4 5 6 7
> 0000240 8 9 10 11
> 0000260 12 13 14 15
> 0000300 16 17 18 19
> 0000320 20 21 22 23
> 0000340 24 25 26 27
> 0000360 28 29 30 31
>
>
> If I set the view displacements to
> blocksize*sizeof(int)*myrank, the file looks like this,
> for any stride (nblocks/proc is 2 here):
>
> 0000000 0 -1 -2 -3
> 0000020 -4 -5 -6 -7
> 0000040 -8 -9 -10 -11
> 0000060 -12 -13 -14 -15
> 0000100 0 1 2 3
> 0000120 4 5 6 7
> 0000140 8 9 10 11
> 0000160 12 13 14 15
> 0000200 16 17 18 19
> 0000220 20 21 22 23
> 0000240 24 25 26 27
> 0000260 28 29 30 31
>
> The further reduced code is appended. As far as I can tell
> it should produce identical datatypes and views as the program
> on p. 65 of Using MPI-2. It was my impression that that
> program was intended to read interleaved data, maybe it's
> not?
>
> Thanks,
> Russell
>
> #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)),
> nblocks(1), blocksize(nints/nblocks),
> filetype(MPI::INT),
> //fname("pvfs2:/mnt/pvfs/tst/testfile")
> fname("/home/rcarter/mpibin/testfile")
> {
> std::ios::sync_with_stdio(false);
> filetype.Create_vector(nblocks, blocksize, nprocs * blocksize);
> filetype.Commit();
> obuf = new int[bufsize];
> ibuf = new int[bufsize];
> }
> ~tester() {
> delete[] obuf;
> delete[] ibuf;
> }
> void write()
> {
> for (int i = 0; i < nints; ++i) {
> if (myrank)
> obuf[i] = i;
> else
> obuf[i] = -i;
> }
>
> MPI::File f = open_set_view(MPI_MODE_CREATE | MPI_MODE_WRONLY);
> f.Write_all(obuf, nints, MPI_INT, status);
> f.Close();
> }
> void read()
> {
> MPI::File f = open_set_view(MPI_MODE_RDONLY);
> f.Read_all(ibuf, nints, MPI_INT, status);
> f.Close();
> 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;
> int myrank, nprocs, bufsize, nints, nblocks, blocksize, *obuf, *ibuf;
> MPI::Datatype filetype;
> string fname;
> MPI::Status status;
>
> MPI::File open_set_view(int mode)
> {
> MPI::File f = MPI::File::Open(MPI::COMM_WORLD, fname.c_str(),
> mode, MPI::INFO_NULL);
> MPI::Offset disp = blocksize * sizeof(int) * myrank;
> f.Set_view(disp, MPI_INT, filetype, "native", MPI_INFO_NULL);
> return f;
> }
> };
> int main()
> {
> cerr << "Starting rwall.\n";
> try {
> MPI::Init();
> tester t;
> t.write();
> MPI::COMM_WORLD.Barrier();
> 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;
> }
>
More information about the mpich-discuss
mailing list