2017-04-20 1 views
0

MPI를 통해 자체적으로 실행되는 프로그램 내에서 OpenMP 병렬화를 사용하는 라이브러리를 호출하려고합니다. 단일 프로세스를 사용하여 MPI 프로그램을 실행 한 다음 OpenMP 라이브러리를 호출 할 때 내 컴퓨터의 코어 수에 해당하는 7 개의 추가 스레드가 올바르게 생성되고 작업이 병렬로 수행됩니다 . 대신에 2 개의 프로세스에서 MPI 프로그램을 실행하고 각 프로세스가 OpenMP 프로그램을 호출하도록하면 각 프로세스가 이전과 같이 작업하는 대신 스레드를 생성하므로 계산 시간이 오래 걸릴 수 있습니다.MPI 프로그램 내에서 OpenMP 프로그램 시작

다른 프로세스가 대기하는 동안에 만 MPI 마스터 프로세스가 OpenMP 라이브러리를 호출하도록 시도했지만이 프로세스 (실제 코어)는 OpenMP 계산에 전혀 참여하지 않습니다.

MPI 프로그램에 OpenMP 프로그램을 공동으로 실행한다고 알려야합니까? 더 복잡한 것은 다중 노드가있는 클러스터에서 MPI 프로그램을 실행한다는 것입니다. MPI 마스터 프로세스가 포함 된 노드에서만 OpenMP 프로그램을 시작하는 것이 허용됩니다.

구체적으로 말씀 드리면, 제 MPI 프로그램은 Cython으로 작성되었으며 mpi4py를 사용합니다. 필자는 MPI를 MPI 구현으로 사용하지만 이것이 중요하지 않기를 바랍니다. OpenMP 프로그램은 C로 작성되었으며 Cython 래퍼를 통해 호출합니다.

+3

귀하의 질문에 혼란이 있습니다. 제목은 "OpenMP 프로그램"을 언급하지만 텍스트에서 OpenMP를 사용하는 라이브러리 함수를 호출하는 것처럼 보입니다. 두 가지 모두 매우 다른 것으로 명확히 설명하십시오. –

+0

MPI를 선택하는 것이 중요합니다. MPI (Linux의 경우)의 가장 널리 사용되는 선택 사항은 OpenMP 스레드를 코어를 분리하여 고정하는 자동 방법을 제공하기 때문입니다. 그렇지 않으면 선호도를 설정하는 스크립트를 작성하고 선호도를 지원하는 OpenMP를 사용하지 않는 한 OpenMP 프로세스가 별도의 노드에서 실행되어야합니다. – tim18

+0

@HristoIliev 나는 OpenMP를 사용하는 라이브러리를 사용하고 있다고 생각한다. –

답변

0

해결책을 찾았습니다.

OpenMP 라이브러리에 대한 호출은 단일 MPI 프로세스에 의해서만 수행되어야합니다. 이 호출 이후에 표준 MPI 장벽을 삽입하는 것은 좋지 않습니다. 장벽이 슬레이브 프로세스에서 CPU 시간의 100 %를 차지하므로 OpenMP 라이브러리에 추가 작업 인력을 사용할 수 없기 때문입니다. 대신 OpenMP 호출이 아직 완료되었는지 여부를 묻는 주기적으로 마스터 프로세스를 핑핑하는 자체 장벽 기능을 작성해야합니다. 이러한 두 핑 사이에서 슬레이브 프로세스는 주어진 시간 간격 동안 휴면 상태가되며, 이는 OpenMP 계산에 자유롭게 참여할 수 있음을 의미합니다.

이 논리의 예제는 Python에서 다음과 같이 구현됩니다. 변수 이름의 의미가 분명히 나타납니다.

def sleeping_barrier(sleep_time=0.1): 
    if master: 
     # Signal slaves to continue 
     for slave in range(1, nprocs): 
      isend(True, dest=slave) 
    else: 
     # Wait for master 
     while True: 
      sleep(sleep_time) 
      if iprobe(): 
       recv() # Remember to receive the message 
       break 

# Do OpenMP library call 
if master: 
    call_openmp_lib() 
sleeping_barrier()