Хотя 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. Предположим, что первая команда генерирует процессов, вторая - , и т.д. Процессы, соответствующие первой команде, имеют ранги 0, 1, ..., -1. Процессы второй команды имеют ранги . Процессы третьей команды имеют ранги и т.д.
Совет пользователям: Вызов MPI_COMM_SPAWN несколько раз может создать несколько наборов потомков с разными MPI_COMM_WORLD, в то время, как MPI_COMM_SPAWN_MULTIPLE создает потомков с единственным MPI_COMM_WORLD. Поэтому эти два метода не полностью эквивалентны. Из соображений производительности пользователь должен вызывать MPI_COMM_SPAWN_MULTIPLE вместо нескольких вызовов MPI_COMM_SPAWN. Порождение нескольких элементов одновременно будет быстрее, чем их последовательное порождение. Кроме того, в некоторых реализациях, связь между процессами, порожденными в одно и то же время, будет быстрее, чем связь между процессами, порожденными по отдельности.[]
Аргумент array_of_errcodes является одномерным массивом размером , где является i-ым элементом array_of_maxprocs. Команда с номером i сопоставляет непрерывные слоты в этом массиве с элемента до . Коды ошибок обрабатываются также, как для 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, ...)