mpi 튜토리얼
mpi 시작하기
수색…
비고
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 구현이 오류를 복구하고 프로그램 실행을 계속할 수 있어야한다고 요구하지 않습니다.