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