GNU Parallel - argumento alternativo

Sep 09 2020

Quero poder alternar um argumento para cada execução do meu comando paralelo.

Tenho um script para processar imagens e uso o GNU Parallel para lançar vários processos ao mesmo tempo. Eu uso o núcleo da GPU neste script, mas apenas um dos meus 2 núcleos da GPU é usado.

Quero poder usar 2 arquivos de configuração diferentes (um para GPU 1 e outro para GPU 2), mas não sei como fazer isso.

gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year $config" Com $ config mudando de gpu_1 para gpu_2 a cada duas execuções

Isso é possível ou não ?

Obrigado 😉

EDITAR:

Usando o número do trabalho do comando paralelo ( {#}) como argumento, obtenha 0 ou 1 usando o módulo deste número de trabalho:

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

Na função de tarefa :

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

Respostas

1 OleTange Sep 10 2020 at 14:26

Dada a sua descrição, você provavelmente não deseja que o GNU Parallel seja alternativo. Imagine que todos os trabalhos ímpares demorem 1 segundo e todos os trabalhos pares demorem 2 segundos. Então você acaba com trabalhos em execução na mesma GPU, enquanto nenhum está sendo executado na outra.

Em vez disso, o que você deseja é ter um trabalho começando na GPU2 assim que terminar um trabalho na GPU2. {%}(também conhecido como slot de trabalho) é feito para isso:

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

Algo assim deve funcionar:

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

Resultado

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