Подтвердить что ты не робот

Почему MPI_Init принимает указатели на argc и argv?

так мы используем функцию MPI_Init

int main(int argc, char **argv)
{
    MPI_Init(&argc, &argv);
…
}

почему MPI_Init использует указатели на argc и argv вместо значений argv?

4b9b3361

Ответ 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

Менее накладные расходы просто передают два указателя.