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

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

Можете ли вы предложить, где я буду ошибаться?

4b9b3361

Ответ 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 в качестве аргумента.