【发布时间】: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的调用将修改argc和argv以使其不可见(请参阅 Jonathan Dursi 的答案)。