mpimpi入门


备注

MPI是一组分布式(或本地)进程之间通信的标准。它包括发送和接收数据,集体通信以及其他更复杂任务的例程。

该标准为C和Fortran提供了API,但也存在与各种其他语言的绑定。

版本

标准发布日期
1 MPI-报告,1.3-2008-05-30.pdf 1994年5月5日
2.0 MPI2-report.pdf 2003-09-15
2.2 mpi22-report.pdf 2009-09-04
3.0 mpi30-report.pdf 2012年9月21日
3.1 mpi31-report.pdf 选择月份

你好,世界!

在开始学习使用MPI时,通常有三件事情很重要。首先,您必须在准备好使用它时初始化库(您还需要在完成后完成它)。其次,您需要知道通信器的大小(用于将消息发送到其他进程的事物)。第三,你会想知道你在那个沟通者中的等级(你在那个沟通者中的进程号)。

#include <mpi.h>
#include <stdio.h>

int main(int argc, char **argv) {
    int size, rank;
    int res;

    res = MPI_Init(&argc, &argv);
    if (res != MPI_SUCCESS)
    {
        fprintf (stderr, "MPI_Init failed\n");
        exit (0);
    }

    res = MPI_Comm_size(MPI_COMM_WORLD, &size);
    if (res != MPI_SUCCESS)
    {
        fprintf (stderr, "MPI_Comm_size failed\n");
        exit (0);
    }
    res = MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    if (res != MPI_SUCCESS)
    {
        fprintf (stderr, "MPI_Comm_rank failed\n");
        exit (0);
    }

    fprintf(stdout, "Hello World from rank %d of %d~\n", rank, size);

    res = MPI_Finalize();
    if (res != MPI_SUCCESS)
    {
        fprintf (stderr, "MPI_Finalize failed\n");
        exit (0);
    }
}
 

如果你像这样运行这个程序:

mpiexec -n 2 ./hello
 

您可能希望获得如下输出:

Hello World from rank 0 of 2!
Hello World from rank 1 of 2!
 

您也可以向后获取该输出(请参阅http://stackoverflow.com/a/17571699/491687 )以获取更多有关此内容的讨论:

Hello World from rank 1 of 2!
Hello World from rank 0 of 2!
 

初始化/敲定

在运行任何MPI命令之前,需要初始化环境,最后完成:

int main(int argc, char** argv)
{
    int res;
    res = MPI_Init(&argc,&argv);
    if (res != MPI_SUCCESS)
    {
      fprintf (stderr, "MPI_Init failed\n");
      exit (0);
    }
    ...
    res = MPI_Finalize();
    if (res != MPI_SUCCESS)
    {
      fprintf (stderr, "MPI_Finalize failed\n");
      exit (0);
    }
}
 

等级和大小

要获得通信器(例如MPI_COMM_WORLD )的大小和本地进程的排名:

int rank, size;
int res;
MPI_Comm communicator = MPI_COMM_WORLD;

res = MPI_Comm_rank (communicator, &rank);
if (res != MPI_SUCCESS)
{
  fprintf (stderr, "MPI_Comm_rank failed\n");
  exit (0);
}
res = MPI_Comm_size (communicator, &size);
if (res != MPI_SUCCESS)
{
  fprintf (stderr, "MPI_Comm_size failed\n");
  exit (0);
}
 

返回MPI调用的值

几乎任何MPI调用都返回一个整数错误代码,表示操作成功。如果没有错误发生,返回码为MPI_SUCCESS

if (MPI_Some_op(...) != MPI_SUCCESS)
{
   // Process error
}
 

如果发生错误,MPI会在返回用户代码之前调用与通信器,窗口或文件对象关联的错误处理程序。有两个预定义的错误处理程序(用户可以定义其他错误处理程序):

  • MPI_ERRORS_ARE_FATAL - 错误导致MPI程序终止
  • MPI_ERRORS_RETURN - 错误导致错误代码传递回用户

通信器和窗口的默认错误处理程序是MPI_ERRORS_ARE_FATAL ;对于文件对象,它是MPI_ERRORS_RETURNMPI_COMM_WORLD 的错误处理程序也适用于与对象无关的所有操作(例如, MPI_Get_count )。因此,在不将错误处理程序设置为MPI_ERRORS_RETURN 情况下检查非I / O操作的返回值是多余的,因为错误的MPI调用将不会返回。

// The execution will not reach past the following line in case of error
int res = MPI_Comm_size(MPI_COMM_WORLD, &size);
if (res != MPI_SUCCESS)
{
    // The following code will never get executed
    fprintf(stderr, "MPI_Comm_size failed: %d\n", res);
    exit(EXIT_FAILURE);
}
 

要启用用户错误处理,必须先更改MPI_COMM_WORLD 的错误处理程序:

MPI_Comm_set_errhandler(MPI_COMM_WORLD, MPI_ERRORS_RETURN);

int res = MPI_Comm_size(MPI_COMM_WORLD, &size);
if (res != MPI_SUCCESS)
{
    fprintf(stderr, "MPI_Comm_size failed: %d\n", res);
    exit(EXIT_FAILURE);
}
 

MPI标准不要求MPI实现能够从错误中恢复并继续执行程序。