LINUX.ORG.RU

История изменений

Исправление Moisha_Liberman, (текущая версия) :

Ещё может кому ресурс пригодится (eng) https://www.agner.org/optimize/

В том, что касается сборки/пересборки системы или пакетов, лучше гентарей никого не найти. Поэтому, я бы рекомендовал не этот сайт. А вот эту страничку https://wiki.gentoo.org/wiki/Safe_CFLAGS#AMD. Несмотря на то, что там всё таки safe flags, там дано более точное указание цели.

Исходя из:

vendor_id : AuthenticAMD
cpu family : 21
model : 2

прямо сразу можно сказать что CFLAGS я бы скрасноглазил вот так:

CFLAGS="-O2 -march=bdver1 -mtune=bdver1 -pipe -fomit-frame-pointer -sse4_2 -avx -m32 -mfpmath=sse"

Хотя, скорее всего, флаги -msse4_2 и avx будут выставлены компилятором автоматически, при указании корректного -march и при указании -mfpmath=sse. Флаг -fomit-frame-pointer может быть выставлен так же автоматически, даже при -О1, но это стоит проверить. У Вас довольно древний gcc, лучше бы да, его обновить.

Насчёт -O3 vs. -O2. Если коротко, то -О3 это чревато. Лучше оставить либо -O2, либо тогда уж ставить -Ofast. Последний флаг это тот же -О3, но с установленым -ffast-math. Нет, скажу сразу что system-wide я бы так не поставил. Причин несколько. Сам по себе -О3 включает ряд оптимизаций в части развёртывания циклов, например. Т.е., не факт что код будет в итоге быстрее, но факт что код будет больше. И весьма вероятен даже отрицательный прирост оптимизации. Ну и плюс ктому, с -ffast-math не все пакеты собираются (тот же sqlite), так что общесистемно ну его на хрен.

Плюс к тому, -ffast-math это довольно агрессивные оптимизации для арифметических вычислений (например, вещественную реассоциацию). Но увы и ах, они не совсем соответствуют IEEE, так что, если результат «где-то там», «примерно так» и «но это не точно» приемлем, то почему бы и нет, хотя, на инструкции ХММ это слабо влияет, если не включена поддержка sse (см. выше).

Как включить веккторизацию. Если принудительно, то указав флаги -ftree-vectorize и -ftree-vectorizer-verbose=N (хотя, данная опция сейчас deprecated и её лучше заменить на -fopt-info-vec). Если, конечно, будет возможно, то компилятор обеспечит использование SIMD. Но лучше бы сразу писать (если SIMD/NEON нужны) с https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html, тогда компилятору нужно будет меньше думать. Примеры здесь https://gcc.gnu.org/projects/tree-ssa/vectorization.html#using. Для того же sse4_2 нужно будет

#include <smmintrin.h>
сделать. https://monoinfinito.wordpress.com/series/vectorization-in-gcc/

Линки по теме. https://habr.com/ru/company/intel/blog/158939/ https://wiki.gentoo.org/wiki/GCC_optimization#-msse.2C_-msse2.2C_-msse3.2C_-mmmx.2C_-m3dnow Плюс, не забываем про инстриники https://software.intel.com/sites/landingpage/IntrinsicsGuide/#techs=SSE4_2.

В итоге CFLAGS я бы поставил так:

CFLAGS="-O2 -march=bdver1 -mtune=bdver1 -pipe -fomit-frame-pointer -sse4_2 -avx -m32 -mfpmath=sse -ftree-vectorize -fopt-info-vec"

Исходная версия Moisha_Liberman, :

Если позволите, то несколько советов.

Ещё может кому ресурс пригодится (eng) https://www.agner.org/optimize/

В том, что касается сборки/пересборки системы или пакетов, лучше гентарей никого не найти. Поэтому, я бы рекомендовал не этот сайт. А вот эту страничку https://wiki.gentoo.org/wiki/Safe_CFLAGS#AMD. Несмотря на то, что там всё таки safe flags, там дано более точное указание цели.

Исходя из:

vendor_id : AuthenticAMD
cpu family : 21
model : 2

прямо сразу можно сказать что CFLAGS я бы скрасноглазил вот так:

CFLAGS="-O2 -march=bdver1 -mtune=bdver1 -pipe -fomit-frame-pointer -sse4_2 -avx -m32 -mfpmath=sse"

Хотя, скорее всего, флаги -msse4_2 и avx будут выставлены компилятором автоматически, при указании корректного -march и при указании -mfpmath=sse. Флаг -fomit-frame-pointer может быть выставлен так же автоматически, даже при -О1, но это стоит проверить. У Вас довольно древний gcc, лучше бы да, его обновить.

Насчёт -O3[/3] vs. -O2. Если коротко, то -О3 это чревато. Лучше оставить либо -O2, либо тогда уж ставить -Ofast. Последний флаг это тот же -О3, но с установленым -ffast-math. Нет, скажу сразу что system-wide я бы так не поставил. Причин несколько. Сам по себе -О3 включает ряд оптимизаций в части развёртывания циклов, например. Т.е., не факт что код будет в итоге быстрее, но факт что код будет больше. И весьма вероятен даже отрицательный прирост оптимизации. Ну и плюс ктому, с -ffast-math не все пакеты собираются (тот же sqlite), так что общесистемно ну его на хрен.

Плюс к тому, -ffast-math это довольно агрессивные оптимизации для арифметических вычислений (например, вещественную реассоциацию). Но увы и ах, они не совсем соответствуют IEEE, так что, если результат «где-то там», «примерно так» и «но это не точно» приемлем, то почему бы и нет, хотя, на инструкции ХММ это слабо влияет, если не включена поддержка sse (см. выше).

Как включить веккторизацию. Если принудительно, то указав флаги -ftree-vectorize и -ftree-vectorizer-verbose=N (хотя, данная опция сейчас deprecated и её лучше заменить на -fopt-info-vec). Если, конечно, будет возможно, то компилятор обеспечит использование SIMD. Но лучше бы сразу писать (если SIMD/NEON нужны) с https://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html, тогда компилятору нужно будет меньше думать. Примеры здесь https://gcc.gnu.org/projects/tree-ssa/vectorization.html#using. Для того же sse4_2 нужно будет
#include <smmintrin.h>
сделать. https://monoinfinito.wordpress.com/series/vectorization-in-gcc/

Линки по теме. https://habr.com/ru/company/intel/blog/158939/ https://wiki.gentoo.org/wiki/GCC_optimization#-msse.2C_-msse2.2C_-msse3.2C_-mmmx.2C_-m3dnow Плюс, не забываем про инстриники https://software.intel.com/sites/landingpage/IntrinsicsGuide/#techs=SSE4_2.

В итоге CFLAGS я бы поставил так:

CFLAGS="-O2 -march=bdver1 -mtune=bdver1 -pipe -fomit-frame-pointer -sse4_2 -avx -m32 -mfpmath=sse -ftree-vectorize -fopt-info-vec"