так мы используем функцию MPI_Init
int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
…
}
почему MPI_Init использует указатели на argc и argv вместо значений argv?
так мы используем функцию MPI_Init
int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
…
}
почему MPI_Init использует указатели на argc и argv вместо значений argv?
В соответствии с указанным здесь ответом:
Передача аргументов через командную строку с MPI
Большинство реализаций MPI удаляют все связанные с mpirun аргументы в этой функции, так что после его вызова вы можете обращаться к аргументам командной строки, как если бы это было обычное (не-mpirun) выполнение команды.
то есть. после
mpirun -np 10 myapp myparam1 myparam2
argc = 7 (?) из-за параметров mpirun (он также, кажется, добавляет некоторые), а индексы myparam1 и myparam2 неизвестны
но после
MPI_Init(&argc, &argv)
argc = 3, а myparam1 - в argv [1], а myparam2 - в argv [2]
По-видимому, это вне стандарта, но я тестировал его на linux mpich, и, похоже, это так. Без такого поведения было бы очень сложно (невозможно?) Отличать параметры приложения от параметров mpirun.
Мое предположение потенциально позволяет удалить аргументы mpi из командной строки. передача аргумента count по указателю позволяет изменить его значение из точки main.
Я не эксперт, но я считаю, что простой ответ заключается в том, что каждый node, с которым вы работаете, работает со своей собственной копией кода. Передача этих аргументов позволяет каждому из узлов иметь доступ к argc и argv, даже если они не были переданы им через интерфейс командной строки. Исходный или главный node, который вызывает MPI_Init , передал эти аргументы. MPI_Init позволяет другим узлам также обращаться к ним.
Согласно справочным страницам OpenMPI: справочная страница MPI_Init (3)
Open MPI принимает аргументы C/C++ argc и argv для main, но не изменяет, не интерпретирует и не распространяет их.
Менее накладные расходы просто передают два указателя.