Передача аргументов через командную строку с MPI
Я использую вызовы MPI для запуска процедуры для нескольких процессов с использованием С++.
Первые несколько строк в моей главной функции выглядят так:
int main(int argc, char *argv[]){
int comm_sz;
int my_rank;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
x = atoi(argv[4]);
y = atoi(argv[5]);
Теперь, когда я запускаю и запускаю свою программу, используя
mpiexec -n 1 program 10 10
Я хочу, чтобы x и y были назначены значения 10 и 10, поскольку они являются переданными 4 и 5 аргументами.
Но этого не происходит и присваивает этим переменным 0 и 0 соответственно. и моя программа не запускается по желанию.
У меня есть серийный код, когда я меняю эти числа. Просто, что я новичок в MPI.
Можете ли вы предложить, где я буду ошибаться?
Ответы
Ответ 1
В большинстве реализаций MPI в Linux/Windows/Mac OSX при вызове MPI_Init(&argc, &argv)
список аргументов изменяется так же, как если бы вы выполняли серийную проблему как program 10 10
; он ест список аргументов вплоть до исполняемого файла, который потенциально может содержать любое количество параметров для самой команды mpirun.
В стандарте это не указывается; стандарт оставляет много вещей о запускающих процессах, а процесс инициализации несколько неопределенен, так как MPI должен работать на системах, которые ведут себя совсем по-другому, чем системы типа POSIX. Но я никогда не видел реализацию MPI в среде типа POSIX, которая этого не делает.
(Обновлено для добавления:) g.inozemtsev комментарий к вопросу - отличное, краткое объяснение, почему это происходит.
Ответ 2
#include<stdio.h>
#include<mpi.h>
int main(int argc, char *argv[]){
int comm_sz;
int my_rank;
int x,y;
MPI_Init(&argc, &argv);
MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
x = atoi(argv[1]);
y = atoi(argv[2]);
printf("%d,%d\n",x,y);
}
Попробуйте, MPI рассматривает аргументы после имени программы, поэтому используйте 1 и 2 в качестве аргумента.