Вы хотите использовать GNU Parallel для параллельного выполнения нескольких сборок? Вам понадобятся как минимум отдельные каталоги сборки и более сложная настройка сборки, если вы хотите избежать копирования всего каталога исходного кода. Если вы попытаетесь сделать несколько отдельных сборок в одном и том же каталоге одновременно, некоторые объектные файлы будут собраны с одним набором CFLAGS
, а другие — с другими.
Используйте предложение цикла @Etan:
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 parallel для хронометража вашего кода, но вы получите более согласованные результаты, если будете выполнять хронометраж на бездействующей машине.
Если вы хотите проверить, как работает ваш код, когда несколько его копий выполняются одновременно, конкурируя за место в кеше и пропускную способность памяти (или даже ресурсы выполнения с гиперпоточностью), протестируйте это с несколькими копиями одного и того же код, некоторые прогоны которого не конкурируют с gcc, некоторые с -O0
, а некоторые с -O3
.
Что касается параметров оптимизации, вы обычно получаете наилучшие результаты от gcc с -fprofile-generate
и -fprofile-use
вариантов. Clang также может выполнять оптимизацию на основе профиля, используя те же параметры. или с использованием данных счетчиков производительности ЦП. (В руководстве описывается использование инструмента для преобразования данных Linux perf record
во что-то, что может использовать Clang.)
Некоторые оптимизации gcc включаются только с помощью -fprofile-use
(или вручную, а не только с помощью -O3
). например -funroll-loops
может помочь в некоторых сложных петлях. Не используйте для всего, потому что больший размер кода может привести к общему промаху I-кэша во всей программе, что перевешивает выигрыш от уменьшения накладных расходов на цикл в некоторых горячих циклах.
person
Peter Cordes
schedule
31.07.2015
CCFLAGS
снова не вариант? - person Eugene Sh.   schedule 31.07.2015time
не очень хороший показатель скорости работы программы. ncsu.edu/hpc/Documents/sprofile.php - person Jeremiah Dicharry   schedule 31.07.2015time
дважды в одной и той же программе, вы можете увидеть, что она работает быстрее во второй раз, потому что она загружается с жесткого диска в первый раз, а во второй раз уже находится в памяти. - person Jeremiah Dicharry   schedule 01.08.2015-Ofast -march=native
должна дать самую быструю программу, даже если вы игнорируете строгое соответствие стандартам, то есть -ffast-math. gcc.gnu.org/onlinedocs/ gcc-5.2.0/gcc/ - person Jeremiah Dicharry   schedule 01.08.2015-funroll-loops
— важная опция, которая доступна только с-fprofile-use
. (или вручную), поэтому не просто профилируйте, но и позволяйте компилятору использовать результаты. - person Peter Cordes   schedule 01.08.2015