2017-01-26 2 views
3

멀티 스레드 명령을 병렬화 GNU 평행을 사용 각각에 대한 명령의 목록 (commands.list) :난 그냥 멀티 스레딩, 같은 것을 포함하는 파이썬 스크립트를 작성

python myScript.py -cpu_n 5 -i input_file1 
    python myScript.py -cpu_n 5 -i input_file2 
    python myScript.py -cpu_n 5 -i input_file3 
    ... 

내가 명령 '병렬'세 가지 다른 기계의 10 개의 CPU로 일정을 시도하고있다 :

parallel -S 10/$server1 -S 10/$server2 -S 10/$server3 < commands.list 

제 질문은 병렬 명령으로 각 서버에서 사용할 수있는 최대 CPU 수는 얼마입니까? 그것은 5 * 10 = 50입니까 아니면 10 cpus입니까? man parallel에서

+0

코드없이 말하기가 어렵습니다. –

+0

첫째, * CPU *와 * 코어 *를 구분할 때주의하십시오. 단일 CPU에는 8 개 이상의 코어가있을 수 있습니다. 둘째, * 작업 * 및 * 코어 *에 대해주의해야합니다. - 다른 시간에 다른 코어에서 돌아 다니고 다른 코어에서 실행될 수있는 작업을 하나 만들 수 있습니다. "CPU/코어 친 화성"*을 고려하십시오. 하나의 작업은 이론적으로 10 개의 CPU 각각의 수명 단계에서 실행할 수 있습니다. –

+0

commands.list가 너무 단순하다면 GNU Parallel에서 생성 할 수 있습니다 : parallel python myScript.py -cpu_n 5 -i ::: input_file *; 명령이 매우 복잡한 경우 bash 함수를 사용하십시오. https://www.gnu.org/software/parallel/man.html#EXAMPLE:Calling-Bash-functions –

답변

1

:

--jobs N 
    -j N 
    --max-procs N 
    -P N  Number of jobslots on each machine. Run up to N 
      jobs in parallel. 0 means as many as possible. 
      Default is 100% which will run one job per CPU 
      core on each machine. 


    -S 
    [@hostgroups/][ncpu/]sshlogin[,[@hostgroups/][ncpu/]sshlogin[,...]] 
    : 
      GNU parallel will determine the number of CPU 
      cores on the remote computers and run the number 
      of jobs as specified by -j. If the number ncpu 
      is given GNU parallel will use this number for 
      number of CPU cores on the host. Normally ncpu 
      will not be needed. 

그래서 당신의 명령을 병렬로 각 서버에서 10 일까지 실행됩니다.

각 명령에서 5 개의 CPU 코어를 사용할지 여부는 불분명합니다. 당신의 명령을 각각 5 개 코어를 사용하는 경우, 서버 당 50 개의 코어가 사용되며,이 경우에는 내가 사용하는 대신 당신이 ncpu/server 구문을 사용하지 않는 것이 좋습니다,하지만 것

parallel -j 20% -S $server1,$server2,$server3 < commands.list 

당신이 서버를 혼합 할 수 있습니다이 방법을 그 다른 수의 코어를 가지고 있고, GNU Parallel은 그 중 1/5을 병렬로 시작할 것입니다.

+0

%를 포함해야한다는 것에 동의합니다. 재미있는 것은 내가 방금 작은 규모로 시도했다는 것입니다 : 2 개의 CPU를 사용하는 파이썬 스크립트와 3 개의 서버에 각각 2 개의 CPU를 갖는 병렬 명령. 그 결과 각 서버는 2 개의 CPU 만 제공하고 2 * 2의 CPU는 제공하지 않습니다. –