수색…


비고

MPI는 분산 (또는 로컬) 프로세스 그룹 간의 통신 표준입니다. 여기에는 데이터 송수신, 일괄 통신 및 기타보다 복잡한 작업이 포함됩니다.

이 표준은 C 및 Fortran 용 API를 제공하지만 다양한 다른 언어에 대한 바인딩도 존재합니다.

버전

번역 표준 출시일
1 mpi-report-1.3-2008-05-30.pdf 1994-05-05
2.0 mpi2-report.pdf 2003-09-15
2.2 mpi22-report.pdf 2009-09-04
3.0 mpi30-report.pdf 2012-09-21
3.1 mpi31-report.pdf 2015-06-04

순위 및 크기

커뮤니케이터 (예 : 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 명령을 실행하기 전에 환경을 초기화하고 마지막으로 완료해야합니다.

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 사용법을 배우기 시작할 때 세 가지 사항이 중요합니다. 먼저 라이브러리를 사용할 준비가되었을 때 라이브러리를 초기화해야합니다 (완료되면 라이브러리를 완성해야합니다). 둘째, 의사 소통 자의 크기 (다른 프로세스에 메시지를 보내는 데 사용하는 것)를 알고 싶을 것입니다. 셋째, 해당 커뮤니케이터에서 자신의 순위를 알고 싶을 것입니다.

#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 호출의 반환 값

거의 모든 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_RETURN 입니다. MPI_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 구현이 오류를 복구하고 프로그램 실행을 계속할 수 있어야한다고 요구하지 않습니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow