0

내 프로그램은 MPI + pthreads를 사용합니다. 여기서 n-1 MPI 프로세스는 순수 MPI 코드이고 단 하나의 MPI 프로세스는 pthreads를 사용합니다. 마지막 프로세스에는 2 개의 스레드 (메인 스레드 및 pthread) 만 있습니다. 이 프로그램을 실행하려는 HPC 클러스터가 12 개의 코어를 가진 컴퓨팅 노드로 구성되어 있다고 가정합니다. 하드웨어 사용을 최대화하기 위해 배치 스크립트를 어떻게 작성해야합니까?다른 하나의 MPI 프로세스가 두 개 이상의 스레드를 가지고있을 때 LSF 용 일괄 처리 스크립트

다음은 필자가 작성한 배치 스크립트입니다. 마지막 OMP_NUM_THREADS = 2를 사용합니다. 왜냐하면 마지막 MPI 프로세스에는 2 개의 스레드가 있고 다른 스레드에도 각각 2 개의 스레드가 있다고 가정해야하기 때문입니다.

그런 다음 노드 당 6 개의 MPI 프로세스를 할당하므로 각 노드는 모든 MPI 프로세스가 하나의 스레드를 가지고 있음에도 불구하고 각 스레드가 6xOMP_NUM_THREADS = 12 (= 각 노드의 코어 수) 스레드를 실행할 수 있습니다.

#BSUB -J LOOP.N200.L1000_SIMPLE_THREAD 
#BSUB -o LOOP.%J 
#BSUB -W 00:10 
#BSUB -M 1024 
#BSUB -N 
#BSUB -a openmpi 
#BSUB -n 20 
#BSUB -m xxx 
#BSUB -R "span[ptile=6]" 
#BSUB -x 

export OMP_NUM_THREADS=2 

어떻게하면 더 좋은 스크립트를 작성할 수 있습니까?

답변

2

다음은 하이브리드 하나가 마지막 순위를 원한다면 다음과 같은 작업을해야합니다 : 당신은 하이브리드를 수 순위 0을 원하는 경우

#BSUB -n 20 
#BSUB -R "span[ptile=12]" 
#BSUB -x 

$MPIEXEC $FLAGS_MPI_BATCH -n 19 -x OMP_NUM_THREADS=1 ./program : \ 
     $FLAGS_MPI_BATCH -n 1 -x OMP_NUM_THREADS=2 ./program 

는 단순히 두 줄을 전환에게 :

$MPIEXEC $FLAGS_MPI_BATCH -n 1 -x OMP_NUM_THREADS=2 ./program : \ 
     $FLAGS_MPI_BATCH -n 19 -x OMP_NUM_THREADS=1 ./program 

이 기능은 Open MPI가 MIMD 프로그램을 실행할 수있는 기능을 활용합니다.

하이브리드 순위는 POSIX 스레드를 사용하지만 OpenMP 관련 환경 변수를 설정한다고 언급했습니다.당신이 정말로의 OpenMP를 사용하지 않는 경우, 당신은 전혀 OMP_NUM_THREADS을 설정하지 않아도이 간단한 mpiexec 명령은 충분합니다 :

$MPIEXEC $FLAGS_MPI_BATCH ./program 

(경우에 공부 나 직장 교육 기관에 대한 내 생각 엔에 밝혀 틀림없이 $FLAGS_MPI_BATCH을 제거하고 $MPIEXECmpiexec으로 바꿉니다.

+0

고마워요 !!!. 이는 마지막 순위의 두 스레드가 두 번째 계산 노드의 사용 가능한 코어 중 두 개에서 실행된다는 것을 의미합니까? 두 스레드에 대한 추가 정보가 없으면 LSF가 동일한 CPU 코어에서이 두 스레드를 예약 할 수 있습니까? –

+0

LSF는 일반적으로 코어가 아닌 슬롯에 스케줄을 지정합니다. 바인딩 (프로세스 스케줄링을 특정 논리 CPU로 제한)은 일반적으로 MPI 구현 또는 OpenMP 런타임 (또는 하이브리드 프로그램의 경우 모두)에 의해 수행됩니다. –

1

LSF를 사용한 지 오래되었으므로 완전히 정확하지 않을 수 있으므로 실험 해보아야합니다.

나는 노드 당 6 개 작업을, 당신의 요구로

#BSUB -n 20 
#BSUB -R "span[ptile=6]" 

, 20 개 작업의 총을 읽습니다. 의미는 네 개의 노드를 얻을 것입니다. 각 노드에 12 개의 코어가 있다고 명시 했으므로 낭비되는 것 같습니다.

어떻게 독점 호스트 ( -x)

#BSUB -x 
#BSUB -n 20 
#BSUB -R "span[ptile=12]" 

export OMP_NUM_THREADS=2 

당신이 알고있는이 방법 순위

  • 0..11 첫 번째 호스트에 요청대로, 노드에있는 모든 코어를 사용하는 방법에 대한
  • 12..19
  • 는 SECON 의해 제 2 호스트

에 d 호스트는 순위 19의 OpenMP를 사용하기 위해 여유 슬롯을 가지고 있습니다.

물론 더 재미있는 게재 위치에 들어가는 경우 LSF를 사용하면 작업 배치를 형성 할 수 있습니다. LSB_PJL_TASK_GEOMETRY을 사용하십시오.

는 12 개 코어

#BSUB -x 
#BSUB -n 25 
#BSUB -R "span[ptile=12]" 

export LSB_PJL_TASK_GEOMETRY="{(0,1,2,3,4,6,7,8,9,10,11,12)\ 
           (13,14,15,16,17,18,19,20,21,22,23,24)\ 
           (5)}" 

이 방법, 작업 (5)는 그 자체가 노드의 도착을 사용하여 순위 번호 5 25 개 MPI 작업을했다 말할 수 있습니다.

+0

대단히 고마워요. 하지만 여전히 #BSUB -n의 사용법을 이해하지 못합니다. 주어진 하드웨어 계산 슬롯 수를 예약하거나 병렬 프로세스의 수를 나타내는 데 사용됩니까? #BSUB -n은 스레드와 MPI 프로세스를 구별합니까? –

+0

@cpp_noname,'-n'은 _slots_의 수를 지정합니다. 귀하의 경우 각 계산 노드는 12 개의 슬롯을 제공하며 노드의 CPU 코어 수에 해당합니다 (그러나 슬롯은 코어에 직접 매핑되지 않습니다). 각 작업은 적합하다고 판단되는 슬롯을 사용할 수 있습니다. MPI 작업은 각 슬롯에서 하나의 프로세스를 시작하고 OpenMP 작업은 각 슬롯에서 하나의 스레드를 시작합니다. –

+0

@HristoIliev, 제 프로그램이 6 개의 MPI 프로세스를 사용한다고 가정합니다. 각 프로세스는 3 개의 스레드를가집니다. 그래서 총 6x3 = 18 병렬 스레드가 있습니다. 그러면 n은 어떻게되어야합니까? #BSUB -n 6 또는 #BSUB -n 18 –

관련 문제