// Author: K. Noel Belcourt // 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 #include #include #include "boost/mpi/environment.hpp" #include "boost/mpi/communicator.hpp" using std::array; using std::vector; namespace mpi = boost::mpi; struct blob : array, array, array { }; namespace boost { namespace mpi { template <> struct is_mpi_datatype : mpl::true_ { }; template <> MPI_Datatype get_mpi_datatype(const blob& b) { array block_lengths{ { 9, 3, 8 } }; array displacements{ { 0, 40, 64 } }; array datatypes{ { MPI_INT, MPI_DOUBLE, MPI_CHAR } }; MPI_Datatype blob_type; MPI_Type_create_struct( block_lengths.size() , reinterpret_cast(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 data; if (world.rank() == 0) { int size = 10000000; data.resize(size); // initialize data at vector ends blob& b1= data[0]; array& i = b1; i[0] = -1; blob& b2= data[size-1]; array& 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& i = b1; assert(i[0] == -1); // blob& b2 = data[data.size()-1]; // array& d = b2; // assert(d[2] == -17); } #endif // defined(__cplusplus) return 0; }