MPI Можете ли вы найти IP-адрес всех отдельных узлов?

#python #mpi #mpi4py

#python #mpi #mpi4py

Вопрос:

Мне было интересно, возможно ли это? Чтобы получить IP-адреса всех отдельных рангов, используя MPI4PY. Я понимаю, что могу использовать сокеты и отправлять сигнал. Мне просто любопытно, есть ли встроенная функция, которая сделает это за меня. В основном, только если что-то пойдет не так, когда сокеты получают IP-адрес, что иногда случается.

Комментарии:

1. Имейте в виду, что узел может иметь несколько IP-адресов (помимо очевидных localhost ). Переносимый способ получения одного IP-адреса на узел — использовать стандартную MPI_Get_processor_name() подпрограмму, MPI_Gather() имена хостов, а затем преобразовать имена хостов в IP.

2. @GillesGouaillardet MPI_Get_processor_name() не гарантирует возврат IP-адреса или имени хоста, поэтому я бы не назвал это переносимым.

3. Это справедливое замечание!

Ответ №1:

Весь смысл MPI заключается в том, чтобы скрыть детали базовой подсистемы связи, такие как IP-адреса, под абстракцией коммуникаторов и рангов процессов. В спецификации MPI нет положений о раскрытии такой информации переносимым способом.

Ближайший, который вы можете получить, это MPI_GET_PROCESSOR_NAME , который возвращает строковый идентификатор аппаратного обеспечения, на котором работает вызывающий. Большинство реализаций MPI, ориентированных на кластеры отдельных узлов, возвращают имя узла узла, которое теоретически может быть преобразовано в IP, но это не гарантировано, поскольку многие системы имеют более одного имени хоста, например, внутреннее (в Linux, заданное с sethostname(2) ) и полное доменное имя (полное доменное имя), который может быть преобразован в IP.

Стандарт не говорит ничего конкретного о содержимом этой строки, и каждая реализация может свободно выбирать, что возвращать. Например, в Blue Gene/Q MPI_GET_PROCESSOR_NAME возвращает номер задачи, размер задания, а также логические и физические координаты ранга в сетке связи:

 "Task 3 of 256 (0,0,0,0,1,1)  R02-M1-N00-J07"