next up previous contents
Next: Запуск нескольких исполняемых файлов Up: Интерфейс менеджера процессов Previous: Процессы в MPI   Contents

Запуск процессов и установка связи

Следующая процедура запускает ряд процессов MPI и устанавливает с ними связь, возвращая интеркоммуникатор.

Совет пользователям: В MPI возможно запустить статическое приложение типа SPMD или MPMD, запустив один процесс, чтобы он запустил своих потомков через MPI_COMM_SPAWN. Эта практика, однако, отвергается, особенно из-за причин производительности. Если возможно, нужно запускать все процессы сразу, как единое приложение MPI.[]



MPI_COMM_SPAWN(command, argv, maxprocs, info, root, comm, intercomm,

array_of_errcodes)



IN command Имя порождаемой программы (строка, важна только для root)  
IN argv Аргументы команды (массив строк, важен только для root)  
IN maxprocs Максимальное число процессов для запуска (целое, важно только для root)  
IN info Набор пар ключ-значение, сообщающий системе выполнения, где и как запускать процессы (дескриптор, важен только для root)  
IN root Ранг процесса, для которого анализируются предыдущие аргументы (целое)  
IN comm Интеркоммуникатор, содержащий группу порожденных процессов (дескриптор)  
OUT intercomm Интеркоммуникатор между первичной и вновь порожденной группой (дескриптор)  
OUT array_of_errcodes Один код на процесс (массив целых)  




int MPI_Comm_spawn(char *command, char **argv, int maxprocs,MPI_Info
info, int root, MPI_Comm comm, MPI_Comm *intercomm,
int *array_of_errcodes)

MPI_COMM_SPAWN(COMMAND, ARGV, MAXPROCS, INFO, ROOT, COMM, INTERCOMM,
ARRAY_OF_ERRCODES, IERROR)
CHARACTER*(*) COMMAND, ARGV(*)
INTEGER INFO, MAXPROCS, ROOT, COMM, INTERCOMM,
ARRAY_OF_ERRCODES(*), IERROR

MPI::Intercomm MPI::Intracomm::Spawn (const char *command,
const char* argv,int maxprocs, const MPI::Info& info,
int root, int array_of_errcodes) const

MPI::Intercomm MPI::Intracomm::Spawn (const char *command,
const char* argv,int maxprocs, const MPI::Info& info,
int root) const

MPI_COMM_SPAWN пытается запустить maxprocs одинаковых копий программы MPI, определяемой command, устанавливая с ними соединение и возвращая интеркоммуникатор. Порожденные процессы называются потомками, а процессы, их породившие, родителями. Потомки имеют свой собственный MPI_COMM_WORLD, отдельный от родителей. Процедура MPI_COMM_SPAWN является коллективной для comm, и не завершается, пока в потомках не вызовется MPI_INIT. Подобным образом, MPI_INIT в потомках не завершается, пока все родители не вызовут MPI_COMM_SPAWN. В этом смысле, MPI_COMM_SPAWN в родителях и MPI_INIT в потомках формируют коллективную операцию над объединением родительских и дочерних процессов. Интеркоммуникатор, возвращаемый MPI_COMM_SPAWN, содержит родительские процессы в локальной группе и процессы-потомки в удаленной группе. Порядок процессов в локальной и удаленной группах такой же, как и порядок группы comm для родителей и MPI_COMM_WORLD для потомков. Этот интеркоммуникатор может быть получен в потомке через функцию MPI_COMM_GET_PARENT.

Совет пользователям: Реализация может автоматически устанавливать соединение, прежде чем будет вызван MPI_INIT для потомков. Поэтому, завершение MPI_COMM_SPAWN в родителе не обязательно означает, что в потомках был вызван MPI_INIT (хотя полученный интеркоммуникатор можно использовать немедленно).[]

Аргумент command. Аргумент command является строкой, содержащей имя порождаемой программы. В языке Си строка оканчивается 0. В ФОРТРАН начальные и конечные пробелы обрезаются. MPI не определяет, как найти исполняемый файл или как определить рабочий каталог. Эти правила зависят от реализации и должны подходить для среды выполнения.

Совет разработчикам: Реализация должна использовать для поиска исполняемых файлов или определения рабочих каталогов обычный способ. В частности, гомогенная система с глобальной файловой системой может сначала проверять рабочий каталог порождающего процесса или может просмотреть каталоги, указанные в переменной окружения PATH, как это делают shell для Unix. Реализация над PVM должна использовать правила PVM для поиска исполняемых файлов (обычно в $HOME/pvm3/bin/$). Реализация MPI, работающая под управлением POE на IBM SP, должна использовать PVM для поиска исполняемых файлов способ POE. Реализация должна документировать свои правила поиска исполняемых файлов или определения рабочих каталогов, а высококачественная реализация должна предоставлять пользователю некоторый контроль над этими правилами.[]

Если программа, указанная в command, не вызывает MPI_INIT, а порождает вместо этого процесс, который вызывает MPI_INIT, результат может быть непредсказуем. Реализация должна позволять такую практику, но не обязательно.

Совет пользователям: MPI не определяет, что произойдет, если запущенная программа является скриптом shell, который запускает программу, вызывающую MPI_INIT. Несмотря на то, что некоторые реализации допускают такую практику, они могут также иметь ограничения, такие, как требование, чтобы аргумент, поддерживаемый скриптом shell, поддерживался программой, или требование, чтобы определенные части среды не изменялись.[]

Аргумент argv. Аргумент argv является массивом строк, содержащих аргументы, передаваемые программе. Первый элемент argv является первым аргументом, переданным command, а не самой командой (что обычно в некоторых ситуациях). Список аргументов оканчивается NULL в Си и С++, и пустой строкой в ФОРТРАН. В ФОРТРАН начальные и конечные пробелы всегда обрезаются, так что строка, состоящая из пробелов, рассматривается как пустая строка. Константа MPI_ARGV_NULL (MPI::ARGV_NULL в С++) может использоваться в любом языке для указания пустого списка аргументов. В Си и С++ эта константа - то же самое, что и NULL.

Пример 3.1 Примеры для argv в Си и ФОРТРАН.

Чтобы запустить программу ``ocean'' с аргументами ``-gridfile'' и ``ocean1.grd'' в Си:

char command= ``ocean'';
char *argv= ``-gridfile'', ``ocean1.grd'', NULL;
MPI_Comm_spawn(command, argv, ...);
Если не все известно во время компиляции:
char *command;
char **argv;
command = ``ocean'';
argv = (char**)malloc(3*sizeof(char*));
argv0= ``-gridfile'';
argv1= ``ocean1.grd'';
argv2= NULL;
MPI_Comm_spawn(command, argv, ...);
В ФОРТРАН:
CHARACTER*25 command, argv(3)
command = `ocean'
argv(1) = `-gridfile'
argv(2) = `ocean1.grd'
argv(3) = ` '
call MPI_COMM_SPAWN(command, argv, ...)

Аргументы передаются программе, если эта процедура поддерживается операционной системой. В Си аргумент argv для MPI_COMM_SPAWN отличается от аргумента argv для main двумя аспектами. Во-первых, он сдвинут на один элемент. Обычно argv0 для main предоставляется реализацией и содержит имя программы (заданное command). Второй аргумент argv1 соответствует argv0 для MPI_COMM_SPAWN, argv2 для main соответствует argv1 для MPI_COMM_SPAWN, и т.д. Во-вторых, argv для MPI_COMM_SPAWN должны оканчиваться нулем, так что их длина может быть определена. Передача аргумента argv со значением MPI_ARGV_NULL для MPI_COMM_SPAWN в main приводит к получению argc, равного 1 и argv, элемент 0 в котором (обычно) является именем программы.

Если реализация ФОРТРАНa поддерживает процедуры, которые позволяют программе получать свои аргументы, аргументы могут быть доступны через этот механизм. В Си, если операционная система не поддерживает аргументы, встречающиеся в argv для main(), реализация MPI может добавлять аргументы к argv, которые передаются MPI_INIT.

Аргумент maxprocs. MPI пытается порождать maxprocs процессов. Если это сделать невозможно, возникает ошибка класса MPI_ERR_SPAWN.

Реализация может позволять аргументу info изменять поведение по умолчанию таким образом, чтобы в случае, когда реализация не в состоянии порождать все maxprocs процессов, она порождала бы меньшее число процессов вместо возникновения ошибки. В принципе, аргумент info может определить случайное множество $\lbrace m_i: 0 \le m_i \le$ maxprocs$\rbrace$ возможных значений для числа порождаемых процессов. Множество $\lbrace
m_i\rbrace$ не обязательно должно включать значение maxprocs. Если реализация в состоянии породить любое разрешенное число процессов, MPI_COMM_SPAWN завершается успешно и число порожденных процессов $m$ передается как размер удаленной группы в intercomm. Если $m$ меньше, чем maxprocs, то причины, по которым не были порождены другие процессы, указываются в array_of_errcodes, как описано ниже. Если невозможно порождение ни одного из разрешенного количества процессов, MPI_COMM_SPAWN вызывает ошибку класса MPI_ERR_SPAWN.

Порождающий вызов с поведением по умолчанию называется жестким. Порождающий вызов, для которого могут быть созданы менее maxprocs процессов, называется мягким. См. раздел 3.3.4 для дополнительной информации о ключе soft для info.

Совет пользователям: По умолчанию, запросы являются жесткими, а ошибки MPI - фатальными. Поэтому, по умолчанию, будет фатальной ошибкой, если MPI не сможет породить все требуемые процессы. Чтобы получить поведение ``порождать столько процессов, сколько возможно до N'', пользователь должен выполнять мягкое порождение, где множество допустимых значений $\lbrace
m_i\rbrace$ определяется $\lbrace 0...N\rbrace$. Однако, эта стратегия не полностью переносима, поскольку реализации не обязаны поддерживать мягкое порождение.[]

Аргумент info. Аргумент info для всех процедур в этой главе является скрытым дескриптором типа MPI_Info в Си, MPI::Info в С++ и INTEGER в ФОРТРАН. Это контейнер для ряда определяемых пользователем пар (ключ, значение), где ключ и значение - строки (оканчивающиеся нулем char* в Си, character*(*) в ФОРТРАН). Процедуры создания и манипуляции аргументом info описаны в разд. 2.3.

Для вызовов SPAWN info предоставляет дополнительные (и возможно зависящие от реализации) инструкции для MPI и системы выполнения, о том, как запускать процессы. Приложение может передавать MPI_INFO_NULL в Си или ФОРТРАН, или MPI::INFO_NULL в С++. Переносимые программы, не требующие детального контроля за размещением процессов, должны использовать MPI_INFO_NULL.

MPI не определяет содержание аргумента info, исключая резервирование ряда специальных значений key (см. разд. 3.3.4). Аргумент info очень гибкий и может даже использоваться, например, для определения исполняемого файла и его аргументов командной строки. В этом случае аргумент command в MPI_COMM_SPAWN может быть пустым. Эта возможность проистекает из факта, что MPI не определяет, как будет найден исполняемый файл и аргумент info может сообщить системе выполнения, где ``найти'' исполняемый файл `` '' (пустая строка). Кстати, такая программа не будет переносимой среди реализаций MPI.

Аргумент root. Все аргументы перед аргументом root проверяются только для процесса, ранг которого в comm равен root. Значения этих аргументов в других процессах игнорируются.

Аргумент array_of_errcodes. array_of_errcodes - это массив размерности maxprocs, в котором MPI сообщает о состоянии каждого процесса, который он желает запустить. Если порождаются все maxprocs процессов, array_of_errcodes заполняется значениями MPI_SUCCESS. Если были порождены лишь $m$ $(0 \le m < {\tt maxprocs})$ процессов, $m$ элементов будут содержать MPI_SUCCESS, а остальные будут содержать специфичный для реализации код ошибки, указывающий причину, по которой MPI не смог запустить процесс. MPI не определяет, какие элементы соответствуют не сработавшим процессам. Реализация, в частности, может заполнять коды ошибок в соответствии один к одному с детальной спецификацией аргумента info. Все эти коды ошибок относятся к классу ошибок MPI_ERR_SPAWN, если нет ошибок в списке аргументов. В Си или ФОРТРАН приложение может допускать MPI_ERRCODES_IGNORE, если ему не интересен код ошибки. В С++ этой константы нет, и аргумент array_of_errcodes может быть опущен в списке аргументов.

Совет разработчикам: MPI_ERRCODES_IGNORE в ФОРТРАН является константой специального типа, подобно MPI_BOTTOM. См. обсуждение в разделе 1.5.4.[]



MPI_COMM_GET_PARENT(parent)



OUT parent Коммуникатор родителя (дескриптор)  



int MPI_Comm_get_parent (MPI_Comm *parent)

MPI_COMM_GET_PARENT (PARENT, IERROR)
INTEGER PARENT, IERROR

static MPI::Intercomm MPI::Comm::Get_parent()

Если процесс был запущен через MPI_COMM_SPAWN или MPI_COMM_SPAWN_MULTIPLE, вызов
MPI_COMM_GET_PARENT возвращает ``родительский'' коммуникатор текущего процесса. Этот родительский интеркоммуникатор создается неявно внутри MPI_INIT и является тем же интеркоммуникатором, который возвращается SPAWN в родительском процессе.

Если процесс не был запущен через MPI_COMM_SPAWN, MPI_COMM_GET_PARENT возвращает значение MPI_COMM_NULL.

После освобождения или отсоединения родительского коммуникатора MPI_COMM_GET_PARENT возвращает MPI_COMM_NULL.

Совет пользователям: MPI_COMM_GET_PARENT возвращает дескриптор отдельного интеркоммуникатора. Вызов MPI_COMM_GET_PARENT во второй раз возвращает дескриптор того же самого интеркоммуникатора. Освобождение дескриптора через MPI_COMM_DISCONNECT или MPI_COMM_FREE может привести к тому, что другие ссылки на интеркоммуникатор станут неверны. Отметьте, что вызов MPI_COMM_FREE для родительского коммуникатора не используется.[]

Объяснение: Форум хотел создать константу MPI_COMM_PARENT, подобную MPI_COMM_WORLD. К сожалению, такая константа не может быть использована (синтаксически) в качестве аргумента MPI_COMM_DISCONNECT, который допускается явно.[]


next up previous contents
Next: Запуск нескольких исполняемых файлов Up: Интерфейс менеджера процессов Previous: Процессы в MPI   Contents
Alex Otwagin 2002-12-10