【问题标题】:How to run this compiled open MPI program (C)?如何运行这个编译的开放 MPI 程序(C)?
【发布时间】:2014-02-26 22:00:20
【问题描述】:

我正在尝试在以下网址运行示例代码。我用“mpicc twoGroups.c”编译程序并尝试以“./a.out”运行它,但得到以下消息:必须指定 MP_PROCS= 8。终止。

我的问题是如何设置 MP_PROCS=8 ?

在这里https://computing.llnl.gov/tutorials/mpi/的组和通信例程示例

#include "mpi.h"
#include <stdio.h>
#define NPROCS 8

main(int argc, char *argv[])  {
int        rank, new_rank, sendbuf, recvbuf, numtasks,
           ranks1[4]={0,1,2,3}, ranks2[4]={4,5,6,7};
MPI_Group  orig_group, new_group;
MPI_Comm   new_comm;

MPI_Init(&argc,&argv);
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &numtasks);

if (numtasks != NPROCS) {
  printf("Must specify MP_PROCS= %d. Terminating.\n",NPROCS);
  MPI_Finalize();
  exit(0);
  }

sendbuf = rank;

/* Extract the original group handle */
MPI_Comm_group(MPI_COMM_WORLD, &orig_group);

/* Divide tasks into two distinct groups based upon rank */
if (rank < NPROCS/2) {
  MPI_Group_incl(orig_group, NPROCS/2, ranks1, &new_group);
  }
else {
  MPI_Group_incl(orig_group, NPROCS/2, ranks2, &new_group);
  }

/* Create new new communicator and then perform collective communications */
MPI_Comm_create(MPI_COMM_WORLD, new_group, &new_comm);
MPI_Allreduce(&sendbuf, &recvbuf, 1, MPI_INT, MPI_SUM, new_comm);

MPI_Group_rank (new_group, &new_rank);
printf("rank= %d newrank= %d recvbuf= %d\n",rank,new_rank,recvbuf);

MPI_Finalize();
}

【问题讨论】:

标签: c mpi


【解决方案1】:

当您执行 MPI 程序时,您需要使用适当的包装器。大多数时候它看起来像这样:

mpiexec -n <number_of_processes> <executable_name> <executable_args>

所以对于您的简单示例:

mpiexec -n 8 ./a.out

您还会看到使用mpirun 代替mpiexec-np 代替-n。大多数时候两者都很好。

如果您刚刚开始,最好确保您使用的是最新版本的 MPI,这样您就不会遇到旧的错误或奇怪的执行环境。 MPICH 和 Open MPI 是两个最流行的实现。 MPICH 刚刚发布了可用的 3.1 版here,而 Open MPI 有可用的 1.7.4 版here。您通常也可以通过友好的社区包管理器获得其中任何一个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 2012-03-07
    • 1970-01-01
    相关资源
    最近更新 更多