2014-02-26 3 views
9

여러 스레드의 MPI_Isend 및 MPI_Irecv를 사용하여 InfiniBand RDMA를 통한 순위간에 초당 수백 개의 메시지를 교환하는 멀티 스레드 OpenMPI 응용 프로그램을 작성하고 있습니다.InfiniBand : 전송 속도는 MPI_Test * 주파수에 따라 다릅니다.

전송은 400-800KByte의 순서이며, 각 등급에 대해 약 9Gbps의 속도로 출입합니다. FDR 용량 이내입니다. 단순한 MPI 벤치 마크에서도 우수한 성능을 보여줍니다.

전용 스레드에서 MPI_Testsome을 사용하여 모든 활성 전송을 폴링하여 전송 완료를 확인합니다.

내가 달성 한 전송 속도는 메시지 속도에 따라 다르지만 더 중요한 것은 MPI_Testsome의 폴링 빈도에도 달려 있습니다. 즉, 내가 10ms마다 폴링하면 1ms마다 폴링하는 것보다 나중에 요청이 완료됩니다.

1ms가 아닌 10ms를 폴링하면 9ms가 지난 후에 대부분 요청을 받게 될 것입니다. MPI_Testsome에 대한 호출 횟수를 줄여서 전송 자체가 지연되어 전체 전송 속도가 느려지는 것을 기대하지 않습니다. 나는 MPI_Testsome이 완전히 수동적 일 것을 기대한다.

누구나 여기서이 문제가 발생할 수있는 원인을 알 수 있습니까?

답변

9

관찰 된 동작은 작업 진행이 Open MPI에서 구현되는 방식 때문입니다. 송신 또는 수신을 동 기적 또는 비동기 적으로 완료했는지 여부와 상관없이 게시하면 일련의 내부 작업이 대기열에 포함됩니다. 진행이란 기본적으로 대기중인 작업을 처리하는 것입니다. 라이브러리 작성시 선택할 수있는 두 가지 모드가 있습니다. 하나는 비동기 진행 스레드가 있고 다른 하나는 기본값이 아닌 후자입니다.

비동기 진행 스레드를 사용하여 라이브러리를 컴파일하면 백그라운드 스레드가 처리하고 큐를 처리합니다. 이를 통해 백그라운드 전송이 사용자의 코드와 동시에 시작될 수 있지만 대기 시간이 길어집니다. 비동기 진행이 없으면 조작은 더 빠르지 만 사용자 코드가 MPI 라이브러리로 호출 할 때만 진행될 수 있습니다. MPI_Wait 또는 MPI_Test 및 패밀리입니다. MPI_Test 기능 패밀리는 가능한 한 빨리 리턴하는 방식으로 구현됩니다. 즉, 라이브러리는 통화 중 물건을주고받는 사이에 균형을 유지해야하므로 속도가 느려지거나 빠르게 돌아와서 각 통화에서 작업이 덜 진행됩니다.

Jeff Squyres를 비롯한 Open MPI 개발자 중 일부는 Stack Overflow를 방문합니다. 그는 아마도 더 자세한 내용을 제공 할 수 있습니다.

이 동작은 Open MPI에만 국한되지 않습니다. 무겁게 하드웨어를 지원하지 않는 한 MPI는 대개 같은 방법으로 구현됩니다.

+1

감사합니다. 비동기 진행이 기본값이 아니라는 것을 알지 못했습니다. 나는 'btl_openib_async_event_thread'를 실행하고있다 (gdb에 따르면). 'btl_openib_use_async_event_thread'옵션도 설정됩니다. OpenMPI를 재구성하여 그면을보다 세밀하게 제어 할 수 있는지 알아 보겠습니다. –

+2

'openib' 비동기 스레드는 제가 언급 한 비동기 진행 스레드가 아닙니다. InfiniBand 완료 대기열에서 알림 메시지를 읽어서 진행 대기열의 보류중인 이벤트 상태를 업데이트 할 수 있습니다. –