GNU Parallel - argumento alternativo
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
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
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