메시지 전달 인터페이스
Message Passing Interface이 문서는 갱신할 필요가 있습니다.MPI-4.0은 2021년 6월 MPI 포럼에서 승인되었습니다.2021년 10월) 하여 이 . ( |
MPI(Message Passing Interface)는 병렬 컴퓨팅 [1]아키텍처에서 기능하도록 설계된 표준화된 휴대용 메시지 전달 표준입니다.MPI 표준은 C, C++ 및 Fortran에서 휴대용 메시지 전달 프로그램을 작성하는 광범위한 사용자에게 유용한 라이브러리 루틴의 구문과 의미를 정의합니다.병렬 소프트웨어 산업의 발전을 촉진하고 휴대성과 확장성이 뛰어난 대규모 병렬 애플리케이션의 개발을 장려한 오픈 소스 MPI 구현이 몇 가지 있습니다.
역사
이 메시지는 1991년 여름 오스트리아 산간 별장에서 소규모 연구자 그룹이 논의를 시작하면서 시작됐다.이 논의에서 1992년 4월 29~30일 [2]버지니아주 윌리엄스버그에서 열린 분산 메모리 환경의 메시지 전달 표준에 관한 워크숍이 열렸습니다.Williamsburg의 참석자들은 표준 메시지 전달 인터페이스에 필수적인 기본 기능에 대해 논의하고 표준화 프로세스를 계속하기 위해 작업 그룹을 설립했습니다.잭 동가라, 토니 헤이, 데이비드 W. 워커는 1992년 11월에 예비 초안인 "MPI1"을 제출했다.1992년 11월 미니애폴리스에서 MPI 실무그룹 회의가 열렸고 표준화 과정을 보다 공식적인 기반 위에 두기로 결정했다.MPI 작업 그룹은 1993년 첫 9개월 동안 6주마다 만났다.MPI 표준 초안은 1993년 [3]11월 Supercomputing '93 컨퍼런스에서 발표되었습니다.MPI에 약간의 변화를 가져온 공개 논평 이후, MPI 버전 1.0은 1994년 6월에 출시되었습니다.이러한 회의와 이메일 토론이 함께 MPI 포럼을 구성했으며, MPI 포럼의 멤버십은 고성능 컴퓨팅 커뮤니티의 모든 구성원에게 개방되었습니다.
MPI의 노력에는 주로 미국과 유럽에 있는 40개 기관에서 80명이 참여했다.동시 컴퓨터의 주요 벤더는 대학, 정부 연구소 및 업계의 연구원들과 협력하여 MPI 작업에 참여했습니다.
MPI는 효율적으로 구현할 수 있는 명확하게 정의된 기본 루틴 세트를 병렬 하드웨어 벤더에 제공합니다.그 결과 하드웨어 벤더는 이 표준적인 저레벨 루틴 컬렉션을 기반으로 병렬 머신과 함께 제공되는 분산 메모리 통신 환경을 위한 고레벨 루틴을 작성할 수 있습니다.MPI는 기본 사용자에게 사용하기 쉬운 휴대용 인터페이스를 제공하지만 프로그래머가 고급 머신에서 사용할 수 있는 고성능 메시지 전달 작업을 사용할 수 있는 강력한 인터페이스를 제공합니다.
메시지 전달을 위한 범용 표준을 만들기 위해 연구자들은 단일 시스템에 기반하지 않고 IBM, Intel, nCUBE, PVM, Express, P4 및 PARMACS에 의해 설계된 시스템을 포함한 여러 시스템의 가장 유용한 기능을 통합했습니다.메시지 전달 패러다임은 휴대성이 넓기 때문에 매력적이며 분산 메모리 및 공유 메모리 멀티프로세서, 워크스테이션 네트워크 및 이들 요소의 조합에 사용할 수 있습니다.이 패러다임은 네트워크 속도 또는 메모리 아키텍처에 관계없이 여러 설정에서 적용할 수 있습니다.
MPI 회의 지원은 보조금 ASC-9310330, NSF 과학기술센터 협력협정 번호 CCR-8809615, Esprit Project P6643에 따라 DARPA와 미국 국립과학재단(NSF)에서 일부, 유럽위원회가 Esprit Project P6643을 통해 제공했다.테네시 대학교는 또한 MPI 포럼에 재정적인 기여를 했다.
개요
MPI는 병렬 컴퓨터를 프로그래밍하기[4] 위한 통신 프로토콜입니다.포인트 투 포인트 통신과 집합 통신이 모두 지원됩니다.MPI는 "메시지 전달 애플리케이션 프로그래머 인터페이스이며, 그 기능이 어떤 [5]구현에서도 어떻게 동작해야 하는지에 대한 프로토콜 및 시맨틱 사양입니다." MPI의 목표는 고성능, 확장성 및 휴대성이다.MPI는 [6]오늘날에도 고성능 컴퓨팅에서 사용되는 지배적인 모델입니다.
MPI는 주요 표준 기구에 의해 승인되지 않았지만 분산 메모리 시스템에서 실행되는 병렬 프로그램을 모델링하는 프로세스 간의 통신에 대한 사실상의 표준이 되었습니다.컴퓨터 클러스터와 같은 실제 분산 메모리 슈퍼컴퓨터는 종종 이러한 프로그램을 실행합니다.
주요 MPI-1 모델에는 공유 메모리 개념이 없으며 MPI-2에는 제한된 분산 공유 메모리 개념만 있습니다.그러나 MPI 프로그램은 공유 메모리 컴퓨터에서 정기적으로 실행되며 MPIH와 Open MPI 모두 메시지 전송에 공유 메모리를 사용할 [7][8]수 있습니다.MPI는 메모리 인접성을 장려하기 때문에 MPI 모델을 중심으로 프로그램을 설계하면(명시적인 공유 메모리 모델과 달리) NUMA 아키텍처보다 유리합니다.명시적 공유 메모리 프로그래밍은 MPI-3에서 [9][10][11]도입되었습니다.
MPI는 OSI 참조 모델의 레이어5 이상에 속하지만, 실장에서는 대부분의 레이어를 커버할 수 있으며, 트랜스포트 레이어에서 소켓과 Transmission Control Protocol(TCP)이 사용됩니다.
대부분의 MPI 구현은 C, C++, Fortran(API)에서 직접 호출 가능한 특정 루틴 세트 및 이러한 라이브러리와 인터페이스할 수 있는 언어(C#, Java 또는 Python 등)로 구성됩니다.오래된 메시지 전달 라이브러리에 비해 MPI의 장점은 이식성(MPI가 거의 모든 분산 메모리 아키텍처에 구현되어 있기 때문에)과 속도(각 구현이 실행되는 하드웨어에 대해 원칙적으로 최적화되어 있기 때문에)입니다.
MPI는 콜 및 언어 바인딩에 Language Independent Specifications(LIS; 언어 독립 사양)를 사용합니다.첫 번째 MPI 표준은 LIS와 함께 ANSI C 및 Fortran-77 바인딩을 지정했습니다.이 초안은 Supercomputing 1994([12]1994년 11월)에서 발표되었고 곧 완성되었습니다.2008년 [13]MPI-1 시리즈의 최종판으로 출시된 MPI-1.3 규격은 약 128개 기능이다.
현재, 그 기준이 몇가지 버전:버전, 병렬/O, 역동적인 공정 관리와 수신자 부담에 확장을 포함합니다 멀리 떨어진 기억 operations,[14]과 MPI-3.1(MPI-3)등 새로운 기능이 포함되어 있는 정적 런타임 환경, MPI-2.2(MPI-2), 메시지 패스 강조한다 13(일반적으로 단축된 MPI-1)이 있다.ive비호환 버전 및 일방적인 작업에 대한 확장 기능을 가진 운영.[15]MPI-2의 LIS는 500개 이상의 기능을 지정하고 ISO C, ISO C++ 및 Fortran 90에 대한 언어 바인딩을 제공합니다.오브젝트 상호 운용성도 추가되어 보다 쉬운 혼합 언어 메시지 전달 프로그래밍이 가능하게 되었습니다.1996년에 완성된 MPI-2 표준화의 부작용은 MPI-1 표준을 명확히 하여 MPI-1.2를 만들었다.
MPI-2는 대부분 MPI-1의 슈퍼셋이지만 일부 기능은 사용되지 않습니다.MPI-1.3 프로그램은 MPI-2 규격에 준거한 MPI 실장 하에서도 동작합니다.
MPI-3에는 새로운 Fortran 2008 바인딩이 포함되어 있으며 사용되지 않는 C++ 바인딩과 사용되지 않는 많은 루틴 및 MPI 오브젝트를 삭제합니다.
MPI는 1989년에 개발된 일반적인 분산 환경 및 메시지 전달 시스템인 PVM(Parallel Virtual Machine)과 자주 비교됩니다.PVM은 표준 병렬 메시지 전달의 필요성을 유발하는 시스템 중 하나입니다.스레드 공유 메모리 프로그래밍 모델(Pthreads 및 OpenMP 등)과 메시지 패싱 프로그래밍(MPI/PVM)은 상호 보완적인 것으로 간주할 수 있으며, 여러 개의 공유 메모리 노드를 가진 서버 등에서 함께 사용되기도 합니다.
기능
이 섹션은 어떠한 출처도 인용하지 않습니다. 2021년 7월 (이 를 에 대해 합니다) |
MPI 인터페이스는 언어 고유의 구문(바인딩) 및 몇 가지 언어 고유의 기능을 사용하여 언어 독립적인 방식으로 일련의 프로세스 간에 필수적인 가상 토폴로지, 동기화 및 통신 기능을 제공합니다.MPI 프로그램은 항상 프로세스와 함께 작동하지만 프로그래머들은 일반적으로 프로세스를 프로세서라고 부릅니다.일반적으로 성능을 최대화하기 위해 각 CPU(또는 멀티코어 머신의 코어)에는 1개의 프로세스만 할당됩니다.이 할당은 실행 시 MPI 프로그램(보통은 mpirun 또는 mpixec)을 시작하는 에이전트를 통해 이루어집니다.
MPI 라이브러리 기능에는 포인트 투 포인트 랑데부 타입의 송수신 조작, 데카르트 또는 그래프와 같은 논리 프로세스 토폴로지 선택, 프로세스 쌍 간의 데이터 교환(송수신 조작), 계산의 일부 결과 결합(수집 및 삭감 조작), 노드 동기화(브라이어 op)가 포함됩니다.컴퓨팅 세션의 프로세스 수, 프로세스가 매핑되어 있는 현재의 프로세서 ID, 논리 토폴로지로 액세스 가능한 인접 프로세스 등 네트워크 관련 정보를 얻을 수 있습니다.포인트 투 포인트 조작은 동기식, 비동기식, 버퍼링식 및 ready 형식으로 이루어지며 랑데부 전송의 동기화 측면에 대해 비교적 강한 의미와 약한 의미 모두를 사용할 수 있습니다.대부분의 구현에서는 많은 미처리 작업이[clarification needed] 비동기 모드에서 가능합니다.
MPI-1과 MPI-2는 모두 통신과 계산이 중복되는 구현을 가능하게 하지만 실제와 이론은 다릅니다.MPI는 스레드세이프 인터페이스도 지정합니다.이 인터페이스는 인터페이스 내에서 숨겨진 상태를 회피하는 데 도움이 되는 응집 및 결합 전략을 갖추고 있습니다.멀티스레드 포인트 투 포인트 MPI 코드는 비교적 쉽게 쓸 수 있으며 일부 구현에서는 이러한 코드를 지원합니다.멀티스레드 일괄 커뮤니케이션은 아래에 설명된 바와 같이 Communicator를 여러 개 복사하여 수행하는 것이 가장 좋습니다.
개념
MPI에는 몇 가지 기능이 있습니다.다음 개념은 이러한 모든 능력에 대한 컨텍스트를 제공하며 프로그래머가 응용 프로그램에서 사용할 기능을 결정하는 데 도움이 됩니다.MPI의 8가지 기본 개념 중 4가지는 MPI-2에 고유한 개념이다.
통신기
Communicator 객체는 MPI 세션의 프로세스 그룹을 연결합니다.각 통신기는 포함된 각 프로세스에 독립된 식별자를 부여하고 포함된 프로세스를 정렬된 토폴로지에 배치한다.MPI에는 명시적인 그룹도 있지만 이들은 주로 다른 통신기를 만들기 전에 프로세스 그룹을 정리하고 재구성하는 데 도움이 됩니다.MPI는 단일 그룹 통신자 내 동작 및 양방향 통신자 간 통신을 파악합니다.MPI-1에서는 단일 그룹 조작이 가장 일반적입니다.쌍무 운영은 주로 MPI-2에 나타나며, 여기에는 집단 통신과 동적 프로세스 관리가 포함됩니다.
여러 MPI 명령을 사용하여 통신기를 분할할 수 있습니다.이러한 명령어에는 다음이 포함됩니다.MPI_COMM_SPLIT
여기서 각 프로세스는 그 색을 가지고 있다고 선언함으로써 여러 색상의 서브캐퍼레이터 중 하나를 결합합니다.
포인트 투 포인트 기본
많은 중요한 MPI 기능은 두 특정 프로세스 간의 통신을 포함합니다.일반적인 예로는MPI_Send
이를 통해 1개의 지정된 프로세스가 두 번째 지정된 프로세스에 메시지를 보낼 수 있습니다.포인트 투 포인트 연산은 패턴화 또는 불규칙한 통신에 특히 유용합니다.예를 들어 각 프로세서가 계산 단계 간에 특정 다른 프로세서와 정기적으로 데이터 영역을 스왑하는 데이터 병렬 아키텍처나 마스터가 새로운 태스크 데이터를 슬라브에 전송하는 마스터 슬레이브 아키텍처입니다.e 이전 작업이 완료될 때마다.
MPI-1은 블로킹 및 논블로킹 포인트 투 포인트 통신 메커니즘과 일치하는 수신 요구가 이미 이루어진 경우에만 송신 요구를 할 수 있는 이른바 'ready-send' 메커니즘을 지정합니다.
집합적 기본
집합 함수는 프로세스 그룹(프로세스 풀 전체 또는 프로그램 정의 서브셋을 의미할 수 있음)의 모든 프로세스 간의 통신을 포함합니다.일반적인 함수는MPI_Bcast
call ('call'의 줄임말)이 함수는 하나의 노드에서 데이터를 가져와 프로세스 그룹의 모든 프로세스로 전송합니다.리버스 오퍼레이션은MPI_Reduce
콜: 그룹내의 모든 프로세스로부터 데이터를 취득해, 연산(합계등)을 실행하고, 그 결과를 1 개의 노드에 보존합니다. MPI_Reduce
는, 대규모 분산 계산의 개시 또는 종료시에 도움이 되는 경우가 많습니다.각 프로세서는 데이터의 일부에서 동작해, 그 결과를 조합합니다.
다른 작업에서는 다음과 같은 보다 고도의 작업을 수행합니다.MPI_Alltoall
n번째 노드가 각각에서 n번째 데이터 항목을 가져오도록 n개의 데이터 항목을 재배치합니다.
파생 데이터 유형
많은 MPI 함수에서는 프로세스 간에 전송되는 데이터 유형을 지정해야 합니다.이는 MPI가 노드마다[16] 유형이 다르게 표시될 수 있는 이기종 환경을 지원하는 것을 목적으로 하기 때문입니다(예를 들어 유형이 서로 다른 엔디안성을 가진 CPU 아키텍처를 실행하고 있을 수 있습니다).이 경우 MPI 구현은 데이터 [16]변환을 수행할 수 있습니다.C 언어에서는 유형 자체를 매개 변수로 전달할 수 없으므로 MPI는 상수를 미리 정의합니다.MPI_INT
,MPI_CHAR
,MPI_DOUBLE
편지를 주고받다int
,char
,double
,기타.
다음으로 C의 어레이를 통과하는 예를 나타냅니다.int
모든 프로세스에서1로 이동합니다.하나의 수신 프로세스는 "루트" 프로세스라고 불리며 지정된 프로세스일 수 있지만 일반적으로 프로세스 0이 됩니다.모든 프로세스에서 어레이를 루트로 전송하도록 요구됩니다.MPI_Gather
이는 각 프로세스(루트 자체 포함)가 콜하는 것과 같습니다.MPI_Send
그리고 루트는 해당하는 수의 순서를 만듭니다.MPI_Recv
이들 어레이를 모두 대규모 [17]어레이로 조립할 필요가 있습니다.
인트 송신 어레이[100]; 인트 뿌리 = 0; /* 또는 기타 */ 인트 num_procs, *recv_array; MPI_Comm_size(통신, &num_procs); recv_array = 마로크(num_procs * 크기(송신 어레이)); MPI_수집(송신 어레이, 크기(송신 어레이) / 크기(*송신 어레이), MPI_INT, recv_array, 크기(송신 어레이) / 크기(*송신 어레이), MPI_INT, 뿌리, 통신);
단, 100이 아닌 하나의 블록으로 데이터를 전송할 수 있습니다.int
s. 이를 위해 "연속 블록" 파생 데이터 유형을 정의합니다.
MPI_데이터형 새로운 타입; MPI_Type_continuous(100, MPI_INT, &새로운 타입); MPI_Type_commit(&새로운 타입); MPI_수집(배열, 1, 새로운 타입, 수신_어레이, 1, 새로운 타입, 뿌리, 통신);
클래스 또는 데이터 구조를 전달하기 위해MPI_Type_create_struct
MPI에서 파생된 데이터 유형을 만듭니다.MPI_predefined
다음과 같은 데이터 유형:
인트 MPI_Type_create_structure(인트 세어보세요, 인트 *블록렌, MPI_Aint *디스패치, MPI_데이터형 *유형, MPI_데이터형 *새로운 타입)
여기서:
count
는 블록의 수이며 배열의 길이(요소 단위)를 지정합니다.blocklen
,disp
,그리고.type
.blocklen
각 블록의 요소 수가 포함되어 있습니다.disp
각 블록의 바이트 변위가 포함됩니다.type
에 각 블록의 요소 유형을 나타냅니다.newtype
(출력)은 이 함수에 의해 생성된 새로운 파생 유형을 포함합니다.
그disp
컴파일러가 클래스 또는 데이터 구조 내의 변수를 패딩할 수 있기 때문에 (요건) 어레이는 데이터 구조 정렬에 필요합니다.서로 다른 필드 간의 거리를 찾는 가장 안전한 방법은 메모리 내의 주소를 얻는 것입니다.이 작업은 다음과 같이 종료됩니다.MPI_Get_address
이는 보통 C와 동일합니다.&
연산자이지만 메모리 [18]분할을 처리할 때는 그렇지 않을 수 있습니다.
데이터 구조를 하나의 블록으로 전달하는 것은 한 번에 하나의 항목을 통과하는 것보다 훨씬 빠릅니다. 특히 작업을 반복해야 하는 경우에는 더욱 그렇습니다.이는 고정 크기 블록이 [19]전송 중에 직렬화할 필요가 없기 때문입니다.
다음과 같은 데이터 구조가 지정됩니다.
구조 A { 인트 f; 짧다 p; }; 구조 B { 구조 A a; 인트 pp, VP; };
MPI에서 파생된 데이터 유형을 구축하기 위한 C 코드는 다음과 같습니다.
정적인 컨스턴트 인트 블록렌[] = {1, 1, 1, 1}; 정적인 컨스턴트 MPI_Aint 디스패치[] = { 오프셋(구조 B, a) + 오프셋(구조 A, f), 오프셋(구조 B, a) + 오프셋(구조 A, p), 오프셋(구조 B, pp), 오프셋(구조 B, VP) }; 정적인 MPI_데이터형 유형[] = {MPI_INT, MPI_짧다, MPI_INT, MPI_INT}; MPI_데이터형 새로운 타입; MPI_Type_create_structure(크기(유형) / 크기(*유형), 블록렌, 디스패치, 유형, &새로운 타입); MPI_Type_commit(&새로운 타입);
MPI-2 개념
일방적인 커뮤니케이션
MPI-2는 3개의 일방적인 통신 조작을 정의합니다.MPI_Put
,MPI_Get
,그리고.MPI_Accumulate
리모트 메모리에의 기입, 리모트 메모리에서의 판독, 및 같은 메모리상의 삭감 조작을 실시합니다.또, 이 통신(글로벌, 페어, 및 리모트락)을 동기화하는 3개의 다른 방식도 정의되어 있습니다.이 사양에서는, 이러한 조작이 동기 포인트까지 행해지는 것을 보증하고 있지 않기 때문입니다.
이러한 타입의 콜은, 동기가 불편하게 되는 알고리즘(분산 매트릭스 곱셈 등)이나, 다른 프로세서가 데이터상에서 동작하고 있을 때에 부하를 분산하는 것이 태스크에 있어서 바람직한 경우에 도움이 되는 경우가 많습니다.
동적 프로세스 관리
이 섹션은 확장해야 합니다.추가함으로써 도움이 될 수 있습니다. (2008년 6월) |
주요 측면은 "MPI 프로세스가 새로운 MPI 프로세스 작성에 참여하거나 별도로 시작된 MPI 프로세스와의 통신을 확립할 수 있는 능력"이다.MPI-2 사양은 MPI 프로세스가 동적으로 통신을 확립할 수 있는3개의 주요 인터페이스를 기술하고 있습니다.MPI_Comm_spawn
,MPI_Comm_accept
/MPI_Comm_connect
그리고.MPI_Comm_join
.그MPI_Comm_spawn
인터페이스를 사용하면 MPI 프로세스가 이름 있는 MPI 프로세스의 여러 인스턴스를 생성할 수 있습니다.새로 생성된 MPI 프로세스 세트는 새로운 MPI 프로세스를 형성합니다.MPI_COMM_WORLD
단, 부모 및 인터커뮤니케이터와 통신할 수 있습니다. MPI_Comm_spawn_multiple
는 생성된 인스턴스마다 다른 [20]인수를 가진 다른 바이너리를 만들 수 있는 대체 인터페이스입니다.
I/O
이 섹션은 확장해야 합니다.추가함으로써 도움이 될 수 있습니다. (2008년 6월) |
병렬 I/[21]O 기능은 MPI-IO라고도 불리며 분산형 시스템의 I/O 관리를 MPI로 추상화하고 기존 파생 데이터형 기능을 사용하여 패턴화된 방식으로 파일에 쉽게 액세스할 수 있도록 설계된 일련의 기능을 말합니다.
이 기능에 대해 실시된 연구 결과에 따르면 MPI-IO를 사용하여 높은 성능을 얻는 것은 간단한 일이 아닙니다.예를 들어, MPI I/O 라이브러리를 사용한 sparse matrix-vector의 곱셈 구현은 작은 성능 이득의 일반적인 동작을 보여주지만,[22] 이러한 결과는 결정적이지 않습니다.MPI-IO에 집단 I/O가[23] 구현되고 나서야 MPI-IO가 널리 채택되기 시작했습니다.집합적 I/O는 프로세스가 소규모 및 비연속적인 I/O 작업을 대규모 및 연속적인 I/O 작업으로 일괄 변환함으로써 애플리케이션의 I/O 대역폭을 대폭 향상시키고 잠금 및 디스크 탐색 오버헤드를 줄입니다.MPI-IO는 방대한 성능상의 이점 덕분에 HDF5 및 Parallel NetCDF와 같은 많은 최신 I/O 라이브러리의 기반이 되는 I/O 계층이 되었습니다.그 인기로 인해 레이아웃 인식 I[24]/O 및 파일 간 [25][26]통합과 같은 집단 I/O 최적화에 대한 연구도 시작되었습니다.
공식 구현
- MPI 1.x 표준의 최초 구현은 Argonne National Laboratory(ANL)와 미시시피 주립 대학의 MPIH였습니다.IBM은 또한 초기 구현자였으며, 대부분의 90년대 초 슈퍼 컴퓨터 회사들은 MPICH를 상용화하거나 자체 구현체를 구축했습니다.오하이오 Supercomputer Center의 RAM/MPI는 또 다른 초기 오픈 구현입니다.ANL은 10년 이상 MPICH 개발을 계속하여 현재는 MPI-3.1 표준을 구현한 MPICH-3.2를 제공하고 있습니다.
- Open MPI(Open MPI와 혼동하지 말 것)는 FT-MPI, LA-MPI, LAM/MPI 및 PACX-MPI가 병합하여 형성되었으며 많은 TOP-500 슈퍼컴퓨터에서 볼 수 있습니다.
MPICH, RAM 및 HP, Intel, Microsoft 및 NEC의 상용 구현을 포함한 기타 작업의 파생 모델도 다수 있습니다.
사양은 C 및 Fortran 인터페이스를 요구하지만 MPI 구현에 사용되는 언어는 실행 시 지원되는 언어와 일치하도록 제한되지 않습니다.대부분의 구현은 C, C++ 및 어셈블리 언어를 조합하여 C, C++ 및 Fortran 프로그래머를 대상으로 합니다.바인딩은 Perl, Python, R, Ruby, Java 및 CL을 포함한 다른 많은 언어에 사용할 수 있습니다(#Language 바인딩 참조).
MPI 구현의 ABI는 MPIH 파생상품과 Open MPI 파생상품으로 대략 나뉘기 때문에 한 패밀리의 라이브러리가 같은 패밀리의 1개의 드롭인 대체상품으로 기능하지만 패밀리 간에 직접 교환은 불가능합니다.프랑스 CEA는 이러한 [27]스위치를 용이하게 하기 위해 래퍼 인터페이스를 유지합니다.
하드웨어
MPI 하드웨어 연구는 각 노드의 RAM 칩 마이크로 회로에 MPI 작업을 구축하는 등 하드웨어에 직접 MPI를 구현하는 데 초점을 맞추고 있습니다.이 접근방식은 언어, 운영체제 및 CPU와는 무관하지만 쉽게 업데이트하거나 제거할 수 없습니다.
MPI 큐의 하드웨어 처리 및 RDMA를 사용하여 CPU나 OS 커널의 개입 없이 메모리와 네트워크 인터페이스 컨트롤러 간에 직접 데이터를 전송하는 등 작업의 하나 또는 여러 부분에 하드웨어 액셀러레이션을 추가하는 방법도 있습니다.
컴파일러 래퍼
mpicc(및 마찬가지로 mpic++, mpif90 등)는 MPI를 사용하는 코드를 컴파일할 때 필요한 명령줄 플래그를 설정하기 위해 기존 컴파일러를 감싸는 프로그램입니다.일반적으로 코드를 컴파일하여 MPI [28]라이브러리에 링크할 수 있도록 몇 개의 플래그를 추가합니다.
언어 바인딩
바인딩은 MPIH나 Open MPI 등의 기존 MPI 구현을 랩핑하여 MPI 지원을 다른 언어로 확장하는 라이브러리입니다.
공통 언어 인프라스트럭처
2개의 공통 언어 인프라스트럭처를 관리했습니다.NET 실장은 순수 Mpi입니다.NET[29] 및 MPINET은 [30]BSD 스타일의 라이선스로 라이선스를 취득한 인디애나 대학의 연구 활동입니다.Mono와 호환되며 기본 저지연 MPI 네트워크 패브릭을 최대한 활용할 수 있습니다.
자바
Java는 공식적인 MPI 바인딩을 가지고 있지 않지만 성공과 호환성이 다른 두 그룹을 연결하려고 합니다.첫 번째 시도 중 하나는 Bryan Carpenter의 mpiJava로,[31] 기본적으로 로컬 C MPI 라이브러리에 대한 Java Native Interface(JNI; Java 네이티브 인터페이스) 래퍼 세트이며, 결과적으로 제한된 이식성을 가진 하이브리드 구현이 이루어졌으며, 이 또한 사용되는 특정 MPI 라이브러리에 대해 컴파일되어야 합니다.
그러나 이 원래 프로젝트에서는 mpiJava API[32](같은 C++ 바인딩에 근접한 사실상의 Java용 MPI API)도 정의되어 있어 후속 Java MPI 프로젝트에서 채택되었습니다.덜 사용되는 API 중 하나는 MPJ API로, 좀 더 객체 지향적이고 Sun Microsystems의 코딩 [33]규약에 가깝게 설계되었다.API를 넘어 Java MPI 라이브러리는 로컬 MPI 라이브러리에 의존하거나 Java에서 메시지 전달 기능을 구현할 수 있습니다.또한 P2P-MPI와 같은 일부 기능은 피어 투 피어 기능을 제공하며 혼합 플랫폼 동작을 허용합니다.
Java/MPI의 가장 어려운 부분 중 일부는 명시적인 포인터의 부족과 객체의 선형 메모리 주소 공간 등의 Java 특성에서 비롯되며, 이로 인해 다차원 배열 및 복잡한 객체의 전송이 비효율적입니다.회피책에는 보통 한 번에 한 줄씩 전송하거나 송수신 양쪽에서 명시적인 디시리얼라이제이션과 캐스팅을 수행하고, 1차원 어레이를 사용하여 C 또는 Fortran과 같은 어레이를 시뮬레이션하며, 단일 요소 어레이를 사용하여 원시 유형을 포인터하는 것이 포함되므로 프로그래밍 스타일은 크게 다릅니다.om Java 표기법
다른 자바 메시지 전달 시스템은 MPJ Express입니다.[34]최신 버전은 클러스터 및 멀티코어 구성에서 실행할 수 있습니다.클러스터 구성에서는 클러스터 및 클라우드에서 병렬 Java 애플리케이션을 실행할 수 있습니다.여기서는 Java 소켓 또는 Myrinet과 같은 특수 I/O 인터커넥트가 MPJ Express 프로세스 간의 메시징을 지원할 수 있습니다.또, 네이티브 디바이스를 사용해 MPI의 네이티브 C 실장을 이용할 수도 있습니다.멀티코어 구성에서는 병렬 Java 애플리케이션이 멀티코어 프로세서 상에서 실행된다.이 모드에서는 MPJ Express 프로세스가 Java 스레드로 표시됩니다.
줄리아.
매트랩
MATLAB을 사용한 MPI의 학술적인 실장은 몇 가지 있습니다.MATLAB에는 MPI와 PVM을 사용한 독자적인 병렬 확장 라이브러리가 있습니다.
OCaml
OCamlMPI 모듈은[36] MPI 기능의 대규모 서브셋을 구현하여 과학 컴퓨팅에서 활발하게 사용되고 있습니다.모듈을 사용하여 11,000줄의 OCaml 프로그램을 "MPI-ified"하고 500줄의 코드를 추가하며 약간의 재구성을 수행했으며 슈퍼컴퓨터의 [37]최대 170개 노드에서 우수한 결과를 얻었습니다.
PARI/GP
PARI/GP는 MPI를 멀티스레드 엔진으로 사용하도록 구축되어[38] MPI 클러스터에서 병렬 PARI 및 GP 프로그램을 변경하지 않고 실행할 수 있습니다.
파이썬
Python에서의 MPI 구현에는 pyMPI, mpi4py,[39] pypar,[40][41] MYMPI 및 ScientificPython에서의 MPI 서브모듈이 포함됩니다.pyMPI는 pypar, MYMPI, ScientificPython의 모듈이 Import 모듈인 반면 pympar는 변종 Python 인터프리터이기 때문에 주목할 만하다.콜의 수신처를 결정하는 것은, 코더의 일이 됩니다.MPI_Init
속한다.
최근[when?] Boost C++ 라이브러리가 Boost를 취득했습니다.MPI Python 바인딩을 포함한 [42]MPI.이것은 특히 C++와 Python을 혼합하는 데 도움이 됩니다.2016년 10월[update] 현재 Boost:MPI의 Python 바인딩은 CentOS에서 [43]아직 수정되지 않은 패키징 버그를 가지고 있습니다.
R
MPI의 R바인딩에는 Rmpi와[44] [45]pbdMPI가 있습니다.여기서 Rmpi는 매니저와 워커의 병렬화에 중점을 두고 pbdMPI는 SPMD 병렬화에 중점을 둡니다.두 구현 모두 Open MPI 또는 MPIH2를 완전히 지원합니다.
프로그램 예시
여기 C로 쓰여진 MPI의 "Hello, World!" 프로그램이 있습니다.이 예에서는, 각 프로세서에 「hello」메시지를 송신해, 3회 간격으로 조작해, 결과를 메인 프로세스로 되돌리고, 메세지를 인쇄합니다.
/* Hello World MPI 테스트 프로그램 */ #실패하다 <고객명>님.h> #실패하다 <stdio.h> #실패하다 <문자열>h> #실패하다 <mpi.h> 인트 주된(인트 argc, 차 **argv) { 차 부프[256]; 인트 my_랭크, num_procs; /* 커뮤니케이션에 필요한 인프라스트럭처 초기화*/ MPI_Init(&argc, &argv); /* 이 프로세스의 특정*/ MPI_Comm_랭크(MPI_COMM_WORLD, &my_랭크); /* 액티브한 총 프로세스 수 확인*/ MPI_Comm_size(MPI_COMM_WORLD, &num_procs); /* 지금까지 모든 프로그램은 동일하게 동작하고 있습니다. 여기에서는 프로그램의 역할을 구별하기 위해 순위를 확인합니다.*/ 한다면 (my_랭크 == 0) { 인트 other_랭크; 인쇄물("%i 프로세스가 있습니다.\n", num_procs); /* 다른 모든 프로세스에 메시지 보내기 */ 위해서 (other_랭크 = 1; other_랭크 <> num_procs; other_랭크++) { 스프린트(부프, "%i님 안녕하세요!", other_랭크); MPI_송신(부프, 크기(부프), MPI_CHAR, other_랭크, 0, MPI_COMM_WORLD); } /* 기타 모든 프로세스에서 메시지 수신 */ 위해서 (other_랭크 = 1; other_랭크 <> num_procs; other_랭크++) { MPI_Recv(부프, 크기(부프), MPI_CHAR, other_랭크, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 인쇄물(%s\n", 부프); } } 또 다른 { /* 프로세스 #0에서 메시지 수신 */ MPI_Recv(부프, 크기(부프), MPI_CHAR, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE); 주장하다(메모리(부프, "안녕하세요", 6) == 0); /* 프로세스 #0으로 메시지 보내기 */ 스프린트(부프, "%i 프로세스 작업 보고", my_랭크); MPI_송신(부프, 크기(부프), MPI_CHAR, 0, 0, MPI_COMM_WORLD); } /* 통신 인프라스트럭처를 해체합니다*/ MPI_최종화(); 돌아가다 0; }
4개의 프로세스로 실행하면 다음 [46]출력이 생성됩니다.
$mpicc example.c & mpixec - n 4 . / a . out 4개의 프로세스가 있습니다.프로세스 1의 업무 보고.프로세스 2의 업무 보고.프로세스 3의 업무 보고.
여기서,mpiexec
는 4개의 프로세스로 예제 프로그램을 실행하는 데 사용되는 명령어이며, 각 프로세스는 실행 시 프로그램의 독립 인스턴스이며 할당된 순위(즉, 숫자 ID) 0, 1, 2, 3입니다.이름mpiexec
MPI 표준에서는 권장되지만 일부 구현에서는 동일한 명령어가 이름으로 제공됩니다.mpirun
.그MPI_COMM_WORLD
는, 모든 프로세스로 구성되는 Communicator 입니다.
따라서 단일 프로그램, 다중 데이터(SPMD) 프로그래밍 모델이 용이하지만 필수는 아닙니다.많은 MPI 구현에서는 동일한 MPI 작업에서 여러 개의 다른 실행 파일을 시작할 수 있습니다.각 프로세스에는, 독자적인 랭크, 세계의 프로세스의 총수, 및 포인트 투 포인트(송수신) 통신, 또는 그룹간의 집합적인 통신에 의한 통신 능력이 있습니다.MPI는 SPMD 스타일의 프로그램을 제공하기에 충분합니다.MPI_COMM_WORLD
알고리즘이 무엇을 할지를 결정할 수 있도록 하기 위해, 그 자체의 순위와 세계의 크기를 지정합니다.보다 현실적인 상황에서는 I/O가 이 예보다 더 신중하게 관리됩니다.MPI에서는 특정 시스템에서 표준 I/O(stdin, stdout, stderr)가 어떻게 동작해야 하는지를 규정하지 않습니다.일반적으로 랭크 0 프로세스에서 예상대로 동작하며, 일부 구현에서는 다른 프로세스에서 출력을 캡처하여 내보냅니다.
MPI는 프로세서가 아닌 프로세스의 개념을 사용합니다.프로그램 복사본은 MPI 런타임에 의해 프로세서에 매핑됩니다.그런 의미에서 병렬 머신은 하나의 물리 프로세서 또는 N개의 프로세서에 매핑할 수 있습니다.여기서 N은 사용 가능한 프로세서의 수 또는 그 사이에 있는 프로세서입니다.병렬 속도를 최대화하기 위해 더 많은 물리적 프로세서가 사용됩니다.이 예에서는 그 동작을 월드N의 사이즈에 맞추어 조정하고 있기 때문에, 사용 가능한 절대 동시성의 양에 따라 런타임 결정이 다를 수 있지만, 각 사이즈에 대해 컴파일 없이 런타임Configuration으로 확장하려고 합니다.
MPI-2 채택
MPI-1.2의 채택은 특히 클러스터 컴퓨팅에서 보편화되었지만 MPI-2.1의 수용은 더욱 제한되었습니다.다음과 같은 문제가 있습니다.
- MPI-2 구현에는 I/O 및 동적 프로세스 관리가 포함되며 미들웨어의 크기는 상당히 커집니다.배치 스케줄링 시스템을 사용하는 대부분의 사이트는 동적 프로세스 관리를 지원할 수 없습니다.MPI-2의 병렬 I/O는 [citation needed]잘 받아들여지고 있습니다.
- 많은 MPI-1.2 프로그램이 MPI-2 이전에 개발되었습니다.처음에는 휴대성에 대한 우려로 인해 채택이 늦춰졌지만, 광범위한 지원으로 인해 채택이 감소했습니다.
- 많은 MPI-1.2 어플리케이션에서는 MPI-2 기능이 실제로 필요하지 않고 해당 표준의 서브셋(16-25 기능)만 사용합니다.
미래.
MPI의 미래에 대한 어떤 측면은 견고해 보이고, 다른 측면은 그렇지 않다.MPI 포럼은 MPI-3.0(2012년 9월)과 MPI-3.1(2015년 6월)의 결과로 나온 MPI-3에 대한 개발 가능성을 모색하고 일부 MPI-2 문제를 명확히 하기 위해 2007년에 다시 소집되었다.
아키텍처는 내부 동시성(멀티코어), 정밀 동시성 제어(스레딩, 어피니티), 메모리 계층 수준 향상으로 변화하고 있습니다.멀티스레드 프로그램은 싱글스레드 애플리케이션보다 이러한 개발을 쉽게 활용할 수 있습니다.이는 이미 대칭형 멀티프로세싱에 대한 개별적이고 보완적인 표준, 즉 OpenMP를 산출하고 있습니다.MPI-2는 표준 준거 구현이 멀티스레드 문제에 어떻게 대처해야 하는지 정의하지만, 구현이 멀티스레드 또는 스레드 안전할 필요는 없습니다.MPI-3은 노드 내에서 공유 메모리 병렬 처리를 사용하는 기능을 추가합니다.Adaptive MPI, Hybrid MPI, Fine-Graned MPI, MPC 등의 MPI 구현은 MPI의 다양한 과제에 대응하는 MPI 표준을 확장합니다.
천체물리학자인 Jonathan Dursi는 채플 언어, Unified Parallel C, Hadoop, Spark 및 Flink와 [47]같은 새로운 기술을 지적하며 MPI empircent라는 의견서를 작성했습니다.동시에 Exascale Computing Project의 거의 모든 프로젝트는 MPI를 기반으로 합니다. MPI는 2020년대 초 현재 가장 큰 머신으로 확장 가능하며 앞으로도 오랫동안 관련성을 유지할 것으로 널리 알려져 있습니다.
「 」를 참조해 주세요.
레퍼런스
- ^ "Message Passing Interface :: High Performance Computing". hpc.nmsu.edu. Retrieved 2022-08-06.
- ^ Walker DW (August 1992). Standards for message-passing in a distributed memory environment (PDF) (Report). Oak Ridge National Lab., TN (United States), Center for Research on Parallel Computing (CRPC). p. 25. OSTI 10170156. ORNL/TM-12147. Retrieved 2019-08-18.
- ^ The MPI Forum, CORPORATE (November 15–19, 1993). "MPI: A Message Passing Interface". Proceedings of the 1993 ACM/IEEE conference on Supercomputing. Supercomputing '93. Portland, Oregon, USA: ACM. pp. 878–883. doi:10.1145/169627.169855. ISBN 0-8186-4340-4.
- ^ Nielsen, Frank (2016). "2. Introduction to MPI: The MessagePassing Interface". Introduction to HPC with MPI for Data Science. Springer. pp. 195–211. ISBN 978-3-319-21903-5.
- ^ Gropp, Lusk & Skjellum 1996, 3페이지
- ^ Sur, Sayantan; Koop, Matthew J.; Panda, Dhabaleswar K. (4 August 2017). "MPI and communication---High-performance and scalable MPI over Infini Band with reduced memory usage". High-performance and Scalable MPI over InfiniBand with Reduced Memory Usage: An In-depth Performance Analysis. ACM. p. 105. doi:10.1145/1188455.1188565. ISBN 978-0769527000. S2CID 818662.
- ^ KNEM: 고성능 노드 내 MPI 통신 "MPICH2(릴리스 1.1.1 이후)는 DMA LMT에서 KNEM을 사용하여 단일 노드 내에서 대용량 메시지 성능을 향상시킵니다.Open MPI는 릴리스 1.5 이후 SM BTL 컴포넌트에 KNEM 지원도 포함하고 있습니다.또한 NetPIPE에는 버전 3.7.2 이후 KNEM 백엔드가 포함되어 있습니다."
- ^ "FAQ: Tuning the run-time characteristics of MPI sm communications". www.open-mpi.org.
- ^ https://software.intel.com/en-us/articles/an-introduction-to-mpi-3-shared-memory-programming?language=en "MPI-3 표준은 새로운 MPI 공유 메모리(SHM) 모델을 사용하는 하이브리드 프로그래밍에 대한 또 다른 접근방식을 도입했습니다."
- ^ 공유 메모리 및 MPI 3.0 "MPI + Open 사용 여부 등 특정 애플리케이션에 가장 적합한 방법을 결정하기 위해 다양한 벤치마크를 실행할 수 있습니다.MP 또는 MPI SHM 확장자매우 간단한 테스트 케이스에서는 포인트 투 포인트 통신을 사용한 기본 버전에 비해 메시지에 따라 속도가 최대 5배 향상되었습니다."
- ^ 멀티코어 프로그래밍 시스템으로서의 MPI-3 공유 메모리 사용(PDF 프레젠테이션슬라이드)
- ^ 목차: 1994년9월 8일 (3-4)Hpc.sagepub.com 를 참조해 주세요.2014-03-24에 취득.
- ^ MPI 문서Mpi-forum.org 를 참조해 주세요.2014-03-24에 취득.
- ^ Gropp, Lusk & Skjellum 1999b, 페이지 4-5
- ^ MPI: 메시지 전달 인터페이스 Standard
버전 3.1, 메시지 전달 인터페이스 포럼, 2015년 6월 4일.http://www.mpi-forum.org 를 참조해 주세요.2015-06-16에 취득. - ^ a b "Type matching rules". mpi-forum.org.
- ^ "MPI_Gather(3) man page (version 1.8.8)". www.open-mpi.org.
- ^ "MPI_Get_address". www.mpich.org.
- ^ Boost.MPI 스켈레톤/콘텐츠 메커니즘의 근거 (NetPIPE를 사용하여 퍼포먼스 비교 그래프를 작성)
- ^ Gropp, Lusk & Skjelling 1999b, 페이지 7 : (
- ^ Gropp, Lusk & Skjelling 1999b, 페이지 5~6 :
- ^ "Sparse matrix-vector multiplications using the MPI I/O library" (PDF).
- ^ "Data Sieving and Collective I/O in ROMIO" (PDF). IEEE. Feb 1999.
- ^ Chen, Yong; Sun, Xian-He; Thakur, Rajeev; Roth, Philip C.; Gropp, William D. (Sep 2011). "LACIO: A New Collective I/O Strategy for Parallel I/O Systems". 2011 IEEE International Parallel & Distributed Processing Symposium. IEEE. pp. 794–804. CiteSeerX 10.1.1.699.8972. doi:10.1109/IPDPS.2011.79. ISBN 978-1-61284-372-8. S2CID 7110094.
- ^ Teng Wang; Kevin Vasko; Zhuo Liu; Hui Chen; Weikuan Yu (2016). "Enhance parallel input/output with cross-bundle aggregation". The International Journal of High Performance Computing Applications. 30 (2): 241–256. doi:10.1177/1094342015618017. S2CID 12067366.
- ^ Wang, Teng; Vasko, Kevin; Liu, Zhuo; Chen, Hui; Yu, Weikuan (Nov 2014). "BPAR: A Bundle-Based Parallel Aggregation Framework for Decoupled I/O Execution". 2014 International Workshop on Data Intensive Scalable Computing Systems. IEEE. pp. 25–32. doi:10.1109/DISCS.2014.6. ISBN 978-1-4673-6750-9. S2CID 2402391.
- ^ cea-hpc. "cea-hpc/wi4mpi: Wrapper interface for MPI". GitHub.
- ^ mpicc. Mpich.org.2014-03-24에 취득.
- ^ 순수한 Mpi.그물
- ^ "MPI.NET: High-Performance C# Library for Message Passing". www.osl.iu.edu.
- ^ "mpiJava Home Page". www.hpjava.org.
- ^ "Introduction to the mpiJava API". www.hpjava.org.
- ^ "The MPJ API Specification". www.hpjava.org.
- ^ "MPJ Express Project". mpj-express.org.
- ^ JuliaParallel/MPI.jl, Parallel Julia, 2019-10-03, retrieved 2019-10-08
- ^ "Xavier Leroy - Software". cristal.inria.fr.
- ^ Caml 메일링 리스트의 아카이브> Yaron M으로부터의 메시지. 민스키.Caml.inria.fr(2003-07-15)2014-03-24에 취득.
- ^ "Introduction to parallel GP" (PDF). pari.math.u-bordeaux.fr.
- ^ "Google Code Archive - Long-term storage for Google Code Project Hosting". code.google.com.
- ^ "Google Code Archive - Long-term storage for Google Code Project Hosting". code.google.com.
- ^ 이제 파이두사의 일부
- ^ "Python Bindings - 1.35.0". www.boost.org.
- ^ "0006498: Package boost-*mpi-python is missing python module - CentOS Bug Tracker". bugs.centos.org.
- ^ Yu, Hao (2002). "Rmpi: Parallel Statistical Computing in R". R News.
- ^ Chen, Wei-Chen; Ostrouchov, George; Schmidt, Drew; Patel, Pragneshkumar; Yu, Hao (2012). "pbdMPI: Programming with Big Data -- Interface to MPI".
- ^ 출력 스니펫은 Open MPI가 설치된 일반 Linux 데스크톱 시스템에서 생성되었습니다.distros는 보통 mpicc 명령어를 openmpi-dev 또는 libopenmpi-dev 패키지에 넣습니다.또한 mpicc 및 mpixec을 사용하기 전에 "module add mpi/openmpi-x86_64" 또는 이와 유사한 기능을 실행해야 할 수도 있습니다.
- ^ "HPC is dying, and MPI is killing it". www.dursi.ca.
추가 정보
- 이 문서는 2008년 11월 1일 이전에 무료 온라인 컴퓨팅 사전 메시지 패싱 인터페이스에서 가져온 자료를 바탕으로 하며 GFDL 버전 1.3 이후 '재라이센스' 조건에 따라 통합되었습니다.
- 아오야마·유키야·나카노·준(1999년) RS/6000 SP:실용 MPI 프로그래밍, ITSO
- Foster, Ian(1995) Addison-Wesley ISBN 0-201-57594-9, 8장 메시지 전달 인터페이스 설계 및 구축
- Wijesuriya, Viraj Brian (2010-12-29) Daniweb: MPI 병렬 프로그래밍 접근방식을 사용한 행렬 곱셈 샘플 코드
- MPI 시리즈 사용:
- Gropp, William; Lusk, Ewing; Skjellum, Anthony (1994). Using MPI: portable parallel programming with the message-passing interface. Cambridge, MA, USA: MIT Press Scientific And Engineering Computation Series. ISBN 978-0-262-57104-3.
- Gropp, William; Lusk, Ewing; Skjellum, Anthony (1999a). Using MPI, 2nd Edition: Portable Parallel Programming with the Message Passing Interface. Cambridge, MA, USA: MIT Press Scientific And Engineering Computation Series. ISBN 978-0-262-57132-6.
- Gropp, William; Lusk, Ewing; Skjellum, Anthony (1999b). Using MPI-2: Advanced Features of the Message Passing Interface. MIT Press. ISBN 978-0-262-57133-3.
- Gropp, William; Lusk, Ewing; Skjellum, Anthony (2014). Using MPI, 3rd edition: Portable Parallel Programming with the Message-Passing Interface. Cambridge, MA, USA: MIT Press Scientific And Engineering Computation Series. ISBN 978-0-262-52739-2.
- Gropp, William; Lusk, Ewing; Skjellum, Anthony (1996). "A High-Performance, Portable Implementation of the MPI Message Passing Interface". Parallel Computing. 22 (6): 789–828. CiteSeerX 10.1.1.102.9485. doi:10.1016/0167-8191(96)00024-5.
- Pacheco, Peter S.(1997년) MPI를 사용한 병렬 프로그래밍 [1] 500pp.모건 카우프만 ISBN 1-55860-339-5.
- MPI: Complete Reference 시리즈:
- 스니르, 마크, 오토, 스티브 W;Huss-Lederman, Steven, Walker, David W.; Dongara, Jack J.(1995) MPI: The Complete Reference.MIT Press Cambridge, MA, USA. ISBN 0-262-69215-5
- 스니르, 마크, 오토, 스티브 W;Huss-Lederman, Steven; Walker, David W.; Dongara, Jack J. (1998) MPI—전체 참조: 제1권 MPI 코어MIT 프레스, 매사추세츠, 캠브리지, ISBN 0-262-69215-5
- 그루프, 윌리엄Huss-Lederman, Steven; Lumsdaine, Andrew; Lusk, Ewing; Nitzberg, Bill; Saphir, William; Snir, Marc(1998) MPI—전체 참조: 제2권 MPI-2 확장 기능MIT 프레스, 캠브리지, MA ISBN 978-0-262-57123-4
- Firuziaan, Mohammad, Nommensen, O. (2002) MPI 및 OpenMP를 통한 병렬 처리, Linux Enterprise, 2002년 10월
- Vanneschi, Marco(1999) 과학적 컴퓨팅을 위한 병렬 패러다임 유럽 계산 화학 학교(1999, 이탈리아 페루자), 화학 강의 노트, 170-183페이지 75번.Springer,
- Bala, Bruck, Cyper, Elustondo, A Ho, CT Ho, Kipnis, Snir(1995년) 병렬 및 분산 시스템의 IEEE 트랜잭션, § 6, No.2, 페이지 154-164, 1995년 2월.