2017-01-26 2 views
3

ich nur einen Python-Skript geschrieben, das Multi-Threading beinhaltet, so etwas wie:verwendet GNU parallel einen Multi-Threaded-Befehl parallelisieren

python myScript.py -cpu_n 5 -i input_file 

den Befehl für meine Hunderte von Input-Dateien auszuführen, ich Erzeugen bin ein Liste (commands.list) von Befehlen für jeden:

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 
    ... 

und ich versuche, sie mit dem Befehl ‚parallel‘ zu planen und zu 10 CPUs von drei verschiedenen Maschinen:

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

Meine Frage ist: Was ist die maximale Anzahl der CPUs wird auf jedem Server mit dem parallelen Befehl verwendet werden? Wird es 5 * 10 = 50 oder nur 10 CPUs sein?

+0

Schwer zu sagen ohne Code. –

+0

Erstens, seien Sie vorsichtig, um * CPUs * von * Kernen * zu unterscheiden, eine einzelne CPU kann 8 oder mehr Kerne haben. Zweitens müssen Sie bei * Jobs * und * Kernen * vorsichtig sein - Sie könnten einen Job erstellen, der herumläuft und auf verschiedenen Kernen zu unterschiedlichen Zeiten ausgeführt wird - denken Sie * "CPU/Core-Affinität" *. Ein Job könnte theoretisch auf jeder der 10 CPUs irgendwann in seinem Leben laufen. –

+0

Wenn die commands.list so einfach ist, könnte GNU Parallel einfach generiert werden: parallel python myScript.py -cpu_n 5 -i ::: input_file *; Wenn der Befehl sehr komplex ist, verwenden Sie eine Bash-Funktion: https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Calling-Bash-functions –

Antwort

1

Von man parallel:

--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. 

Also Ihr Befehl bis zu 10 Arbeitsplätze auf jedem Server parallel laufen.

Ob jeder Ihrer Befehle 5 CPU-Kerne verwendet, ist unklar. Wenn jede Ihrer Befehle 5 Kerne verwenden, 50 Kerne pro Server verwendet werden, und in diesem Fall empfehle ich Ihnen nicht die ncpu/server Syntax verwenden, sondern stattdessen verwenden:

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

Auf diese Weise können Server mischen, dass haben eine unterschiedliche Anzahl von Kernen, und GNU Parallel wird 1/5 davon parallel starten.

+0

Ich stimme zu, dass der Prozentsatz enthalten sein sollte. Interessant war, dass ich es nur in kleinerem Maßstab probiert habe: ein Python-Skript mit 2 CPUs und ein Parallel-Kommando mit 2 CPUs auf jeweils 3 Servern. Das Ergebnis war, dass jeder Server nur 2 CPUs, aber keine 2 * 2 CPUs zur Verfügung stellte. –

Verwandte Themen