【问题标题】:Passing arguments via command line with MPI使用 MPI 通过命令行传递参数
【发布时间】:2012-02-29 10:39:07
【问题描述】:

我正在使用 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 的新手。

你能建议我哪里出错了吗?

【问题讨论】:

  • 您是否尝试过简单地打印argv 的内容?结果如何?
  • 我做到了。当我打印出数组中的内容时,它确实识别出两个参数 10、10,但不是在位置 4 和 5。
  • 似乎将它们读作 argv[1] 和 argv[2]。我解决了我的问题,是的,但我想知道为什么会这样。我不完全理解 MPI_Init。
  • 当我打印出另外两个参数 argv[4] 和 argv[5] 时,参数是:OMPI_MCA_orte_precondition_transports=70175593b8f2c60b-4d521364633b88b3 和这个:OMPI_MCA_rds=proxy
  • 这是一种思考方式:在您提供的命令中,这两个 10 值不在位置 4 和 5,而是在位置 1 和 2。当您运行 mpiexec 时,它会解析它的参数并看到您希望在集群中的所有机器上运行program 10 10。 mpiexec 还可以附加额外的参数(例如您看到的这些 OpenMPI 值),但对 MPI_Init 的调用将修改 argcargv 以使其不可见(请参阅 Jonathan Dursi 的答案)。

标签: c++ mpi


【解决方案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 作为参数。

【讨论】:

  • 7年前评论区已经回答了这个问题。
  • 仍然有助于提升答案,确实是推荐的。
【解决方案2】:

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

标准没有规定这一点;该标准在启动过程和初始化过程方面留下了很多模糊不清的内容,因为 MPI 必须在行为与 POSIX 类型系统非常不同的系统上工作。但我从未见过在 POSIX 类型的环境中不执行此操作的 MPI 实现。

(已更新以添加:) g.inozemtsev 对该问题的评论是对为什么会发生这种情况的极好、简洁的解释。

【讨论】:

    猜你喜欢
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2021-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多