Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur...

33
Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany 18th September 2006 Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Transcript of Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur...

Page 1: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Modernizing the C++ Interface to MPI

Prabhanjan Kambadur

Open Systems LabIndiana UniversityBloomington, USA

EuroPVM/MPI’06Bonn, Germany

18th September 2006

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 2: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Motivation

std::list<std::list<int> > lst;mpi::Send(lst, dest, tag, comm);

“Generic Programming” techniquesEmphasize re-usability and efficiencyNon-IntrusiveNo runtime penalties for primitive types

Previous efforts relied on object-oriented techniquesIntrusiveRuntime penaltiesOOMPI and MPI++

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 3: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Motivation - contd

std::list<std::list<int> > ls;

int num_lists = ls.size();MPI_Send(&num_lists, 1, MPI_INT, dest, tag, comm);

std::list<std::list<int> >::iterator out_iter = ls.begin();

while (out_iter != ls.end()) {std::vector<int> buffer(out_iter−>begin(), out_iter−>end());MPI_Send((void∗)&buffer.front(),out_iter−>size(), MPI_INT, dest, tag, comm);++out_iter;

}

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 4: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Goals

Support modern C++ idiomsGeneric containers through templatesOperator overloading, functorsIterators

Eliminate redundanciesDefault function parametersDeducible argumentsReferences

No runtime penalty for primitive types

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 5: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Eliminating Redundancies

Send(&data,1,MPI_INT,dest,tag,MPI_COMM_WORLD);

Use ReferencesCount can be deducedType can be deducedDefault values for parameters

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 6: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Eliminating Redundancies

Send(data,1,MPI_INT,dest,tag,MPI_COMM_WORLD);

Use ReferencesCount can be deducedType can be deducedDefault values for parameters

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 7: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Eliminating Redundancies

Send(data,MPI_INT,dest,tag,MPI_COMM_WORLD);

Use ReferencesCount can be deducedType can be deducedDefault values for parameters

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 8: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Eliminating Redundancies

Send(data,dest,tag,MPI_COMM_WORLD);

Use ReferencesCount can be deducedType can be deducedDefault values for parameters

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 9: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Eliminating Redundancies

Send(data,dest,tag);

Use ReferencesCount can be deducedType can be deducedDefault values for parameters

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 10: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Supporting STL Containers

using namespace std;

list<list<int> > ls;// intialize ls

int num_lists = ls.size();MPI_Send(&num_lists, 1, MPI_INT, dest, tag, comm);

list<list<int> >::iterator out_iter = ls.begin();while(out_iter != ls.end()){

vector<int> buffer(out_iter->begin(), out_iter->end());MPI_Send((void*)&buffer.front(), out_iter->size(),

MPI_INT, dest, tag, comm);++out_iter;

}

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 11: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Supporting STL Containers

using namespace std;

list<list<int> > ls;// intialize ls

int num_lists = ls.size();MPI_Send(&num_lists, 1, MPI_INT, dest, tag, comm);

list<list<int> >::iterator out_iter = ls.begin();while(out_iter != ls.end()){

vector<int> buffer(out_iter->begin(), out_iter->end());MPI_Send((void*)&buffer.front(), out_iter->size(),

MPI_INT, dest, tag, comm);++out_iter;

}

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 12: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Supporting STL Containers

using namespace std;

list<list<int> > ls;// intialize ls

int num_lists = ls.size();MPI_Send(&num_lists, 1, MPI_INT, dest, tag, comm);

list<list<int> >::iterator out_iter = ls.begin();while(out_iter != ls.end()){

vector<int> buffer(out_iter->begin(), out_iter->end());MPI_Send((void*)&buffer.front(), out_iter->size(),

MPI_INT, dest, tag, comm);++out_iter;

}

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 13: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Supporting STL Containers

using namespace std;

list<list<int> > ls;// intialize ls

int num_lists = ls.size();MPI_Send(&num_lists, 1, MPI_INT, dest, tag, comm);

list<list<int> >::iterator out_iter = ls.begin();while(out_iter != ls.end()){

vector<int> buffer(out_iter->begin(), out_iter->end());MPI_Send((void*)&buffer.front(), out_iter->size(),

MPI_INT, dest, tag, comm);++out_iter;

}

Send(ls, dest, tag);

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 14: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Extending Support for User-defined Types

struct employee_record {std:: string employee_name;int employee_id;std:: list <std:: string > address;

};

// Sender: Rank 0 // Receiver: Rank 1employee_record data; employee_record data;mpi::Send(data, 1, msg_tag) mpi::Recv(data, 0, msg_tag)

GoalsMinimal effortNon-intrusive

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 15: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

User-defined Types

template<class Archiver>void serialize (Archiver & ar, employee_record & rec, const unsigned int version) {

ar & rec.employee_name & rec.employee_id & rec.address;}

Boost Serialization Library (BSL)Simple interfaceNon-IntrusiveBuilt-in support for STL containers and iteratorsCustomizable Archiver

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 16: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Supporting Functors

string common_prefix(const string& s1, const string& s2) {if (s1.size() <= s2.size())

return string(s1.begin(), mismatch(s1.begin(), s1.end(), s2.begin()).first);else

return common_prefix(s2, s1);}

string global_common_prefix = mpi::Allreduce(my_string, &common_prefix);

Reduction operations onSTL and user-defined typesSTL and user-defined functors

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 17: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Implementation StrategiesFunction Specialization

int data[n];mpi::Send(data, data+10, dest, tag);-> Call MPI_Send Directly

struct gps{ int x; int y;}// Create the MPI_Datatypegps data;mpi::Send(data, dest, tag);-> Use the MPI_Datatype to call MPI_Send directly

std::list<int> data;mpi::Send(data, dest, tag);-> Serialize data and then, call MPI_Send

Choose the best implementation for each typeCompile-timeBased on type-properties

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 18: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Implementation StrategiesFunction Specialization

int data[n];mpi::Send(data, data+10, dest, tag);-> Call MPI_Send Directly

struct gps{ int x; int y;}// Create the MPI_Datatypegps data;mpi::Send(data, dest, tag);-> Use the MPI_Datatype to call MPI_Send directly

std::list<int> data;mpi::Send(data, dest, tag);-> Serialize data and then, call MPI_Send

Choose the best implementation for each typeCompile-timeBased on type-properties

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 19: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Implementation StrategiesFunction Specialization

int data[n];mpi::Send(data, data+10, dest, tag);-> Call MPI_Send Directly

struct gps{ int x; int y;}// Create the MPI_Datatypegps data;mpi::Send(data, dest, tag);-> Use the MPI_Datatype to call MPI_Send directly

std::list<int> data;mpi::Send(data, dest, tag);-> Serialize data and then, call MPI_Send

Choose the best implementation for each typeCompile-timeBased on type-properties

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 20: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Implementation StrategiesFunction Specialization

int data[n];mpi::Send(data, data+10, dest, tag);-> Call MPI_Send Directly

struct gps{ int x; int y;}// Create the MPI_Datatypegps data;mpi::Send(data, dest, tag);-> Use the MPI_Datatype to call MPI_Send directly

std::list<int> data;mpi::Send(data, dest, tag);-> Serialize data and then, call MPI_Send

Choose the best implementation for each typeCompile-timeBased on type-properties

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 21: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Implementation StrategiesFunction Specialization

int data[n];mpi::Send(data, data+10, dest, tag);-> Call MPI_Send Directly

struct gps{ int x; int y;}// Create the MPI_Datatypegps data;mpi::Send(data, dest, tag);-> Use the MPI_Datatype to call MPI_Send directly

std::list<int> data;mpi::Send(data, dest, tag);-> Serialize data and then, call MPI_Send

Choose the best implementation for each typeCompile-timeBased on type-properties

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 22: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Implementation StrategiesFunction Specialization

int data[n];mpi::Send(data, data+10, dest, tag);-> Call MPI_Send Directly

struct gps{ int x; int y;}// Create the MPI_Datatypegps data;mpi::Send(data, dest, tag);-> Use the MPI_Datatype to call MPI_Send directly

std::list<int> data;mpi::Send(data, dest, tag);-> Serialize data and then, call MPI_Send

Choose the best implementation for each typeCompile-timeBased on type-properties

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 23: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Implementation StrategiesFunction Specialization

int data[n];mpi::Send(data, data+10, dest, tag);-> Call MPI_Send Directly

struct gps{ int x; int y;}// Create the MPI_Datatypegps data;mpi::Send(data, dest, tag);-> Use the MPI_Datatype to call MPI_Send directly

std::list<int> data;mpi::Send(data, dest, tag);-> Serialize data and then, call MPI_Send

Choose the best implementation for each typeCompile-timeBased on type-properties

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 24: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Implementation StrategiesAccessing Type-properties – Type-traits

T == is_mpi_datatype

T == is_primitive_type

T == is_serialized_type

MPI_SendSerialize,

MPI_Send()

ERROR

MPI_Datatype

No

No Yes

Yes No

Yes

MPI_Send(),

T

Send

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 25: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Implementation StrategiesAccessing Type-properties – Type-traits

T == is_mpi_datatype

T == is_primitive_type

T == is_serialized_type

MPI_SendSerialize,

MPI_Send()

ERROR

MPI_Datatype

No

No Yes

Yes No

Yes

MPI_Send(),

T

Send

Attach type-propertiesQuery type-propertiesNon-intrusive

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 26: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Different pathways for mpi::Send

POD

Range

(MPI_BYTE) (MPI_BYTE)

/

Iterator

POD User−definedContainer

objectPointer

Serialize

C − Array

STL Iterators/C−Array of Containers

Serialize

Parameteric Polymorphism

Tag−based Dispatch

Object

Template Specialization

MPI_Send

Send

Reference

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 27: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Performance Results - NetPIPE

0.1

1

10

100

1000

10000

1 10 100 1000 10000 100000 1e+06 1e+07

Ban

dw

idth

in M

bit

s/s

Message Size in Bytes

MPIModern C++ Interface (primitive datatypes)Modern C++ Interface (serialized datatypes)

Figure: NetPIPE numbers for our modernized C++ interface to MPI and MPI.

Dual processor AMD Opteron, 4GB RAM, 1MB cache

Mellanox Infiniband cards

RedHat Enterprise Linux (2.6.9-22.0.1.ELsmp), GCC 3.4.4, Open MPI 1.0.1

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 28: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Conclusions

Our Modern C++ Interface to MPI provides

Natural C++ syntax for message-passingSeamless support for user-defined data types

Encouraged by the STLZero abstraction penalty for primitive data types

Serialized types incur performance penalty

Future Work

Improve performance of non-blocking operationsCollective operations on user-defined functors

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 29: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Questions

THANK YOU

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 30: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Different pathways for mpi::Recv

Irecv

Recv/

Object

ReferenceIterator

OutIterator(no bounds

checking)

IteratorRange

PODContainer/

User−definedobject

Pointer

C − ArrayPOD STL Iterators/

C−Array of Containers

Serialize

Serialize

(MPI_BYTE)

MPI_Recv/MPI_Irecv

(MPI_BYTE)

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 31: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Matching logic

POD C−Array

of POD

Container/

User−defined

object objects

C−Array of

Containers/

User−defined

POD

C−Array

of POD

Container/

User−defined

object

C−Array of

Containers/

User−definedobjects

User−defined

Objects/ PODs

Iterator Range

of Containers/

User−defined

Objects/PODs

of Containers/ of Containers/

User−defined

Objects/PODs

OutIteratorIterator Range

Primitive Recv/Irecv

Serialized Send/IsendPrimitive Send/Isend

Serialized Recv/Irecv

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 32: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Type-traits - an example

struct primitive_tag {};struct serialized_tag {};struct container_tag : serialized_tag {};

template <typename T>struct object_traits {

typedef serialized_tag object_category;};

template <>struct object_traits<int> {

typedef primitive_tag object_category;static inline MPI_Datatype get_mpi_type() { return MPI_INT; }

};

template <typename T, typename Alloc>struct object_traits<std::vector<T, Alloc> >{

typedef container_tag object_category;};

Prabhanjan Kambadur Modernizing the C++ Interface to MPI

Page 33: Modernizing the C++ Interface to MPI · Modernizing the C++ Interface to MPI Prabhanjan Kambadur Open Systems Lab Indiana University Bloomington, USA EuroPVM/MPI’06 Bonn, Germany

Function Specialization using tag-based dispatch

template <typename T>int Send(const T& var, int dest, tag tag, MPI_Comm comm) {

typedef typename object_traits<T>::object_category object_category;return send_impl(var, dest, tag, object_category());

}

template <typename T>int send_impl(const T& var, int dest, tag tag,

MPI_Comm comm, primitive_tag) {return MPI_Send ((void∗)var, 1, object_traits<T>::get_mpi_type(), dest, tag, comm);

}

template <typename T>int send_impl(const T& var, int dest, tag tag,

MPI_Comm comm, serialized_tag) {// Serialize var and then MPI_Send

}

Prabhanjan Kambadur Modernizing the C++ Interface to MPI