Как определить ранг MPI / номер процесса, локальный для сокета / узла - PullRequest
11 голосов
/ 26 января 2012

Скажем, я запускаю параллельную программу, используя MPI.Команда выполнения

mpirun -n 8 -npernode 2 <prg>

запускает всего 8 процессов.Это 2 процесса на узел и всего 4 узла.(OpenMPI 1.5).Если узел содержит 1 ЦП (двухъядерный), а сетевое межсоединение между узлами - InfiniBand.

Теперь номер ранга (или номер процесса) можно определить с помощью

int myrank;
MPI_Comm_rank(MPI_COMM_WORLD, &myrank);

Это возвращаетчисло от 0 до 7.

Но, как я могу определить номер узла (в данном случае число от 0 до 3) и номер процесса внутри узла (число от 0 до 1)?

Ответы [ 4 ]

11 голосов
/ 19 октября 2016

Я полагаю, что вы можете достичь этого с помощью MPI-3 следующим образом:

MPI_Comm shmcomm;
MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0,
                    MPI_INFO_NULL, &shmcomm);
int shmrank;
MPI_Comm_rank(shmcomm, &shmrank);
9 голосов
/ 29 января 2012

Это зависит от реализации MPI - и для этой конкретной проблемы не существует стандарта.

Open MPI имеет некоторые переменные среды, которые могут помочь.OMPI_COMM_WORLD_LOCAL_RANK даст вам локальный ранг в узле - т.е.это номер процесса, который вы ищете.Поэтому вызов getenv поможет решить вашу проблему - но это не переносимо на другие реализации MPI .

См. this для (краткого) списка переменных в OpenMPI.

Я не знаю соответствующего "номера узла".

2 голосов
/ 03 августа 2015

Эта точная проблема обсуждается в блоге Маркуса Виттмана, Определение локального ранга узла MPI .

. Здесь предлагаются три стратегии:

  1. Наивное, переносимое решение использует MPI_Get_processor_name или gethostname для создания уникального идентификатора для узла и выполняет MPI_Alltoall для него. [...]
  2. [Метод 2] опирается на MPI_Comm_split,который обеспечивает простой способ разделения коммуникатора на подгруппы (субкоммуникаторы). [...]
  3. Может использоваться общая память, если она доступна. [...]

Для некоторого рабочего кода (предположительно, лицензированного LGPL?) Виттманн ссылается на MpiNodeRank.cpp из библиотеки APSM .

0 голосов
/ 25 мая 2018

В качестве альтернативы вы можете использовать

int MPI_Get_processor_name( char *name, int *resultlen )

для получения имени узла, а затем использовать его в качестве цвета в

int MPI_Comm_split(MPI_Comm comm, int color, int key, MPI_Comm *newcomm)

Этоне так просто, как MPI_Comm_split_type, однако он предлагает немного больше свободы для разделения вашего коммуникатора так, как вы хотите.

...