Почему MPI_Init принимает указатели на argc и argv?
так мы используем функцию MPI_Init
int main(int argc, char **argv)
{
MPI_Init(&argc, &argv);
…
}
почему MPI_Init использует указатели на argc и argv вместо значений argv?
Ответы
Ответ 1
В соответствии с указанным здесь ответом:
Передача аргументов через командную строку с 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.
Ответ 2
Мое предположение потенциально позволяет удалить аргументы mpi из командной строки.
передача аргумента count по указателю позволяет изменить его значение из точки main.
Ответ 3
Я не эксперт, но я считаю, что простой ответ заключается в том, что каждый node, с которым вы работаете, работает со своей собственной копией кода. Передача этих аргументов позволяет каждому из узлов иметь доступ к argc и argv, даже если они не были переданы им через интерфейс командной строки.
Исходный или главный node, который вызывает MPI_Init , передал эти аргументы. MPI_Init позволяет другим узлам также обращаться к ним.
Ответ 4
Согласно справочным страницам OpenMPI: справочная страница MPI_Init (3)
Open MPI принимает аргументы C/C++ argc и argv для main, но не изменяет, не интерпретирует и не распространяет их.
Ответ 5
Менее накладные расходы просто передают два указателя.