next up previous contents
Next: Приложение С. Версия 1.2 Up: Библиография Previous: Приложение А. Языковые привязки   Contents

Приложение B. Языковые привязки в MPI-1 для языка С++

B1 Классы языка С++

Ниже представлены классы языка С++ в привязках для MPI-1:

namespace MPI { class Comm {...}; class Intracomm : public Comm {...}; class Graphcomm : public Intracomm {...}; class Cartcomm : public Intracomm {...}; class Intercomm : public Comm {...}; class Datatype {...}; class Errhandler {...}; class Exception {...}; class Group {...}; class Op {...}; class Request {...}; class Prequest : public Request {...}; class Status {...}; };

Заметим, что некоторые функции, константы и типы данных MPI-1 устарели и поэтому не имеют соответствующих привязок С++. Все устаревшие имена имеют соответствующие новые имена в MPI-2 (хотя, возможно, с новой семантикой).

B2 Константы

Эти константы определены в файлах mpi.h. Для краткости типы констант определяются в комментариях.

// возвращаемые коды // Тип: const int (или unnamed enum) MPI::SUCCESS MPI::ERR_BUFFER MPI::ERR_COUNT MPI::ERR_TYPE MPI::ERR_TAG MPI::ERR_COMM MPI::ERR_RANK MPI::ERR_REQUEST MPI::ERR_ROOT MPI::ERR_GROUP MPI::ERR_OP MPI::ERR_TOPOLOGY MPI::ERR_DIMS MPI::ERR_ARG MPI::ERR_UNKNOWN MPI::ERR_TRUNCATE MPI::ERR_OTHER MPI::ERR_INTERN MPI::ERR_PENDING MPI::ERR_IN_STATUS MPI::ERR_LASTCODE // различные константы // Тип: const void * MPI::BOTTOM // Тип: константы int (или unnamed enum) MPI::PROC_NULL MPI::ANY_SOURCE MPI::ANY_TAG MPI::UNDEFINED MPI::BSEND_OVERHEAD MPI::KEYVAL_INVALID // описатели для обработки ошибок // Тип: MPI::Errhandler (см. ниже) MPI::ERRORS_ARE_FATAL MPI::ERRORS_RETURN MPI::ERRORS_THROW_EXCEPTIONS // Максимальный размер строки // Тип: const int MPI::MAX_PROCESSOR_NAME MPI::MAX_ERROR_STRING // элементарные типы данных (Си / C++) // Тип: const MPI::Datatype MPI::CHAR MPI::SHORT MPI::INT MPI::LONG MPI::SIGNED_CHAR MPI::UNSIGNED_CHAR MPI::UNSIGNED_SHORT MPI::UNSIGNED MPI::UNSIGNED_LONG MPI::FLOAT MPI::DOUBLE MPI::LONG_DOUBLE MPI::BYTE MPI::PACKED // элементарные типы данных (Фортран) // Тип: const MPI::Datatype MPI::INTEGER MPI::REAL MPI::DOUBLE_PRECISION MPI::F_COMPLEX MPI::F_DOUBLE_COMPLEX MPI::LOGICAL MPI::CHARACTER // типы данных для функций редукции (Си / C++) // Тип: const MPI::Datatype MPI::FLOAT_INT MPI::DOUBLE_INT MPI::LONG_INT MPI::TWOINT MPI::SHORT_INT MPI::LONG_DOUBLE_INT // типы данных для функций редукции (Фортран) // Тип const MPI::Datatype MPI::TWOREAL MPI::TWODOUBLE_PRECISION MPI::TWOINTEGER // дополнительные типы данных данных (Фортран) // Тип: const MPI::Datatype MPI::INTEGER1 MPI::INTEGER2 MPI::INTEGER4 MPI::REAL2 MPI::REAL4 MPI::REAL8 // дополнительные типы данных (Си / C++) // Type: const MPI::Datatype MPI::LONG_LONG MPI::UNSIGNED_LONG_LONG // специальные типы данных для для создания производных типов данных // Тип: const MPI::Datatype MPI::UB MPI::LB // типы данных C++ // Тип: const MPI::Datatype MPI::BOOL MPI::COMPLEX MPI::DOUBLE_COMPLEX MPI::LONG_DOUBLE_COMPLEX // зарезервированные коммуникаторы // Тип: MPI::Intracomm MPI::COMM_WORLD MPI::COMM_SELF // результаты сравнения для коммуникаторов и групп // Тип: const int (или unnamed enum) MPI::IDENT MPI::CONGRUENT MPI::SIMILAR MPI::UNEQUAL // ключи запрсов среды // Тип: const int (или unnamed enum) MPI::TAG_UB MPI::IO MPI::HOST MPI::WTIME_IS_GLOBAL // коллективные операции // Тип: const MPI::Op MPI::MAX MPI::MIN MPI::SUM MPI::PROD MPI::MAXLOC MPI::MINLOC MPI::BAND MPI::BOR MPI::BXOR MPI::LAND MPI::LOR MPI::LXOR // нулевые дескрипторы // Тип: const MPI::Group MPI::GROUP_NULL MPI::COMM_NULL // Тип: const MPI::Datatype MPI::DATATYPE_NULL // Тип: const MPI::Request MPI::REQUEST_NULL // Тип: const MPI::Op MPI::OP_NULL // Тип: MPI::Errhandler MPI::ERRHANDLER_NULL // Пустая группа // Тип: const MPI::Group MPI::GROUP_EMPTY // Топологии // Тип: const int (или unnamed enum) MPI::GRAPH MPI::CART // Предопределенные функции // Тип: MPI::Copy_function MPI::NULL_COPY_FN MPI::DUP_FN // Тип: MPI::Delete_function MPI::NULL_DELETE_FN

B3 Определение типов

Следующее есть типы С++ , также включенные в файл mpi.h.

// Typedef MPI::Aint

Далее в этом приложении используется обозначение пространства имен, поскольку все функции из списка ниже имеют прототипы. Эта нотация не использовалась раньше, поскольку списки констант и типов выше не являются фактическими декларациями.

// прототипы для определенных пользователем функций namespace MPI { typedef void User_function(const void *invec, void* inoutvec, int len, const Datatype& datatype); };

B4 Привязки для парных обменов в языке С++

Кроме специально отмеченных случаев, все не статические функции в этом приложении виртуальные. Для краткости ключевое слово virtual пропущено.

namespace MPI{ void Comm::Send(const void* buf, int count, const Datatype& datatype, int dest, int tag) const void Comm::Recv(void* buf, int count, const Datatype& datatype, int source, int tag, Status& status) const void Comm::Recv(void* buf, int count, const Datatype& datatype, int source, int tag) const int Status::Get_count(const Datatype& datatype) const void Comm::Bsend(const void* buf, int count, const Datatype& datatype, int dest, int tag) const void Comm::Ssend(const void* buf, int count, const Datatype& datatype, int dest, int tag) const void Comm::Rsend(const void* buf, int count, const Datatype& datatype, int dest, int tag) const void Attach_buffer(void* buffer, int size) int Detach_buffer(void*& buffer) Request Comm::Isend(const void* buf, int count, const Datatype& datatype, int dest, int tag) const Request Comm::Ibsend(const void* buf, int count, const Datatype& datatype, int dest, int tag) const Request Comm::Issend(const void* buf, int count, const Datatype& datatype, int dest, int tag) const Request Comm::Irsend(const void* buf, int count, const Datatype& datatype, int dest, int tag) const Request Comm::Irecv(void* buf, int count, const Datatype& datatype, int source, int tag) const void Request::Wait(Status& status) void Request::Wait() bool Request::Test(Status& status) bool Request::Test() void Request::Free() static int Request::Waitany(int count, Request array_of_requests[], Status& status) static int Request::Waitany(int count, Request array_of_requests[]) static bool Request::Testany(int count, Request array_of_requests[], int& index, Status& status) static bool Request::Testany(int count, Request array_of_requests[], int& index) static void Request::Waitall(int count, Request array_of_requests[], Status array_of_statuses[]) static void Request::Waitall(int count, Request array_of_requests[]) static bool Request::Testall(int count, Request array_of_requests[], Status array_of_statuses[]) static bool Request::Testall(int count, Request array_of_requests[]) static int Request::Waitsome(int incount, Request array_of_requests[], int array_of_indices[], Status array_of_statuses[]) static int Request::Waitsome(int incount, Request array_of_requests[], int array_of_indices[]) static int Request::Testsome(int incount, Request array_of_requests[], int array_of_indices[], Status array_of_statuses[]) static int Request::Testsome(int incount, Request array_of_requests[], int array_of_indices[]) bool Comm::Iprobe(int source, int tag, Status& status) const bool Comm::Iprobe(int source, int tag) const void Comm::Probe(int source, int tag, Status& status) const void Comm::Probe(int source, int tag) const void Request::Cancel() const bool Status::Is_cancelled() const Prequest Comm::Send_init(const void* buf, int count, const Datatype& datatype, int dest, int tag) const Prequest Comm::Bsend_init(const void* buf, int count, const Datatype& datatype, int dest, int tag) const Prequest Comm::Ssend_init(const void* buf, int count, const Datatype& datatype, int dest, int tag) const Prequest Comm::Rsend_init(const void* buf, int count, const Datatype& datatype, int dest, int tag) const Prequest Comm::Recv_init(void* buf, int count, const Datatype& datatype, int source, int tag) const void Prequest::Start() static void Prequest::Startall(int count, Prequest array_of_requests[]) void Comm::Sendrecv(const void *sendbuf, int sendcount, const Datatype& sendtype, int dest, int sendtag, void *recvbuf, int recvcount, const Datatype& recvtype, int source, int recvtag, Status& status) const void Comm::Sendrecv(const void *sendbuf, int sendcount, const Datatype& sendtype, int dest, int sendtag, void *recvbuf, int recvcount, const Datatype& recvtype, int source, int recvtag) const void Comm::Sendrecv_replace(void* buf, int count, const Datatype& datatype, int dest, int sendtag, int source, int recvtag, Status& status) const void Comm::Sendrecv_replace(void* buf, int count, const Datatype& datatype, int dest, int sendtag, int source, int recvtag) const Datatype Datatype::Create_contiguous(int count) const Datatype Datatype::Create_vector(int count, int blocklength, int stride) const Datatype Datatype::Create_indexed(int count, const int array_of_blocklengths[], const int array_of_displacements[]) const int Datatype::Get_size() const void Datatype::Commit() void Datatype::Free() int Status::Get_elements(const Datatype& datatype) const void Datatype::Pack(const void* inbuf, int incount, void *outbuf, int outsize, int& position, const Comm &comm) const void Datatype::Unpack(const void* inbuf, int insize, void *outbuf, int outcount, int& position, const Comm& comm) const int Datatype::Pack_size(int incount, const Comm& comm) const };

B5 Привязки для коллективных обменов в языке С++

namespace MPI { void Intracomm::Barrier() const void Intracomm::Bcast(void* buffer, int count, const Datatype& datatype, int root) const void Intracomm::Gather(const void* sendbuf, int sendcount, const Datatype& sendtype, void* recvbuf, int recvcount, const Datatype& recvtype, int root) const void Intracomm::Gatherv(const void* sendbuf, int sendcount, const Datatype& sendtype, void* recvbuf, const int recvcounts[], const int displs[], const Datatype& recvtype, int root) const void Intracomm::Scatter(const void* sendbuf, int sendcount, const Datatype& sendtype, void* recvbuf, int recvcount, const Datatype& recvtype, int root) const void Intracomm::Scatterv(const void* sendbuf, const int sendcounts[], const int displs[], const Datatype& sendtype, void* recvbuf, int recvcount, const Datatype& recvtype, int root) const void Intracomm::Allgather(const void* sendbuf, int sendcount, const Datatype& sendtype, void* recvbuf, int recvcount, const Datatype& recvtype) const void Intracomm::Allgatherv(const void* sendbuf, int sendcount, const Datatype& sendtype, void* recvbuf, const int recvcounts[], const int displs[], const Datatype& recvtype) const void Intracomm::Alltoall(const void* sendbuf, int sendcount, const Datatype& sendtype, void* recvbuf, int recvcount, const Datatype& recvtype) const void Intracomm::Alltoallv(const void* sendbuf, const int sendcounts[], const int sdispls[], const Datatype& sendtype, void* recvbuf, const int recvcounts[], const int rdispls[], const Datatype& recvtype) const void Intracomm::Reduce(const void* sendbuf, void* recvbuf, int count, const Datatype& datatype, const Op& op, int root) const void Op::Init(User_function* function, bool commute) void Op::Free() void Intracomm::Allreduce(const void* sendbuf, void* recvbuf, int count, const Datatype& datatype, const Op& op) const void Intracomm::Reduce_scatter(const void* sendbuf, void* recvbuf, int recvcounts[], const Datatype& datatype, const Op& op) const void Intracomm::Scan(const void* sendbuf, void* recvbuf, int count, const Datatype& datatype, const Op& op) const };

B6 Привязки для групп, контекстов и коммуникаторов в языке С++

По синтаксическим и семантическим причинам функции Dup() в списке ниже не виртуальные. Синтаксически каждая из них обязана иметь различные типы возвращения.

namespace MPI { int Group::Get_size() const int Group::Get_rank() const static void Group::Translate_ranks (const Group& group1, int n, const int ranks1[], const Group& group2, int ranks2[]) static int Group::Compare(const Group& group1, const Group& group2) Group Comm::Get_group() const static Group Group::Union(const Group& group1, const Group& group2) static Group Group::Intersect(const Group& group1, const Group& group2) static Group Group::Difference(const Group& group1, const Group& group2) Group Group::Incl(int n, const int ranks[]) const Group Group::Excl(int n, const int ranks[]) const Group Group::Range_incl(int n, const int ranges[][3]) const Group Group::Range_excl(int n, const int ranges[][3]) const void Group::Free() int Comm::Get_size() const int Comm::Get_rank() const static int Comm::Compare(const Comm& comm1, const Comm& comm2) Intracomm Intracomm::Dup() const Intercomm Intercomm::Dup() const Cartcomm Cartcomm::Dup() const Graphcomm Graphcomm::Dup() const Comm& Comm::Clone() const = 0 Intracomm& Intracomm::Clone() const Intercomm& Intercomm::Clone() const Cartcomm& Cartcomm::Clone() const Graphcomm& Graphcomm::Clone() const Intracomm Intracomm::Create(const Group& group) const Intracomm Intracomm::Split(int color, int key) const void Comm::Free() bool Comm::Is_inter() const int Intercomm::Get_remote_size() const Group Intercomm::Get_remote_group() const Intercomm Intracomm::Create_intercomm(int local_leader, const Comm& peer_comm, int remote_leader, int tag) const Intracomm Intercomm::Merge(bool high) const };

B7 Привязки для топологий процессов в языке С++

namespace MPI { Cartcomm Intracomm::Create_cart(int ndims, const int dims[], const bool periods[], bool reorder) const void Compute_dims(int nnodes, int ndims, int dims[]) Graphcomm Intracomm::Create_graph(int nnodes, const int index[], const int edges[], bool reorder) const int Comm::Get_topology() const void Graphcomm::Get_dims(int nnodes[], int nedges[]) const void Graphcomm::Get_topo(int maxindex, int maxedges, int index[], int edges[]) const int Cartcomm::Get_dim() const void Cartcomm::Get_topo(int maxdims, int dims[], bool periods[], int coords[]) const int Cartcomm::Get_cart_rank(const int coords[]) const void Cartcomm::Get_coords(int rank, int maxdims, int coords[]) const int Graphcomm::Get_neighbors_count(int rank) const void Graphcomm::Get_neighbors(int rank, int maxneighbors, int neighbors[]) const void Cartcomm::Shift(int direction, int disp, int& rank_source, int& rank_dest) const Cartcomm Cartcomm::Sub(const bool remain_dims[]) const int Cartcomm::Map(int ndims, const int dims[], const bool periods[]) const int Graphcomm::Map(int nnodes, const int index[], const int edges[]) const };

B8 Привязки для запросов среды в языке С++

namespace MPI { void Get_processor_name(char* name, int& resultlen) void Errhandler::Free() void Get_error_string(int errorcode, char* name, int& resultlen) int Get_error_class(int errorcode) double Wtime() double Wtick() void Init(int& argc, char**& argv) void Init() void Finalize() bool Is_initialized() void Comm::Abort(int errorcode) };

B9 Привязки для профилирования в языке С++

namespace MPI{ void Pcontrol(const int level, ...) };

B10 Привязки для доступа к статусу в языке С++

namespace MPI{ int Status::Get_source() const void Status::Set_source(int source) int Status::Get_tag() const void Status::Set_tag(int tag) int Status::Get_error() const void Status::Set_error(int error) };

B11 Привязки для новых функций MPI 1.2 в языке С++

namespace MPI{ void Get_version(int& version, int& subversion); };

B12 Привязки для исключений в языке С++

namespace MPI{ Exception::Exception(int error_code); int Exception::Get_error_code() const; int Exception::Get_error_class() const; const char* Exception::Get_error_string() const; };

B13 Привязки для всех MPI классов в языке С++

Язык С++ требует, чтобы классы имели четыре специальные функции: конструктор, функцию копирования, деструктор и оператор присваивания. Привязки для этих функций представлены ниже. Два конструктора не являются виртуальными.

B13.1 Создание/Удаление

namespace MPI { <CLASS>::<CLASS>() <CLASS>::~<CLASS>() };

B13.2 Копирование/присваивание

namespace MPI { <CLASS>::<CLASS>(const <CLASS>& data) <CLASS>& <CLASS>::operator=(const <CLASS>& data) };

B13.3 Сравнение

Поскольку экземпляры статуса не являются дескрипторами для функций более низкого уровня, функции operator==() и operator!=() не определены как статусный класс.

namespace MPI { bool <CLASS>::operator==(const <CLASS>& data) const bool <CLASS>::operator!=(const <CLASS>& data) const };

B13.4 Межязыковое взаимодействие

Поскольку не имеется никаких С++ объектов MPI::STATUS_IGNORE и МPI::STATUSES_IGNORE, результат продвижения Си или ФОРТРАН дескрипторов (MPI_STATUS_IGNORE and MPI_STATUSES_IGNORE) является неопределенным .

namespace MPI { <CLASS>& <CLASS>::operator=(const MPI_<CLASS>& data) <CLASS>::<CLASS>(const MPI_<CLASS>& data) <CLASS>::operator MPI_<CLASS>() const };

B13.5 Перекрестные ссылки для названий функций

Поскольку некоторые привязки в языке С++ слегка отличаются по названию от соответствующих привязок в языках Си и ФОРТРАН в этом разделе каждое нейтральное по отношению к языку имя сопоставляется c привязкой для С++.

Для краткости префикс ``MPI::'' предполагается для всех имен классов.

Для устаревших имен используется слово <нет> в графе "Имя", чтобы указать, что эта функция реализована с новым именем.

Если в графе "Возвращаемое значение" указано значение не void, данное имя соответствует параметру в языковонейтральном описании.

Таблицы ссылок представлены на следующих страницах.

= table tabular |p170pt|p50pt|p90pt|p90pt|



MPI Функция

C++ класс Имя Возвращаемое значение
MPI_ERROR_CLASS   Get_error_class int errorclass
MPI_ERROR_STRING   Get_error_string void
MPI_FINALIZE   Finalize void
MPI_GATHERV Intracomm Gatherv void
MPI_GATHER Intracomm Gather void
MPI_GET_COUNT Status Get_count int count
MPI_GET_ELEMENTS Status Get_elements int count
MPI_GET_PROCESSOR_NAME   Get_processor_name void
MPI_GRAPHDIMS_GET Graphcomm Get_dims void
MPI_GRAPH_CREATE Intracomm Create_graph Graphcomm newcomm
MPI_GRAPH_GET Graphcomm Get_topo void
MPI_GRAPH_MAP Graphcomm Map int newrank
MPI_GRAPH_NEIGHBORS_COUNT Graphcomm Get_neighbors_count int nneighbors
MPI_GRAPH_NEIGHBORS Graphcomm Get_neighbors void
MPI_GROUP_COMPARE Group static Compare int result
MPI_GROUP_DIFFERENCE Group static Difference Group newgroup
MPI_GROUP_EXCL Group Excl Group newgroup
MPI_GROUP_FREE Group Free void
MPI_GROUP_INCL Group Incl Group newgroup
MPI_GROUP_INTERSECTION Group static Intersect Group newgroup
MPI_GROUP_RANGE_EXCL Group Range_excl Group newgroup
MPI_GROUP_RANGE_INCL Group Range_incl Group newgroup
MPI_GROUP_RANK Group Get_rank int rank
MPI_GROUP_SIZE Group Get_size int size
MPI_GROUP_TRANSLATE_RANKS Group static Translate_ranks void
MPI_GROUP_UNION Group static Union Group newgroup
MPI_IBSEND Comm Ibsend Request request
MPI_INITIALIZED   Is_initialized bool flag
MPI_INIT   Init void
MPI_INTERCOMM_CREATE Intracomm Create_intercomm Intercomm newcomm
MPI_INTERCOMM_MERGE Intercomm Merge Intracomm newcomm
MPI_IPROBE Comm Iprobe bool flag
MPI_IRECV Comm Irecv Request request
MPI_IRSEND Comm Irsend Request request
MPI_ISEND Comm Isend Request request
MPI_ISSEND Comm Issend Request request
MPI_KEYVAL_CREATE   <нет>  
MPI_KEYVAL_FREE   <нет>  
MPI_OP_CREATE Op Init void
MPI_OP_FREE Op Free void
MPI_PACK_SIZE Datatype Pack_size int size
MPI_PACK Datatype Pack void
MPI_PCONTROL   Pcontrol void
MPI_PROBE Comm Probe void
MPI_RECV_INIT Comm Recv_init Prequest request
MPI_RECV Comm Recv void
MPI_REDUCE_SCATTER Intracomm Reduce_scatter void
MPI_REDUCE Intracomm Reduce void
MPI_REQUEST_FREE Request Free void


MPI Функция

C++ класс Имя Возвращаемое значение
MPI_RSEND_INIT Comm Rsend_init Prequest request
MPI_RSEND Comm Rsend void
MPI_SCAN Intracomm Scan void
MPI_SCATTERV Intracomm Scatterv void
MPI_SCATTER Intracomm Scatter void
MPI_SENDRECV_REPLACE Comm Sendrecv_replace void
MPI_SENDRECV Comm Sendrecv void
MPI_SEND_INIT Comm Send_init Prequest request
MPI_SEND Comm Send void
MPI_SSEND_INIT Comm Ssend_init Prequest request
MPI_SSEND Comm Ssend void
MPI_STARTALL Prequest static Startall void
MPI_START Prequest Start void
MPI_TESTALL Request static Testall bool flag
MPI_TESTANY Request static Testany bool flag
MPI_TESTSOME Request static Testsome int outcount
MPI_TEST_CANCELLED Status Is_cancelled bool flag
MPI_TEST Request Test bool flag
MPI_TOPO_TEST Comm Get_topo int status
MPI_TYPE_COMMIT Datatype Commit void
MPI_TYPE_CONTIGUOUS Datatype Create_contiguous Datatype
MPI_TYPE_EXTENT   <нет>  
MPI_TYPE_FREE Datatype Free void
MPI_TYPE_HINDEXED   <нет>  
MPI_TYPE_HVECTOR   <нет>  
MPI_TYPE_INDEXED Datatype Create_indexed Datatype
MPI_TYPE_LB   <нет>  
MPI_TYPE_SIZE Datatype Get_size int
MPI_TYPE_STRUCT   <нет>  
MPI_TYPE_UB   <нет>  
MPI_TYPE_VECTOR Datatype Create_vector Datatype
MPI_UNPACK Datatype Unpack void
MPI_WAITALL Request static Waitall void
MPI_WAITANY Request static Waitany int index
MPI_WAITSOME Request static Waitsome int outcount
MPI_WAIT Request Wait void
MPI_WTICK   Wtick double wtick
MPI_WTIME   Wtime double wtime


next up previous contents
Next: Приложение С. Версия 1.2 Up: Библиография Previous: Приложение А. Языковые привязки   Contents
Alex Otwagin 2002-12-10