2017-02-17 1 views
0

프로그램은 내가 ncores 비 공유 메모리 프로세스의 수입니다 다음/MPI 내가 하이브리드의 OpenMP/MPI 프로그램을 작성

mpirun -np ncores --bind-to none -x OMP_NUM_THREADS=nthreads ./program 

(MPI 같이 호출)이고 nthreads는 공유 메모리 스레드 (OpenMP)의 수입니다.

즉, 각 ncores에서 프로그램은 nthreads에서 실행됩니다.

모든 코어에 nthreads를 갖고 싶지 않지만 각 코어마다 그 번호를 변경하는 데 관심이 있습니다. 예 : ncores = 2 인 경우 코어 1에 스레드 2 개를 설정하고 코어 2에 스레드 6 개를 설정하고 싶습니다.

할 방법이 있습니까?

I 열기 MPI를 사용하고 1.10.3

+0

컴퓨팅 시스템의 구성은 노드 수, 각 노드의 CPU 코어 수입니다. mpirun 줄에서 두 인수 (ncores와 nthreads)를 변경할 수 있습니다. 당신의 MPI 프로세스 (id 0)가 2 개의 쓰레드를 원하고 다른 MPI 프로세스 (id 1)가 6 개의 쓰레드를 원할 경우, 전역 환경 변수를 사용하지 말고, ['omp_set_num_threads' function] (https : // gcc .gnu.org/onlinedocs/libgomp/omp_005fset_005fnum_005fthreads.html # omp_005fset_005fnum_005fthreads) – osgx

답변

2

당신의 모든 MPI 프로세스에 대한 "OMP_NUM_THREADS"로 설정 지구 환경을 가지고있다. 이 설정은 모두 동일하며, 다양한 mpi 프로세스에 대해 서로 다른 스레드 번호를 갖기를 원하므로 전역 변수로 설정하면 안됩니다.

두 가지 변형을 제안 할 수 있습니다. 먼저 -x 옵션을 삭제하고 "./program_script.sh"을 blue 스크립트 "./program_script.sh"으로 바꿉니다. mpirun에서 프로세스 ID를 얻습니다 (mpirun -np 2 env을 사용하여 프로세스 ID가있는 변수의 이름을 찾습니다). 올바른 값 "OMP_NUM_THREADS"env를 설정합니다. 이 ID로 mpi 프로세스를 시작한 다음 ./program을 시작하십시오.

이 이 이

올바른 CPU binding in your mpirun을 설정하는 것을 잊지 마세요 이 (--report-bindings 확인 이 설정

MPI_Comm_size(MPI_COMM_WORLD,&nproc); 
MPI_Comm_rank(MPI_COMM_WORLD,&rank); 
if(rank == 0) { 
    omp_set_num_threads(2); 
} 
if(rank == 1) { 
    omp_set_num_threads(6); 
} 
:

두 번째 변종은 -x 옵션을 삭제하고 OpenMP의 표준의 표준 omp_set_num_threads() 전화를 사용하여 MPI 프로세스에서 직접 스레드에게 수를 설정하는 것입니다 --bind-to 또는 rankfile).

그리고 세 번째 변형 (스레드 수가 CPU 코어 수보다 작거나 같은 경우)은 -x 옵션을 삭제하고 mpirun에서 올바른 CPU 바인딩을 설정하기 만하면됩니다. 첫 번째 MPI 프로세스 및 코어 2, 3,4,5,6,8 번째 MPI 과정. 대부분의 OpenMP 라이브러리는 허용 된 CPU 세트를 인식하고 기본값은 one thread per CPU으로 시작합니다.

관련 문제