2014-03-12 2 views
0

MPI에 대한 기본적인 질문이 있습니다. MPI와 여러 프로세스에 익숙하지 않으므로이 점에 대해 나와 함께 알려주십시오. 나는 MPI (Boost 라이브러리 사용)를 광범위하게 사용하여 병렬 작업을 허용하는 C++ (RepastHPC)의 시뮬레이션 환경을 사용하고 있습니다. 특히, 시뮬레이션은 각각의 클래스 (예 : 에이전트)의 여러 인스턴스로 구성되며, 서로 상호 작용하고 정보를 교환해야합니다. 이제 다중 프로세스에서 발생합니다 (MPI에 대한 기본적인 이해가 있음). 자연스런 질문이나 두려움은 서로 다른 프로세스의 에이전트가 서로 연결할 수 없기 때문에 더 이상 상호 작용하지 않는다는 것입니다 (이것은 MPI의 전체 개념과 상반됩니다).MPI 기본 정보

설명서를 읽은 후에 Boost.MPI의 사용 가능한 라이브러리 (위의 언급 패키지의 라이브러리)가 모든 통신 및 패키지를 프로세스간에 앞뒤로 전송합니다. 즉 각 프로세스 다른 프로세스의 인스턴스 복사본을 가지고 있습니다 (이것은 값으로 호출하는 형식입니다. 원래 인스턴스는 복사본 만있는 프로세스에서 변경할 수 없습니다). 그런 다음 업데이트가 수행되어 복사본 인스턴스의 원본은 원본과 동일한 정보를 가지고 있습니다.

즉, 시뮬레이션의 최종 결과에 관해서는 하나의 프로세스에서 전체 작업을 수행하는 것과 같습니다. 다르게 말해서, 다중 프로세스는 단지 속도를 높이고 시뮬레이션의 디자인을 변경하지 않기 때문에 (따라서 나는 그것에 대해 걱정할 필요가 없다)?

+0

여러 프로세스에서 실행할 때 올바른 결과를 만들어야하는 병렬 실행 용 소프트웨어를 제작하는 모든 사람에게 설계 목표가됩니다. 당신이 참조하는 소프트웨어가 이러한 목표를 달성했는지 이해하기 위해 어떤 테스트를 실행 했습니까? 물론 직렬 실행의 결과를 사용하여 병렬 실행의 결과를 확인하는 것은 직렬 실행 자체가 올바른 결과를 산출한다는 확신에 달려 있습니다. –

+0

빠른 응답을 보내 주셔서 감사합니다. 처음에는 문제를 잘못 들었고 현재 소프트웨어를 사용하지 않고 있으므로 더 많이 사용하고 있으므로이 시점까지는 어떤 테스트도 실행하지 않았습니다. 그러나 이것은 확실히 좋은 출발점입니다.나는 소프트웨어 설계자들이 제대로 일을했다는 것에 의심의 여지가 없다. 내 질문은 소프트웨어의 일반적인 목적이 직렬 실행에서와 같이 병렬 실행에서 동일한 결과를 얻는 것이 아닌지에 관한 것이다. – Tartaglia

+0

테스트에 대해서는 생각할 수있는 방법 중 하나입니다. 제대로 작동하는지 확인하려면 다음과 같이하십시오. 1. 두 개의 사과로 된 두 개의 에이전트 (ID 1, ID 2)를 만들고 두 명의 에이전트 (ID 3, ID 4)는 각각 두 개의 오렌지를 부여받습니다. 2. 각 요원이 요원 목록을 살펴보고 누군가 다른 열매를 맺을 때마다 요원에게 제공하십시오. – Tartaglia

답변

5

저는 MPI에 대한 근본적인 오해가 있다고 생각합니다. MPI는 자동 병렬화 라이브러리가 아닙니다. 분산 공유 메모리 메커니즘이 아닙니다. 그것은 당신을 위해 어떤 마술도하지 않습니다.

동일한 작업이나 다른 컴퓨터에서 서로 다른 프로세스간에 통신하는 것이 더 간단합니다. 각 프로세스는 다른 프로세스와 겹치지 않는 자체 주소 공간을 가지고 있습니다 (MPI 외부에서 다른 작업을하지 않는 한). MPI 설치를 올바르게 설정했다고 가정하면, 프로세스 간의 통신 채널 설정에 따른 모든 어려움이있을 것입니다. 또한 집단 의사 소통과 같은 좀 더 높은 수준의 추상화를 제공합니다.

MPI를 사용하면 코드가 정상적으로 다르게 컴파일됩니다. g++ -o code code.cpp (또는 컴파일러가 무엇이든)을 사용하는 대신 mpicxx -o code code.cpp을 사용합니다. 이렇게하면 필요한 모든 MPI 항목과 자동으로 연결됩니다. 그런 다음 응용 프로그램을 실행할 때 mpiexec -n <num_processes> ./code을 사용합니다 (다른 인수는 필요하지 않지만 필요할 수 있습니다). 인수 num_processes은 MPI에게 실행할 프로세스 수를 알려줍니다. 이것은 컴파일/링크시에는 수행되지 않습니다.

MPI를 사용하려면 코드를 다시 작성해야합니다. MPI에는 많은 기능이 있습니다 (표준은 here이며 사용하기 쉬운 웹에서 사용할 수있는 많은 자습서가 있습니다). 기본 사항은 MPI_Send()MPI_Recv()이지만 많이 더 많습니다. 이를위한 자습서를 찾아야합니다.

+0

clarifiying 주셔서 감사합니다. MPI에 대한 오해가있었습니다. 제가 사용하고있는 소프트웨어 패키지는 프로세스 사이에 데이터 교환을 설정하는 방법을 매뉴얼에 자세하게 설명했습니다. MPI가 지적한대로 자동으로 수행되지는 않았지만 통신을위한 레이아웃 그 목적으로 제공됩니다. pdf에 감사드립니다. 나는 그런 문서를 찾고있었습니다. – Tartaglia

+0

LLNL의 자습서를 살펴볼 것을 권합니다. https://computing.llnl.gov/tutorials/mpi/에서 확인할 수 있습니다. 그들은 또한 pthread와 다른 일반적인 병렬화 라이브러리 및 언어 기본 요소에 대한 다른 자습서를 가지고 있습니다. – RunFun