2012-09-07 3 views
3

내 표준에 따라 몇 가지 매우 큰 계산을 수행하는 코드를 개발 중입니다. 단일 CPU 예상을 기반으로 예상 실행 시간은 ~ 10 CPU 년이며 메모리 요구 사항은 ~ 64GB입니다. IO가 거의 필요하지 않습니다. 문제의 코드의 직렬 버전 (C로 작성)은 충분히 잘 작동하고 있으며 코드를 가장 잘 병렬화하는 방법에 대해 생각해 봐야합니다.하이브리드 OpenMP + 혼합 분산 및 공유 메모리 용 OpenMPI?

나는 노드 당 ~ 64GB RAM 및 16 코어의 클러스터에 액세스 할 수 있습니다. 아마도 나는 예를 들어. < = 8 노드. 단일 노드의 스레드간에 메모리를 공유하고 다른 노드에서 별도의 메모리를 사용하고 노드간에 통신을 거의 사용하지 않는 설치를 생각해 봅니다.

필자가 지금까지 읽은 바있는 솔루션은 하이브리드 OpenMP + OpenMPI 디자인을 사용하고 OpenMP를 사용하여 개별 컴퓨팅 노드의 스레드를 관리하며 OpenMPI를 사용하여 노드간에 정보를 전달하는 것입니다 : https://www.rc.colorado.edu/crcdocs/openmpi-openmp

제 질문은이 병렬 처리를 구현하는 "최선의"방법인지 여부입니다. 나는 경험 많은 C 프로그래머이지만 병렬 프로그래밍에 대한 경험이 매우 제한되어있다. (OpenMP로 조금은, OpenMPI에는 아무것도 없다. 과거의 대부분의 일은 당황했다.) 다른 대안으로 OpenMPI를 사용하여 단일 호스트에서 효율적으로 메모리를 공유 할 수 있습니까? 그렇다면 OpenMP를 사용하는 것을 피할 수 있습니다. OpenMP를 사용하면 작업이 약간 더 간단 해집니다 (두 개가 아닌 하나의 API).

답변

6

하이브리드 OpenMP 및 MPI 코딩은 corase grained 하나와 각 coarse subdomain 내부에 중첩 된 fine grained 하나를 명확하게 구분할 수있는 문제에 가장 적합합니다. 세분 된 병렬 처리는 메시지 전달과 함께 구현할 때 많은 통신이 필요하기 때문에 통신 오버 헤드가 수행되는 작업량에 필적 할 수 있기 때문에 확장되지 않습니다. OpenMP는 공유 메모리 패러다임이므로 데이터 통신이 필요없고 액세스 동기화 만 수행되므로 세밀한 병렬 작업에 더 적합합니다. 또한 OpenMP는 스레드 간의 데이터 공유 (그리고 마지막 다중 레벨 캐시를 공유하는 최신 멀티 코어 CPU의 해당 캐시 공유)에서 이점을 얻으며 일반적으로 일부 데이터를 복제해야하는 동등한 메시지 전달 코드보다 적은 메모리를 필요로합니다 모든 프로세스. 다른 쪽의 MPI는 교차 노드를 실행할 수 있으며 단일 공유 메모리 시스템에서 실행하는 데만 국한되지 않습니다.

당신의 말은 귀하의 병렬 처리가 매우 거칠거나 소위 곤란한 평행 문제에 속한다고 제안합니다. 내가 너라면 나 혼자 갈거야. OpenMP pragma 만 사용하고 런타임 호출을 사용하지 않는 경우 (예 : omp_get_thread_num()) OpenMP를 사용하는지 여부에 따라 순수 MPI (즉, 비 스레드 MPI 프로세스) 또는 하이브리드로 코드를 컴파일 할 수 있습니다 코드를 직렬로 컴파일 할 수 있도록 더미 OpenMP 런타임 제공). OpenMP를 끄고 MPI 전용 모드로 실행하는 옵션이 추가되어 OpenMP (데이터 공유, 캐시 재사용) 및 MPI (투명 네트워킹, 확장 성, 쉬운 작업 실행)의 이점을 모두 누릴 수 있습니다. 추가 보너스로, 미래를 만날 수있을 것입니다. 이는 많은 수의 코어 CPU를 상호 연결하는 것처럼 보입니다.