GNU Parallel - Альтернативный аргумент

Sep 09 2020

Я хочу иметь возможность изменять аргумент для каждого выполнения моей параллельной команды.

У меня есть сценарий для обработки изображений, и я использую GNU Parallel для одновременного запуска нескольких процессов. Я использую ядро ​​графического процессора в этом скрипте, но используется только одно из двух ядер графического процессора.

Я хочу иметь возможность использовать 2 разных файла конфигурации (один для GPU 1 и один для GPU 2), но я не знаю, как это сделать.

gsutil ls -d $ee_repo | parallel -j 10 -k "task {} $PWD $year $config" С изменением $ config с gpu_1 на gpu_2 при каждом втором выполнении

Возможно это или нет?

Спасибо 😉

РЕДАКТИРОВАТЬ:

Используя номер задания параллельной команды ( {#}) в качестве аргумента, затем получите 0 или 1, используя модуль этого номера задания:

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

В функции задачи :

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

Ответы

1 OleTange Sep 10 2020 at 14:26

Учитывая ваше описание, вы, вероятно, не захотите использовать GNU Parallel. Представьте, что все нечетные задания занимают 1 секунду, а все четные - 2 секунды. Тогда вы получите задания, выполняемые на одном графическом процессоре, в то время как ни одно не выполняется на другом.

Вместо этого вы хотите, чтобы работа на GPU2 начиналась сразу после завершения работы на GPU2. {%}(он же слот вакансии) предназначен для этого:

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

Примерно так должно работать:

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

Выход

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