| |
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 |
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |