99
// зачистка созданных коммуникаторов
MPI_Comm_free(&m_commlower);
if (m_commlocal != MPI_COMM_NULL)
MPI_Comm_free(&m_commlocal);
}
// ...
};
К конструктору fsmnet_type, также как и к конструктору
fsm_type, добавляется дополнительный параметр, характеризую-
щий коммуникатор, в рамках которого будут работать все ниже-
лежащие автоматы текущей сети. Объектом автомата, унаследо-
ванным от fsm_type, переданный коммуникатор может быть ис-
пользован по своему усмотрению. Конструктор сети самого
верхнего уровня вызывается с каким-либо определенным вне се-
ти коммуникатором с нужным количеством процессов, т.е. рав-
ным полному размеру всей сети. К примеру, это может быть
коммуникатор MPI_COMM_WORLD.
Чтобы понять, какую работу в приведенном коде выполняет
конструктор, следует оговорить, как происходит распределение
автоматов по процессам. Тот коммуникатор текущей сети, в кон-
тексте которого будут обмениваться выходными данными ее аб
-
страктные автоматы (элементарные автоматы или вложенные се-
ти), должен включать ровно столько процессов, сколько абст-
рактных автоматов она непосредственно содержит, т.е. сколько
возвращается функцией number_fsm фабрики сети. В то же время,
каждому абстрактному автомату должен быть передан свой ком-
муникатор, включающий количество процессов, равное размеру
этого автомата. С этой целью
все процессы переданного через
конструктор коммуникатора m_commfull разделяются на группы,
каждая из которых соответствует одному из абстрактных автома-
тов сети. Для выполнения этой операции путем опроса фабрики
сети на предмет размеров ее автоматов предварительно выясня-
ется номер m_fsmnum нижележащего абстрактного автомата те-
кущей сети, который будет реализовываться данным процессом.
После этого коммуникатор m_commfull разделяется
на коммуни-
каторы m_commlower по значению номера текущего нижележа-
щего автомата m_fsmnum.
Из каждой созданной группы выделяется нулевой процесс,