GNU Parallel - Argomento alternativo

Sep 09 2020

Voglio essere in grado di alternare un argomento per ogni esecuzione del mio comando parallelo.

Ho uno script per elaborare le immagini e utilizzo GNU Parallel per avviare diversi processi contemporaneamente. Uso il core GPU in questo script ma viene utilizzato solo uno dei miei 2 core GPU.

Voglio essere in grado di utilizzare 2 diversi file di configurazione (uno per GPU 1 e uno per GPU 2) ma non so come farlo.

gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year $config" Con $ config che cambia da gpu_1 a gpu_2 ogni altra esecuzione

È possibile o no?

Grazie 😉

MODIFICARE:

Utilizzando il numero di lavoro del comando parallelo ( {#}) come argomento, quindi ottenere 0 o 1 utilizzando il modulo di questo numero di lavoro:

gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year {#}"

Nella funzione task :

task(){
...
jobnumber=$4 gpu=$(expr $jobnumber% 2)
...
}

Risposte

1 OleTange Sep 10 2020 at 14:26

Data la tua descrizione, probabilmente non vuoi che GNU Parallel si alterni. Immagina che tutti i lavori dispari richiedano 1 secondo e tutti i lavori pari richiedano 2 secondi. Quindi si finisce con i lavori in esecuzione sulla stessa GPU mentre nessuno è in esecuzione sull'altra.

Quello che invece vuoi è avere un lavoro che inizi su GPU2 non appena un lavoro finisce su GPU2. {%}(aka. job slot) è fatto per questo:

parallel -j2 'sleep {}; echo {}-GPU{%} seq {#}' ::: 1 2 1 2 1 2 1 2 1 2 1 2
MarkSetchell Sep 09 2020 at 18:35

Qualcosa del genere dovrebbe funzionare:

seq 14 | parallel -k echo task {} {= '$_=seq() % 2 ? "gpu1" : "gpu2"' =}

Produzione

task 1 gpu1
task 2 gpu2
task 3 gpu1
task 4 gpu2
task 5 gpu1
task 6 gpu2
task 7 gpu1
task 8 gpu2
task 9 gpu1
task 10 gpu2
task 11 gpu1
task 12 gpu2
task 13 gpu1
task 14 gpu2