10

나는 약간 연구와 관련있는 질문이있다. 공유 메모리를위한 MPI 설정이란 무엇을 의미합니까?

현재 I는 (특히 openmpi 6.3 사용)에 기초하여 구조 MPI 골격 프레임 워크의 구현을 완료했다. 프레임 워크는 단일 기계에서 사용되어야합니다. 지금, 나는 다른 이전의 골격 구현과 비교하고 (예 : scandium, fast-flow ..) 제가 발견했습니다

것은 내 구현의 성능은 다른 구현만큼 좋은되지 않는 것입니다. 내 구현은 MPI (따라서 보내기 및 수신 작업의 일치가 필요한 양면 통신)를 기반으로하기 때문에다른 구현은 공유 메모리를 기반으로합니다. (...하지만 여전히 나는 것을 추론 할 좋은 설명이 없다, 그것은 내 질문의 일부입니다) 두 종류의 완료 시간에 대한 몇 가지 큰 차이가 있습니다

.

오늘은 여기 공유 메모리 =>openmpi-sm

오픈-MPI의 구성을 소개하고 내 질문에 오는이 올하고있다.

가 공유 메모리에 대한 MPI를 구성하는 것을 의미한다 무엇

1? MPI 프로세스가 자체 가상 메모리에있는 동안 말입니다. 다음 명령에서와 같은 플래그는 실제로 무엇입니까? (나는 모든 통신이 명시 적으로 메시지를 전달함으로써 MPI에서 프로세스간에 메모리가 공유되지 않는다고 생각했다.)

shell$ mpirun --mca btl self,sm,tcp -np 16 ./a.out 

2 왜 MPI의 성능이 훨씬 더 공유 메모리 용으로 개발 된 다른 골격 구현 비교와이다? 적어도 하나의 단일 멀티 코어 컴퓨터에서도 실행하고 있습니다. (다른 구현에서는 스레드 병렬 프로그래밍을 사용했기 때문에 그렇다고 생각합니다.하지만 그에 대한 설득력있는 설명이 없습니다.)

어떤 제안이나 향후 토론을 환영합니다.

제 질문을 명확히해야하는지 알려주세요.

감사합니다!

답변

11

Open MPI는 매우 모듈 식입니다. 모듈 식 구성 요소 아키텍처 (MCA)라는 자체 구성 요소 모델이 있습니다. 이것은 --mca 매개 변수의 이름입니다. MCA의 다른 구성 요소가 내 보낸 MCA 매개 변수에 런타임 값을 제공하는 데 사용됩니다.

주어진 의사 소통에 두 개의 프로세스가 서로 대화를 할 때마다

는, MCA는 다른 하나 개의 프로세스에서 메시지를 전송할 수있는 적절한 구성 요소를 찾습니다. 두 프로세스가 동일한 노드에 상주하는 경우 Open MPI는 일반적으로 sm이라는 공유 메모리 BTL 구성 요소를 선택합니다. 두 프로세스가 다른 노드에 상주하면 Open MPI는 사용 가능한 네트워크 인터페이스를 탐색하고 다른 노드에 연결할 수있는 가장 빠른 노드를 선택합니다. 그것은합니다 ( openib BTL 구성 요소를 통해) 인피니 밴드와 같은 고속 네트워크에 대한 몇 가지 기본을두고 있지만, 클러스터는 인피니이없는 경우 tcp BTL 구성 요소가 허용 BTLS의 목록에있는 경우, TCP/IP는 대체로 사용됩니다.

기본적으로 은 공유 메모리 통신을 사용하기 위해 특별한 작업을 수행 할 필요가 없습니다. mpiexec -np 16 ./a.out으로 프로그램을 시작하십시오. 연결된 MPC (Open MPI FAQ)의 공유 메모리 부분은 더 나은 성능을 내기 위해 sm BTL의 매개 변수를 조정할 수 있다는 힌트를 제공합니다. Open MPI에 대한 나의 경험은 다중 레벨 NUMA 시스템과 같은 이국적인 하드웨어에서도 기본 매개 변수가 거의 최적으로 작동한다는 것을 보여줍니다. 기본 공유 메모리 통신 구현은 데이터를 두 번 복사합니다. 한 번은 송신 버퍼에서 공유 메모리로, 한 번은 공유 메모리에서 수신 버퍼로 데이터를 복사합니다. 단축키는 KNEM 커널 장치의 형태로 존재하지만 표준 Linux 커널의 일부가 아니므로이를 다운로드하여 별도로 컴파일해야합니다. Open MPI는 KNEM 지원을 통해 동일한 노드의 프로세스간에 "zero-copy"전송을 수행 할 수 있습니다. 복사는 커널 장치에서 수행하며 첫 번째 프로세스의 메모리에서 두 번째 프로세스의 메모리로 직접 복사합니다 방법. 이는 동일한 노드에 상주하는 프로세스 사이에서 큰 메시지의 전송을 획기적으로 향상시킵니다.

또 다른 옵션은 MPI를 완전히 잊어 버리고 공유 메모리를 직접 사용하는 것입니다. POSIX 메모리 관리 인터페이스 (here 참조)를 사용하여 모든 프로세스가 직접 작동하는 공유 메모리 블록을 만들 수 있습니다. 데이터가 공유 메모리에 저장되면 사본이 만들어지지 않으므로 이점이 있습니다. 그러나 각 소켓에 자체 메모리 컨트롤러가 있고 동일한 보드의 원격 소켓에서 메모리에 액세스하는 속도가 느려지는 현대 멀티 소켓 시스템의 NUMA 문제에주의하십시오. 프로세스 고정/바인딩 또한 중요합니다. --bind-to-socket ~ mpiexec을 전달하여 각 MPI 프로세스를 개별 CPU 코어에 고정시킵니다.

+1

FWIW, 리눅스 3.2에서, process_vm_readv/writev syscalls이 있으며, KNEM과 거의 같습니다. 예 : http://man7.org/linux/man-pages/man2/process_vm_readv.2.html – janneb

+0

@janneb, 지적 해 주셔서 고맙습니다. 3.x 커널은 이제 대부분의 HPC 시스템에서 인기가 없습니다. 그러나 KNEM은 단순한 데이터 전송 이상의 기능을 제공합니다. 비동기 작업, 완료 알림 등. –

+0

사실이긴하지만 다시 KNEM 패치가있는 커널도 아닙니다. – janneb

관련 문제