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實現能夠從錯誤中恢復並繼續執行程序。