我正试图在debian 7上使用openmpi和mpirun运行这个示例hello world程序.
#include <stdio.h>
#include <mpi/mpi.h>
int main (int argc, char **argv) {
int nProcId, nProcNo;
int nNameLen;
char szMachineName[MPI_MAX_PROCESSOR_NAME];
MPI_Init (&argc, &argv); // Start up MPI
MPI_Comm_size (MPI_COMM_WORLD,&nProcNo); // Find out number of processes
MPI_Comm_rank (MPI_COMM_WORLD, &nProcId); // Find out process rank
MPI_Get_processor_name (szMachineName, &nNameLen); // Get machine name
printf ("Hello World from process %d on %s\r\n", nProcId, szMachineName);
if (nProcId == 0)
printf ("Number of Processes: %d\r\n", nProcNo);
MPI_Finalize (); // Shut down MPI
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是MPI_Comm_Rank为进程的所有副本返回0.当我在shell上运行此命令时:
mpirun -np 4 helloWorld
Run Code Online (Sandbox Code Playgroud)
它产生这个输出:
Hello World from process 0 on debian
Number of Processes: 1
Hello World from process 0 on debian
Number of Processes: 1
Hello World from process 0 on debian
Number of Processes: 1
Hello World from process 0 on debian
Number of Processes: 1
Run Code Online (Sandbox Code Playgroud)
为什么进程数仍为1?
Hri*_*iev 15
确保两个mpicc和mpirun来自同一个MPI实现.当mpirun无法向启动的进程提供必要的Universe信息时,最常见的原因是可执行文件是针对不同的MPI实现(甚至是同一实现的不同版本)构建MPI_Init()的,所以回到所谓的单例MPI初始化并创建一个MPI_COMM_WORLD仅包含调用进程的单元.因此,结果是在它们各自的单独MPI_COMM_WORLD实例中的许多MPI过程.
通常是命令mpicc --showme,which mpicc并且which mpirun可以帮助您确定是否确实如此.