File: sendrecv_vector.cpp

package info (click to toggle)
boost1.90 1.90.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 593,120 kB
  • sloc: cpp: 4,190,908; xml: 196,648; python: 34,618; ansic: 23,145; asm: 5,468; sh: 3,774; makefile: 1,161; perl: 1,020; sql: 728; ruby: 676; yacc: 478; java: 77; lisp: 24; csh: 6
file content (95 lines) | stat: -rw-r--r-- 2,068 bytes parent folder | download | duplicates (13)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// Author: K. Noel Belcourt <kbelco -at- sandia.gov>

// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)

#if defined(__cplusplus) && (201103L <= __cplusplus)

#include <array>
#include <cassert>
#include <vector>

#include "boost/mpi/environment.hpp"
#include "boost/mpi/communicator.hpp"

using std::array;
using std::vector;

namespace mpi = boost::mpi;

struct blob : array<int, 9>, array<double, 3>, array<char, 8> {
};

namespace boost {
  namespace mpi {

    template <>
    struct is_mpi_datatype<blob> : mpl::true_ {
    };

    template <>
    MPI_Datatype get_mpi_datatype<blob>(const blob& b) {
      array<unsigned long, 3> block_lengths{
        { 9, 3, 8 }
      };

      array<MPI_Aint, 3> displacements{
        { 0, 40, 64 }
      };

      array<MPI_Datatype, 3> datatypes{
        { MPI_INT, MPI_DOUBLE, MPI_CHAR }
      };

      MPI_Datatype blob_type;
      MPI_Type_create_struct(
          block_lengths.size()
        , reinterpret_cast<int*>(block_lengths.data())
        , displacements.data()
        , datatypes.data()
        , &blob_type);

      MPI_Type_commit(&blob_type);
      return blob_type;
    }

  } // namespace mpi
} // namespace boost

#endif // defined(__cplusplus)


int main(int argc, char* argv[]) {
#if defined(__cplusplus) && (201103L <= __cplusplus)

  mpi::environment env(argc, argv);
  mpi::communicator world;

  vector<blob> data;

  if (world.rank() == 0) {
    int size = 10000000;
    data.resize(size);
    // initialize data at vector ends
    blob& b1= data[0];
    array<int, 9>& i = b1;
    i[0] = -1;
    blob& b2= data[size-1];
    array<int, 9>& d = b2;
    d[2] = -17;
    world.send(1, 0, data);
  } else {
    world.recv(0, 0, data);
    // check data at vector ends
    blob& b1 = data[0];
    array<int, 9>& i = b1;
    assert(i[0] == -1);
    // blob& b2 = data[data.size()-1];
    // array<int, 9>& d = b2;
    // assert(d[2] == -17);
  }
#endif // defined(__cplusplus)

  return 0;
}