mpirun没有传递命令行参数

kot*_*zna 0 c mpi ubuntu-12.04

mpirun(和mpiexec)似乎没有将命令行参数传递给我的c代码.

直接从命令行运行我的可执行"gecko"给出了预期:

$ ./gecko  -np 2

main:There are 3 arguments:
arg=./gecko
arg=-np
arg=2
Run Code Online (Sandbox Code Playgroud)

但通过mpirun运行相同是不同的:

$ mpirun -np 2 ./gecko

main:There are 1 arguments:
arg=./gecko
Run Code Online (Sandbox Code Playgroud)

这意味着MPI_init(argc,argv)没有任何参数可供使用.我使用的是MPICH 2的Ubuntu 12.04.

任何人都可以看到为什么没有发生这种情况的原因?

谢谢.

---------------------------编辑---------------------- -----------

网上有很多例子说初始化MPI的方法是通过命令行参数,例如:

#include <stdio.h>
#include “mpi.h”                                
int main(int argc, char* argv[])
{
 int size, rank;
 MPI_Init(&argc, &argv);                       
 MPI_Comm_size(MPI_COMM_WORLD, &size);           
 MPI_Comm_rank(MPI_COMM_WORLD, &rank);
 printf(“Greetings from process %i\n”, rank);
 MPI_Finalize();                                
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

并且执行mpi代码的方法是使用:

mpirun -np 2 ./code_name
Run Code Online (Sandbox Code Playgroud)

所以,如果mpirun没有将参数np和2传递给c代码,那么c代码如何知道应该运行多少个处理器呢?

Jen*_*edt 5

-np参数不是由您的可执行文件解释,而是由mpirun解释.如果要将额外的参数传递给可执行文件,则必须像往常一样在可执行文件名后面列出它们.

如果您需要MPI任务的数量,则应使用为您提供该数字的相应MPI函数.

编辑:

MPI 可以通过给予实现MPI_Init者的任何其他方式的参数传递启动信息.根据您使用的MPI实现,您可能会看到MPI向您的程序传递了更多参数.MPI_Init然后撕掉它需要的所有东西,只留下那些不理解的东西.

您不应该依赖于在您的应用程序中传递约定的任何此类参数.MPI是可移植的,您应该只使用MPI函数来访问运行时参数.