вот как мы используем функцию 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.
mpirun
из OpenMPI 3.1.1 удаляет свои параметры еще до вызова подпрограмм, так что вы получите argc = 3
еще до вызова MPI_Init
.
- person Jakub Klinkovský; 16.09.2018
мое предположение потенциально позволяет удалить аргументы mpi из командной строки. передача счетчика аргументов по указателю позволяет изменить его значение с точки main.
gtk_init
, которая отфильтровывает некоторые общие параметры командной строки X, такие как --display
и --screen
.
- person el.pescado; 08.07.2010
argc
и argv
перед вызовом MPI_Init
. Кроме того, вы можете передать фиктивные аргументы в MPI_Init
, если хотите сохранить оригиналы. :) (Я согласен, что это не очень элегантно, но есть обходной путь.)
- person alfC; 07.04.2018
Согласно справочным страницам OpenMPI: справочная страница MPI_Init(3) а>
Open MPI принимает аргументы C/C++ argc и argv в main, но не модифицирует, не интерпретирует и не распространяет их.
Я не эксперт, но я считаю, что простой ответ заключается в том, что каждый узел, с которым вы работаете, работает со своей собственной копией кода. Передача этих аргументов позволяет каждому из узлов иметь доступ к argc и argv, даже если они не были переданы через интерфейс командной строки. Эти аргументы передаются исходному или главному узлу, который вызывает MPI_Init . MPI_Init позволяет другим узлам также получить к ним доступ.
Меньше накладных расходов, если просто передать два указателя.