next up previous contents
Next: Зарезервированные ключи info Up: Интерфейс менеджера процессов Previous: Запуск процессов и установка   Contents

Запуск нескольких исполняемых файлов и установка связей

Хотя MPI_COMM_SPAWN достаточен для большинства случаев, он не позволяет порождение процессов для нескольких исполняемых файлов или одного файла с разными наборами аргументов. Следующая процедура порождает процессы для нескольких исполняемых файлов или одного файла с разными наборами аргументов, устанавливает с ними связь и помещает их в один MPI_COMM_WORLD.





MPI_COMM_SPAWN_MULTIPLE(count, array_of_commands,
array_of_argv, array_of_maxprocs, array_of_info,
root, comm, intercomm, array_of_errcodes)

IN count Количество команд (положительное целое, важно в MPI только для root - см. информацию для пользователей)  
IN array_of_commands Выполняемые программы (массив строк, важен только для root)  
IN array_of_argv Аргументы для commands (массив строковых массивов, важен только для root)  
IN array_of_maxprocs Максимальное количество процессов, запускаемых для каждой команды (массив целых, важен только для root)  
IN array_of_info Объекты info, сообщающие системе выполнения, где и как запускать процессы (массив дескрипторов, важен только для root)  
IN root Ранг процесса, в котором проверяются предыдущие аргументы (целое)  
IN comm Внутренний коммуникатор, содержащий группу порожденных процессов (дескриптор)  
OUT intercomm Интеркоммуникатор между оригинальной и вновь порожденной группами (дескриптор)  
OUT array_of_errcodes По одному коду ошибки на процесс (массив целых)  






int MPI_Comm_spawn_multiple (int count, char **array_of_commands,
char ***array_of_argv, int *array_of_maxprocs,
MPI_Info *array_of_info, int root, MPI_Comm comm,
MPI_Comm *intercomm, int *array_of_errcodes)

MPI_COMM_SPAWN_MULTIPLE (COUNT, ARRAY_OF_COMMANDS, ARRAY_OF_ARGV,
ARRAY_OF_MAXPROCS, ARRAY_OF_INFO, ROOT, COMM, INTERCOMM,
ARRAY_OF_ERRCODES, IERROR)
INTEGER COUNT, ARRAY_OF_INFO(*),ARRAY_OF_MAXPROCS(*), ROOT,
COMM, INTERCOMM, ARRAY_OF_ERRCODES(*), IERROR
CHARACTER*(*) ARRAY_OF_COMMANDS(*),ARRAY_OF_ARGV(COUNT, *)

MPI::Intercomm MPI::Intracomm::Spawn_multiple(int count,
const char* array_of_commands, const char**array_of_argv,
const int array_of_maxprocs, const MPI::Infoarray_of_info,
int root, int array_of_errcodes)

MPI::Intercomm MPI::Intracomm::Spawn_multiple(int count,
const char* array_of_commands, const char**array_of_argv,
const int array_of_maxprocs, const MPI::Infoarray_of_info,
int root)

MPI_COMM_SPAWN_MULTIPLE идентичен MPI_COMM_SPAWN, за исключением наличия нескольких спецификаций исполняемых файлов. Первый аргумент, count, определяет число спецификаций. Следующие четыре аргумента являются простыми массивами соответствующих аргументов
MPI_COMM_SPAWN. В версии array_of_argv для ФОРТРАН элемент array_of_argv(i, j) является j-ым аргументом i-ой команды.

Объяснение: Этот подход может показаться обратно совместимым для программистов на языке ФОРТРАН, знакомых с развертыванием по столбцам в ФОРТРАН. Однако, он необходим, чтобы позволить MPI_COMM_SPAWN отсортировать аргументы. Отметьте, что главная размерность array_of_argv должна совпадать с count.[]

Совет пользователям: Аргумент count интерпретируется MPI только для root, подобно аргументу array_of_argv. Поскольку главная размерность array_of_argv - это count, неположительное значение count на не-root узле может теоретически вызвать при выполнении ошибку проверки границ массива, даже если array_of_argv должен игнорироваться процедурой. Если возникает такая ошибка, пользователь должен точно указать правильную величину count на не-root узлах.

Константу MPI_ARGVS_NULL (MPI::ARGVS_NULL в С++) приложение может использовать в любом языке, чтобы указать, что аргументы не передаются ни одной команде. Эта константа подобна (char ***)0 в Си. Эффект установки отдельных элементов в array_of_argv после MPI_ARGVS_NULL не известен. Чтобы определить аргументы для некоторых, но не всех, команд, команды без аргументов должны иметь соответствующие argv, первым элементом которых является null - ((char *)0 в Си и пустая строка в ФОРТРАН).[]

Все порожденные процессы имеют один и тот же MPI_COMM_WORLD. Их ранги в MPI_COMM_WORLD прямо соответствуют порядку, в котором были указаны команды в MPI_COMM_SPAWN_MULTIPLE. Предположим, что первая команда генерирует $m_1$ процессов, вторая - $m_2$, и т.д. Процессы, соответствующие первой команде, имеют ранги 0, 1, ..., $m_1$-1. Процессы второй команды имеют ранги $m_1, m_1+1, ...,
m_1+m_2-1$. Процессы третьей команды имеют ранги $m_1+m_2, m_1+m_2+1,
..., m_1+m_2+m_3-1$ и т.д.

Совет пользователям: Вызов MPI_COMM_SPAWN несколько раз может создать несколько наборов потомков с разными MPI_COMM_WORLD, в то время, как MPI_COMM_SPAWN_MULTIPLE создает потомков с единственным MPI_COMM_WORLD. Поэтому эти два метода не полностью эквивалентны. Из соображений производительности пользователь должен вызывать MPI_COMM_SPAWN_MULTIPLE вместо нескольких вызовов MPI_COMM_SPAWN. Порождение нескольких элементов одновременно будет быстрее, чем их последовательное порождение. Кроме того, в некоторых реализациях, связь между процессами, порожденными в одно и то же время, будет быстрее, чем связь между процессами, порожденными по отдельности.[]

Аргумент array_of_errcodes является одномерным массивом размером $\sum_{i=1}^{count} n_i$, где $n_i$ является i-ым элементом array_of_maxprocs. Команда с номером i сопоставляет $n_i$ непрерывные слоты в этом массиве с элемента $\sum_{j=1}^{i-1} n_j$ до $\lbrack\sum_{j=1}^i n_j\rbrack-1$. Коды ошибок обрабатываются также, как для MPI_COMM_SPAWN.

Пример 3.2 Пример применения array_of_argv в Си и ФОРТРАН

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

char *array_of_commands2= ``ocean'', ``atmos'';
char **array_of_argv2;
char *argv0= ``-gridfile'', ``ocean1.grd'', (char *)0;
char *argv1= ``atmos.grd'', (char *)0;
array_of_argv0= argv0;
array_of_argv1= argv1;
MPI_Comm_spawn_multiple(2, array_of_commands, array_of_argv, ...);
На ФОРТРАН:
CHARACTER*25 commands(2), array_of_argv(2, 3)
commands(1) = `ocean'
array_of_argv(1, 1) = `-gridfile'
array_of_argv(1, 2) = `ocean1.grd'
array_of_argv(1, 3) = ` '

commands(2) = `atmos'
array_of_argv(2, 1) = `atmos.grd'
array_of_argv(2, 2) = ` '

call MPI_COMM_SPAWN_MULTIPLE(2, commands, array_of_argv, ...)


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