next up previous contents
Next: Исключения Up: С++ Previous: Типы данных С++   Contents

Коммуникаторы.

Иерархия класса MPI::Comm делает явными различные типы коммуникаторов, неявно определенных MPI и позволяет им иметь жесткий тип. Так как изначальная структура MPI определяет только один тип дескриптора для всех типов коммуникаторов, приведены следующие разъяснения для структуры С++.

Типы коммуникаторов. Существует пять различных типов коммуникаторов: 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. Определение его ожидаемого поведения вместо его ожидаемой реализации предоставляет максимальную гибкость для разработчика. []


Table 8.4 Группы предопределенных типов данных
Целое число Си 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


Table 8.5 Допустимые типы данных для операций понижения точности
Операция Допустимые типы  
MPI::MAX, MPI::MIN целое число Си, целое число ФОРТРАНa, плавающая точка  
MPI::SUM, MPI::PROD целое число Си, целое число ФОРТРАНa, плавающая точка, комплексные  
MPI::LAND, MPI::LOR, MPI::LXOR целое число Си, логические  
MPI::BAND, MPI::BOR, MPI::BXOR целое число Си, целое число ФОРТРАНa, байт  

Пример 8.5    Следующий пример демонстрирует поведение присваивания и сравнения с использованием MPI::COMM_NULL. 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. Пользователи при необходимости могут провести преобразование типов. []


next up previous contents
Next: Исключения Up: С++ Previous: Типы данных С++   Contents
Alex Otwagin 2002-12-10