Библиотека сайта rus-linux.net
Open MPI
Глава 15 из книги "Архитектура приложений с открытым исходным кодом", том 2.
Оригинал: Open MPI,
глава из книги "The Architecture of Open Source Applications" том 2.
Автор: Jeffrey M. Squyres
Дата публикации: 2012 г.
Перевод: Н.Ромоданов
Дата перевода: июнь 2013 г.
Фреймворки плагинов
Каждый фреймворк является полностью самодостаточным и находится в своем собственном каталоге в дереве исходного кода Open MPI. Имя подкаталога будет таким же, как и имя фреймворка; например, фреймворк memory
находится в каталоге memory
. В каталогах фреймворков имеются, по меньшей мере, следующие три составляющих:
- Определение интерфейса компонента: Заголовочный файл с
именем <framework>.h будет расположен в каталоге фреймворка верхнего уровня (например, в фреймворке Memory будет файл
memory/memory.h
). В этом всем известном заголовочном файле определяются интерфейсы, которые должны поддерживаться в каждом компоненте. В этом заголовке имеются указатели функций typedef для функций интерфейсов, структуры, предназначенные для работы с указателями с этими функциями, а также все другие необходимые типы, поля атрибутов, макросы, объявления и т.д. - Базовый код: В подкаталоге base находится связующий код, в котором реализован основной набор функций фреймворка. Например, базовым каталогом фреймворка memory будет каталог
memory/base
. К числу базовых обычно относятся функции, обеспечивающие функционирование фреймворка, например, осуществляющие поиск и открытие компонентов во время выполнения фреймворка, а также утилиты общего назначения, которые могут использоваться несколькими компонентами и т.д. - Компоненты: Все другие подкаталоги в каталоге фреймворка считаются компонентами. Точно также, как и у фреймворка, имена компонентов являются именами подкаталогами (например, в подкаталоге
memory/posix
находится компонент POSIX фреймворка Memory).
Подобно тому, как в каждом фреймворке определяются интерфейсы, которые должны поддерживаться в его компонентах, в фреймворке также определяются другие особенности функционирования, например, как фреймворки будут загружаться, как будут выбираться используемые компоненты и как будет завершаться работа компонентов. Ниже приведены два примера различий фреймворков: фреймворки типа «несколько из нескольких» и типа «один из нескольких», а также статические и динамические фреймворки.
Фреймворки типа «несколько из нескольких»
Некоторые фреймворки обладают функциями, которые в одном и том же процессе можно реализовывать несколькими различными способами. Например, фреймворк сети типа «точка-точка» в проекте Open MPI будет загружать несколько плагинов драйверов для того, чтобы в одном процессе можно было отправлять и получать сообщения из сетей нескольких типов.
Такие фреймворки, как правило, открывают все компоненты, которые они могут найти, а затем спрашивают у каждого компонента, должны ли они работать. Компоненты, изучая систему, в которой они работают, определяют, должны ли они работать, Например, сетевой компонент типа «точка-точка» определит, если ли и активны ли в системе типы сетей, которые он поддерживает. Если их нет, то компонент ответит, что он не должен запускаться, в результате чего фреймворк закроет и выгрузит этот компонент. Если этот тип сети доступен, то компонент ответит, что он должен быть запущен, в результате чего фреймворк будет держать этот компонент открытым для дальнейшего использования.
Фреймворки типа «один из нескольких»
Другие фреймворки предоставляют функции, для которых не имеет смысла во время выполнения иметь более одной доступной реализации. Например, создание согласованной контрольной точку параллельно выполняемого задания, что значит, что задание может быть «заморожено» и его можно будет возобновились позже, т. е. оно должна использоваться одна и та же система фоновых контрольных точек. Плагин, который взаимодействует с нужной системой фоновых контрольных точек является единственным плагином контрольных точек, который должен загружаться в каждом процессе, а все остальные плагины - не нужны.
Динамические фреймворки
Большинство фреймворков позволяют с помощью разделяемых объектов DSO загружать свои компоненты во время выполнения. Это наиболее гибкий метод поиска и загрузки компонентов; он позволяет явно не указывать конкретные загружаемые компоненты, загружать компоненты сторонних производителей, не входящие в основной дистрибутив проекта Open MPI, и т.д.
Статические фреймворки
Некоторые компоненты типа «один из нескольких» имеют дополнительные
ограничения, которые заставляют во время компиляции (а не во время выполнения) выбирать один и только один компонент из нескольких. Статическая компоновка компонентов типа «один из нескольких» позволяет напрямую вызывать функции-члены (и не использовать указатель на функцию), что может быть важно для обеспечения высокой производительности. Одним из примеров является фреймворк memcpy
, который предоставляет реализации функции memcpy()
.
Кроме того, некоторые фреймворки предоставляют функции, которые, возможно, должны быть использованы еще до полной инициализации Open MPI. Например, использование некоторых сетевых стеков требуют сложных моделей регистрации памяти, что, в свою очередь, требует замены процедур управления памятью библиотеки языка C, используемой по умолчанию. Поскольку управление памятью влияет на весь процесс, замена стандартной схемы может быть выполнена только перед запуском основного модуля main
. Поэтому такие компоненты должны быть статически скомпонованы с процессами в Open MPI, т. к. обращение к ним может происходить перед запуском модуля main
, т. е. задолго до того, как будет инициализирован MPI.
Далее Компоненты плагинов