通过MPI命令行传递参数

时间:2012-02-07 23:42:08

标签: c++ mpi

我正在使用MPI调用使用c ++在多个进程上运行一个过程。 我的Main函数中的前几行看起来像:

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的新手。

你能说明我哪里出错吗?

2 个答案:

答案 0 :(得分:18)

在Linux / Windows / Mac OSX上的大多数MPI实现中,当您调用MPI_Init(&argc, &argv)时,参数列表会被修改,就像您将串行问题作为program 10 10运行一样;它将参数列表放到可执行文件中,这可能包含mpirun命令本身的任意数量的选项。

标准没有具体说明;标准留下了很多关于启动进程和初始化过程的事情,因为MPI必须处理与POSIX类型系统行为非常不同的系统。但我从来没有在POSIX类型的环境中看到过没有这样做的MPI实现。

(更新为添加:) g.inozemtsev对该问题的评论是关于为什么发生这种情况的简明扼要的解释。

答案 1 :(得分:-1)

#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作为参数。