GNU Параллельный запуск Make-файлов с разными уровнями оптимизации
Существует не оптимальный уровень -O. Мой подход для того, чтобы найти самое быстрое выполнение для моего конкретного кода, состоит в том, чтобы скомпилировать тот же код с обычными уровнями оптимизации (то есть -O0, -Ofast, -O1, -O2, -O3,-march=native) и проверить, какие флаги выдают мне самое быстрое исполнение (со временем).
Итак, есть ли способ проверить все уровни оптимизации (перечисленные выше), запускающие Makefile с каждой оптимизацией (-O level)?
Я думаю, что Gnu Parallel может запустить Makefile, изменяя уровень -O, но я не знаю, как это понять?
Заранее спасибо.
1 ответ
Вы хотите использовать GNU Parallel, чтобы делать несколько сборок параллельно? Вам потребуются как минимум отдельные каталоги сборки и более сложная настройка сборки, если вы хотите избежать копирования всего каталога исходного кода. Если вы попытаетесь выполнить несколько отдельных сборок в одном и том же каталоге одновременно, некоторые объектные файлы будут собраны с одним набором CFLAGS
и другие с другими.
Используйте предложение @Etan's loop:
NJOBS=$(getconf _NPROCESSORS_ONLN) # adjust as desired
for flag in -O{0..3} -O{3,fast}" -march=native"; do
make clean
make -j"$NJOBS" CFLAGS+="$flag -fprofile-generate"
./a.out # feed it some input that exercises different options and code paths
make clean
make -j"$NJOBS" CFLAGS+="$flag -fprofile-use"
perf stat ./a.out | tee "perfstat$flag.txt"
done
Обратите внимание на использование make -j
для параллелизма, а не параллельного GNU. Также обратите внимание на использование профильной оптимизации. x264 имеет систему сборки с make fprofiled
цель для сборки исполняемого файла PGO, который заботится о цикле сборки / запуска / восстановления. Так что это возможно, но IDK, если это делает их Makefile грязным.
Вы можете использовать GNU параллельно для запуска синхронизации вашего кода, но вы получите более согласованные результаты, если вы выполните запуск синхронизации на простаивающей машине.
Если вы хотите проверить, как работает ваш код, когда одновременно выполняется несколько его копий, конкурирующих за пространство кеша и пропускную способность памяти (или даже ресурсы выполнения с гиперпоточностью), то протестируйте его с несколькими копиями одного и того же кода, а не некоторые пробеги, конкурирующие с gcc, некоторые с -O0
и некоторые с -O3
,
Что касается параметров оптимизации, вы обычно получите лучшие результаты от gcc с -fprofile-generate
а также-fprofile-use
опции. Clang также может выполнять оптимизацию по профилю, используя те же параметры или используя данные счетчиков производительности CPU. (Руководство описывает использование инструмента для преобразования Linux perf record
данные в то, что может использовать Clang.)
Некоторые оптимизации gcc включены только с -fprofile-use
(или вручную, а не просто -O3
). например -funroll-loops
может помочь в некоторых тесных петлях. Не используйте для всего, потому что больший размер кода может привести к пропаданию I-кэша в целом во всей программе, что перевешивает выгоды от сокращения издержек цикла в некоторых горячих циклах.