Почему должна быть минимальная работа перед MPI_Init? - PullRequest
0 голосов
/ 08 июня 2018

В документации для MPICH и OpenMPI упоминается, что до MPI_Init или после MPI_Finilize должно быть выполнено минимальное количество работы:

Стандарт MPI не говорит о том, что может сделать программа перед MPI_INIT илипосле MPI_FINALIZE.В реализации MPICH вы должны делать как можно меньше.

В чем причина этого?

Мне представляется вполне разумным, чтобы процессы выполняли значительное количество вычислений, прежде чем начинать взаимодействие друг с другом.

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Я полагаю, что это было сформулировано так, чтобы позволить реализациям MPI, которые порождают его ранги в пределах MPI_Init.Это означает, что технически гарантировано, что не все ранги существуют до MPI_Init.Если бы вы открыли файловые дескрипторы или выполнили другие действия с побочными эффектами на состояние процесса, это превратилось бы в огромный беспорядок.

На самом деле ни одна из основных реализаций MPI этого не делает, тем не менее реализация MPI может использовать это требование для другихтрюки.

РЕДАКТИРОВАТЬ: Я не нашел никаких доказательств этого и только помню это из далекого прошлого, поэтому я не уверен в этом.Я не могу найти формулировку в стандарте MPI, которую вы цитировали из MPICH.Однако стандарт MPI регулирует, какие функции MPI вы можете вызывать до MPI_Init:

Единственными функциями MPI, которые могут быть вызваны до вызова процедур инициализации MPI, являются MPI_GET_VERSION, MPI_GET_LIBRARY_VERSION, MPI_INITIALIZED, MPI_FINALIZED, и любая функция спрефикс MPI_T_.

0 голосов
/ 08 июня 2018

Документация MPI_Init MPICH дает некоторые подсказки:

Стандарт MPI не говорит о том, что программа может делать до MPI_INIT или после MPI_FINALIZE.В реализации MPICH вы должны делать как можно меньше.В частности, избегайте всего, что изменяет внешнее состояние программы, такого как открытие файлов, чтение стандартного ввода или запись в стандартный вывод.

Кстати, я бы не ожидал, что MPI_Init будет осуществлять связь.Это произойдет позже.

И реализация mpich/init.c - это свободное программное обеспечение ;вы можете изучить его исходный код и понять, что он инициализирует некоторые таймеры, некоторые потоки и т. д. (и это действительно должно произойти очень рано).

Для меня этоКажется совершенно разумным, чтобы процессы выполняли значительное количество вычислений перед началом связи друг с другом.

Конечно, но это должно произойти после MPI_Init (но до некоторого MPI_Send и т. Д.)

На некоторых суперкомпьютерах MPI может использовать выделенное оборудование (например, InfiniBand , Fibre Channel и т. Д. ...) и могут быть некоторые аппаратные или операционные причины для его инициализации очень рано.Поэтому имеет смысл звонить MPI_Init очень рано.Кстати, ему также даются указатели на main аргументы, и я предполагаю, что он изменит их перед дальнейшей обработкой вашим main.Тогда вызов MPI_Init, вероятно, является первым утверждением вашего main.

...