GNU Parallel - Argumento alternativo
Quiero poder alternar un argumento para cada ejecución de mi comando paralelo.
Tengo un script para procesar imágenes y uso GNU Parallel para iniciar varios procesos al mismo tiempo. Utilizo el núcleo de GPU en este script, pero solo se usa uno de mis 2 núcleos de GPU.
Quiero poder usar 2 archivos de configuración diferentes (uno para GPU 1 y otro para GPU 2) pero no sé cómo hacerlo.
gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year $config" Con $ config cambiando de gpu_1 a gpu_2 cada dos ejecuciones
Es esto posible o no ?
Gracias 😉
EDITAR:
Usando el número de trabajo del comando paralelo ( {#}) como argumento, luego obtenga 0 o 1 usando el módulo de este número de trabajo:
gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year {#}"
En la función de tarea :
task(){
...
jobnumber=$4 gpu=$(expr $jobnumber% 2)
...
}
Respuestas
Dada su descripción, probablemente no desee que GNU Parallel alterne. Imagine que todos los trabajos impares toman 1 segundo y todos los trabajos pares toman 2 segundos. Luego, terminas con trabajos que se ejecutan en la misma GPU mientras que ninguno se ejecuta en la otra.
En cambio, lo que desea es tener un trabajo que comience en GPU2 tan pronto como termine un trabajo en GPU2. {%}(también conocido como puesto de trabajo) está hecho para esto:
parallel -j2 'sleep {}; echo {}-GPU{%} seq {#}' ::: 1 2 1 2 1 2 1 2 1 2 1 2
Algo como esto debería funcionar:
seq 14 | parallel -k echo task {} {= '$_=seq() % 2 ? "gpu1" : "gpu2"' =}
Producción
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