Параллельный GNU
Я делал синтетический тест для компиляции и не мог потрудиться написать Makefile, поэтому я использовал:
sudo apt-get install parallel
ls | grep -E '\.c$' | parallel -t --will-cite "gcc -c -o '{.}.o' '{}'"
Объяснение:
{.}
принимает входной аргумент и удаляет его расширение
-t
распечатывает команды, которые выполняются, чтобы дать нам представление о прогрессе
--will-cite
удаляет запрос на цитирование программного обеспечения, если вы публикуете результаты, используя его ...
parallel
это так удобно, что я даже сам могу проверить временную метку:
ls | grep -E '\.c$' | parallel -t --will-cite "\
if ! [ -f '{.}.o' ] || [ '{}' -nt '{.}.o' ]; then
gcc -c -o '{.}.o' '{}'
fi
"
xargs -P
также может запускать задания параллельно, но это немного менее удобно, если вы выполняете манипулирование расширением или запускаете несколько команд с ним: вызов нескольких команд через xargs
Параллельное связывание было задано по адресу: Может ли gcc использовать несколько ядер при связывании?
ТОДО: Мне кажется, я где-то читал, что компиляция может быть сведена к умножению матриц, поэтому, возможно, можно также ускорить компиляцию одного файла для больших файлов. Но я не могу найти ссылку сейчас.
Проверено в Ubuntu 18.10.