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

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

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

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


person Rohit Banga    schedule 15.04.2010    source источник
comment
Они передаются по ссылке, чтобы позволить реализации MPI предоставлять их в средах, где аргументы командной строки не передаются для main. mpi-forum.org/docs/mpi-11-html/ node151.html может ли кто-нибудь пролить свет на это на примере?   -  person Rohit Banga    schedule 15.04.2010


Ответы (5)


Согласно ответу, указанному здесь:

Передача аргументов через командную строку с помощью 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.

person NickTee    schedule 21.04.2012
comment
По крайней мере, mpirun из OpenMPI 3.1.1 удаляет свои параметры еще до вызова подпрограмм, так что вы получите argc = 3 еще до вызова MPI_Init. - person Jakub Klinkovský; 16.09.2018
comment
Мне любопытно, с каким дистрибутивом вы наблюдали такое поведение. Это имеет смысл, но я не смог воспроизвести это с помощью mpich или openmpi. - person alfC; 01.07.2021

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

person Anycorn    schedule 15.04.2010
comment
Почему они это сделали? что, если я проверю аргументы перед вызовом MPI_Init - person Rohit Banga; 16.04.2010
comment
Для разбора конкретных аргументов MPI. У меня нет примера для MPI, но инструментарий GTK GUI имеет почти идентичную функцию gtk_init, которая отфильтровывает некоторые общие параметры командной строки X, такие как --display и --screen. - person el.pescado; 08.07.2010
comment
@RohitBanga Вы можете проверить содержимое argc и argv перед вызовом MPI_Init. Кроме того, вы можете передать фиктивные аргументы в MPI_Init, если хотите сохранить оригиналы. :) (Я согласен, что это не очень элегантно, но есть обходной путь.) - person alfC; 07.04.2018


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

person user3208888    schedule 04.04.2014

Меньше накладных расходов, если просто передать два указателя.

person Chad Brewbaker    schedule 17.04.2010
comment
на самом деле я имел в виду вызов функции как MPI_Init(argc, argv); - person Rohit Banga; 27.04.2010
comment
Ну, на практике много раз код MPI представляет собой весь исполняемый файл, поэтому имеет смысл передавать все аргументы командной строки. Однако помните, что argc и argv — это просто имена локальных переменных. Внутри вашего кода перед вызовом MPI_Init() вы можете передать ему все, что хотите. - person Chad Brewbaker; 14.06.2010