2017-12-02 3 views
0

소켓을 사용하여 C로 작성된 간단한 클라이언트 - 서버 프로그램이 있습니다. 서버는 각 요청에 대해 새로운 pthread를 엽니 다. 새롭게 열릴 때마다 CPU 집중 작업 (행렬 곱셈)을 수행합니다.MPI : 단일 MPI 프로세스에서 프로세서가 100 %까지 올라 가지 않습니다.

2 개의 물리적 코어와 4 개의 논리 프로세서가있는 CPU가 있습니다.

4 개의 클라이언트를 실행하면 서버는 4 개의 스레드를 열고 각 스레드는 논리 프로세서에 할당되며 CPU는 100 % (사용량)로 이동합니다.

5 초 후에 클라이언트를 하나씩 실행하면 CPU가 25 % (클라이언트 한 명)에서 50 % (두 명의 클라이언트)에서 75 % (세 명의 클라이언트)까지 어떻게 이동하는지 매우 명확하게 알 수 있습니다. 마지막으로 100 % (4 클라이언트). 꽤 정상적인 행동입니다.

전체 서버 코드을 MPI 프로세스 (단 하나의 MPI 프로세스)에 삽입하면 CPU가 시작한 클라이언트의 수와 관계없이 CPU가 50 % 이상을 올리지 않습니다.

왜 이런 일이 발생합니까?

+0

아마도 MPI 실행 프로그램이 실행 된 이진 파일의 CPU 세트를 제한 할 수 있습니다. MPI 매뉴얼 인'sched_getaffinity'로 확인하십시오. MPI 구현, 버전, MPI 바이너리 및 OS를 시작하는 방법에 대한 자세한 도움말을 보려면 ... – Zulan

+3

MPI 구현이 Open MPI 인 경우'--bind-to none '을'mpiexec' /'mpirun'에 전달하십시오. . –

+0

작업이 고정되어 있는지 잘 모르겠 으면 간단히 'mpirun ... grep Cpus_allowed_list/proc/self/status' –

답변

0

이 질문/문제에 대한 공식적인 답변은 정중하게 감사 다음

흐리 스토 일리 예프가에 mpirun에 없음 --bind-에 을 통과, 내 질문에 대한 코멘트에 말했듯 명령은 문제를 해결합니다.

이 옵션은 실제로 MPI 프로세스를 특정 개체에 바인딩합니다 (자세한 내용은 the manual 참조).

기본적으로 각 MPI 프로세스는 물리적 코어에 바인딩됩니다. 내 컴퓨터에는 2 개의 코어가 있으므로 얻을 수있는 CPU의 최대 사용량은 약 50 %입니다.

바인딩을 none으로 설정하면 해당 제약 조건이 제거되고 각 MPI 프로세스가 논리 코어에 바인딩되어 CPU가 100 %가됩니다.