| |
Типы коммуникаторов. Существует пять различных типов коммуникаторов: MPI::Comm,
[]MPI::Intercomm, MPI::Intracomm, MPI::Cartcomm, и MPI::Graphcomm. MPI::Comm - абстрактный базовый
класс коммуникатора, инкапсулирующий общую для всех коммуникаторов MPI
функциональность. MPI::Intercomm и MPI::Intracomm порождены из MPI::Comm. MPI::Cartcomm и
[]MPI::Graphcomm порождены из
MPI::Intracomm.
Совет пользователям: Инициализация порожденного класса экземпляром базового класса недопустима для С++. Например, нельзя инициализировать MPI::Cartcomm из MPI::Intracomm. Более того, так как класс MPI::Comm - абстрактный базовый класс, то невозможно получить объект класса MPI::Comm. Тем не менее, можно получить указатель или ссылку на MPI::Comm.
Пример 8.4 Следующий код ошибочен.
Intracomm intra = MPI::COMM_WORLD.Dup(); Cartcomm cart(intra); // ошибка
Конкретный тип дескриптора MPI::COMM_NULL зависит от реализации. MPI::COMM_NULL должен иметь возможность быть использованным в операции сравнения и инициализации со всеми другими типами коммуникаторов. MPI::COMM_NULL также должен быть способен передаваться в функцию, которая ожидает в качестве аргумента коммуникатор. (то есть MPI::COMM_NULL должен быть допустимым значением для коммуникатора в качестве аргумента).
Объяснение: Есть несколько разных способов реализовать дескриптор MPI::COMM_NULL. Определение его ожидаемого поведения вместо его ожидаемой реализации предоставляет максимальную гибкость для разработчика. []
Целое число Си | MPI::INT, MPI::LONG, MPI::SHORT, |
MPI::UNSIGNED_SHORT, MPI::UNSIGNED, | |
MPI::UNSIGNED_LONG, MPI::SIGNED_CHAR, | |
MPI::UNSIGNED_CHAR | |
Целое число ФОРТРАНa | MPI::INTEGER |
Плавающая точка | MPI::FLOAT, MPI::DOUBLE, MPI::REAL, |
MPI::DOUBLE_PRECISION, | |
MPI::LONG_DOUBLE | |
Логические | MPI::LOGICAL, MPI::BOOL |
MPI::F_COMPLEX, MPI::COMPLEX, | |
MPI::F_DOUBLE_COMPLEX, | |
MPI::DOUBLE_COMPLEX, | |
Комплексные | MPI::LONG_DOUBLE_COMPLEX |
Байт | MPI::BYTE |
Операция | Допустимые типы | |
MPI::MAX, MPI::MIN | целое число Си, целое число ФОРТРАНa, плавающая точка | |
MPI::SUM, MPI::PROD | целое число Си, целое число ФОРТРАНa, плавающая точка, комплексные | |
MPI::LAND, MPI::LOR, MPI::LXOR | целое число Си, логические | |
MPI::BAND, MPI::BOR, MPI::BXOR | целое число Си, целое число ФОРТРАНa, байт |
MPI::Intercomm comm; comm = MPI::COMM_NULL; // присвоить значение COMM_NULL if (comm == MPI::COMM_NULL) // верно cout << ``comm is NULL'' << endl; if (MPI::COMM_NULL == comm) // заметьте - другая функция! cout << ``comm is still NULL'' << endl;
Dup() не определена как член-функция для MPI::Comm, но она определена для порожденных из MPI::Comm классов. Dup() не виртуальная функция и возвращает параметр OUT по значению.
MPI::Comm::Clone(). Интерфейс C++ для MPI включает новую функцию Clone().
[]MPI::Comm::Clone() - чисто виртуальная функция. Для
порожденных классов коммуникаторов, Clone() работает как Dup() за
исключением того, что она возвращает новый объект по ссылке. Функции Clone() объявлены следующим образом:
namespace MPI{ Comm& Comm::Clone() const = 0; Intracomm& Intracomm::Clone() const; Intercomm& Intercomm::Clone() const; Cartcomm& Cartcomm::Clone() const; Graphcomm& Graphcomm::Clone() const; };Объяснение: Clone() предоставляет виртуальную функциональность для Dup(), что и ожидается программистами на С++ и разработчиками библиотек. Так как Clone() возвращает новый объект по ссылке, пользователи должны брать на себя ответственность за удаление объекта. Для представления такой функциональности вместо изменения семантики Dup() был введен новый метод. []
Совет разработчикам: Внутри классов прототипы Clone() и Dup() могут выглядеть следующим образом:
namespace MPI { class Comm { virtual Comm& Clone() const = 0; }; class Intracomm : public Comm { Intracomm Dup() const { ... }; virtual Intracomm& Clone() const { ... }; }; class Intercomm : public Comm { Intercomm Dup() const { ... }; virtual Intercomm& Clone() const { ... }; }; // Cartcomm и Graphcomm объявлены примерно так же };Компиляторы, не поддерживающие различные типы возвращаемого значения виртуальных функций, могут возвращать ссылку на Comm. Пользователи при необходимости могут провести преобразование типов. []
Закладки на сайте Проследить за страницей |
Created 1996-2024 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |