Запрос в инициализации MPI

Если мы вызываем MPI_Init(), мы знаем, что несколько копий одного и того же исполняемого файла запускаются на разных машинах. Предположим, что MPI_Init() находится в функции f(), тогда будут ли существовать несколько копий функции main()?

Основная проблема, с которой я сталкиваюсь, заключается в получении информации. По сути, происходит то, что ввод выполняется один раз, но основная функция выполняется несколько раз. Похоже, что процессор с рангом 0 всегда имеет входные данные, остальные имеют случайные значения. Итак, чтобы отправить значения, мы должны транслировать входные данные от процессора 0 всем остальным процессорам?


person p_kajaria    schedule 23.02.2014    source источник
comment
Вы должны выполнить MPI_Init() только один раз (то есть в вашем исходном коде это может произойти ровно один раз). Параметры вашей программы должны быть читаемы на всех процессорах.   -  person stefan    schedule 23.02.2014


Ответы (1)


MPI_Init() не создает несколько копий, а просто инициализирует внутрипроцессную библиотеку MPI. Несколько копий вашего процесса создаются до этого, скорее всего, с помощью какой-то команды mpirun (именно так вы запускаете приложение MPI). Все процессы независимы с самого начала, поэтому отвечая на первую часть вашего вопроса — да, будут существовать несколько копий main(), и они будут существовать, даже если вы не вызовете MPI_Init.

Ответ на ваш вопрос о входных данных зависит от характера входных данных: если он вводится из консоли, вам нужно вводить значения только в одном процессе (например, ранг 0), а затем передавать их. Если входные данные находятся в каком-либо файле или указаны в качестве аргумента командной строки, то все процессы могут получить к ним доступ.

person nullptr    schedule 23.02.2014
comment
Спасибо. :) У меня было еще одно сомнение. Предположим, у меня есть функция doSomething(int *A), где doSomething() вызывается каким-то другим приложением, и мой код MPI находится внутри этой функции, так что даже в этом случае нам нужно предоставлять механизм широковещания? - person p_kajaria; 23.02.2014
comment
Если я правильно понял, то "какое-то другое приложение" является частью кода, то есть оно связано с вашей программой. Затем, после того как вы запустите программу MPI, у вас будет N отдельных процессов (возможно, работающих на разных машинах), каждый из которых содержит копию этого «приложения», и у вас будет N вызовов doSomething — каждый на своей машине со своим локальным A. Просто представьте, что вы скомпилировали свою программу и запустили ее на 10 компьютерах вручную — процессы изолированы и не знают друг о друге (если не вызывают MPI-библиотеку), именно это и происходит после mpirun. - person nullptr; 23.02.2014
comment
MPI не является многопоточным. В многопоточности вы можете инициализировать некоторые общие переменные, а затем создавать потоки, используя их (возможно, вы хотели бы сделать то же самое в своей программе); для этого требуется разделяемая память, поэтому она ограничена одной машиной. В MPI нет модели разделяемой памяти, поэтому программирование межпроцессного взаимодействия становится более сложным, но приложения MPI могут работать на нескольких машинах, и это огромное преимущество. - person nullptr; 23.02.2014
comment
Спасибо. Я получаю это сейчас. - person p_kajaria; 23.02.2014