#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"