Ваша проблема связана с издержками GNU Parallel: запуск задания занимает 5-10 мс. Таким образом, вы, вероятно, увидите, что GNU Parallel работает на 100% на одном ядре, а остальные бездействуют.
Но вы можете запустить несколько параллелей GNU:
https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Speeding-up-fast-jobs
Итак, разбейте список на более мелкие куски и запустите их параллельно:
cat list.lst | parallel --block 100k -q -I,, --pipe parallel --joblog process.log{#} sh job_run.sh {} >>score.out
Это должно работать с 48 + 1 GNU Parallels, поэтому оно должно использовать все ваши ядра. Большинство ваших ядер будут использоваться для накладных расходов, потому что ваши задания выполняются очень быстро.
Если вы не используете process.log
, то это можно сделать с меньшими накладными расходами:
perl -pe 's/^/sh job_run.sh /' list.lst | parallel --pipe --block 100k sh >>score.out
Это добавит к каждой строке sh job_run.sh
и даст 100 КБ строк для 48 sh
с, работающих параллельно.