GNU Parallel - Autre argument

Sep 09 2020

Je veux pouvoir alterner un argument pour chaque exécution de ma commande parallèle.

J'ai un script pour traiter les images et j'utilise GNU Parallel pour lancer plusieurs processus en même temps. J'utilise le noyau GPU dans ce script mais un seul de mes 2 noyaux GPU est utilisé.

Je veux pouvoir utiliser 2 fichiers de configuration différents (un pour le GPU 1 et un pour le GPU 2) mais je ne sais pas comment faire ça.

gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year $config" Avec $ config passant de gpu_1 à gpu_2 à chaque autre exécution

C'est possible ou pas ?

Merci 😉

ÉDITER:

En utilisant le numéro de travail de la commande parallèle ( {#}) comme argument, obtenez 0 ou 1 en utilisant le modulo de ce numéro de travail:

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

Dans la fonction de tâche :

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

Réponses

1 OleTange Sep 10 2020 at 14:26

Compte tenu de votre description, vous ne voulez probablement pas que GNU Parallel alterne. Imaginez que tous les petits travaux prennent 1 seconde et que tous les travaux pairs prennent 2 secondes. Ensuite, vous vous retrouvez avec des tâches s'exécutant sur le même GPU alors qu'aucune ne s'exécute sur l'autre.

Ce que vous voulez à la place, c'est qu'un travail commence sur GPU2 dès qu'un travail est terminé sur GPU2. {%}(aka. job slot) est fait pour cela:

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

Quelque chose comme ça devrait fonctionner:

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

Production

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