LINUX.ORG.RU

GCC патч на ядро, под конкретную архитектуру процессора, march\mtune и пр.

 , , ,


1

2

Накатил патч на ядро https://github.com/graysky2/kernel_gcc_patch , в конфигурации появилась моя архитектура - bulldozer вместо стандартной K8/10. Собрал ядро.

Теперь парочка вопросов к знатокам:

1. В документации к патчу пишут что для процессоров на архитектуре bulldozer в параметрах компиляции надо выставлять -march=bdver1. Что будет действительно лучше native или bdver1 ?

2. Нужен ли -mtune ? Если да, то какой: native или bdver1 ?

3. Нужно ли сначала пересобирать GCC и libtool, перед компиляцией целевых пакетов с данными оптимизациями ?

Имеется в виду получение максимально быстрого кода под данный процессор, вне зависимости от того, насколько мал будет прирост производительности.

gcc -v: https://pastebin.com/rtcif81K



Последнее исправление: d-7 (всего исправлений: 2)
Ответ на: комментарий от LinuxDebian

А профит будет? или только гемор с ручным обновлением?

Не знаю насчет ощутимого профита, но так как у меня на генте компилируется все в любом случае, то хотелось бы поиметь с этого максимум.

вывод

gcc -march=native -E -v - </dev/null 2>&1 | grep cc1

 /usr/libexec/gcc/x86_64-pc-linux-gnu/6.4.0/cc1 -E -quiet -v - -march=bdver2 -mmmx -mno-3dnow -msse -msse2 -msse3 -mssse3 -msse4a -mcx16 -msahf -mno-movbe -maes -mno-sha -mpclmul -mpopcnt -mabm -mlwp -mfma -mfma4 -mxop -mbmi -mno-bmi2 -mtbm -mavx -mno-avx2 -msse4.2 -msse4.1 -mlzcnt -mno-rtm -mno-hle -mno-rdrnd -mf16c -mno-fsgsbase -mno-rdseed -mprfchw -mno-adx -mfxsr -mxsave -mno-xsaveopt -mno-avx512f -mno-avx512er -mno-avx512cd -mno-avx512pf -mno-prefetchwt1 -mno-clflushopt -mno-xsavec -mno-xsaves -mno-avx512dq -mno-avx512bw -mno-avx512vl -mno-avx512ifma -mno-avx512vbmi -mno-clwb -mno-mwaitx -mno-clzero -mno-pku --param l1-cache-size=16 --param l1-cache-line-size=64 --param l2-cache-size=2048 -mtune=bdver2

патч на ядро уже стоит, в make.conf -march-native

d-7
() автор топика

1. В документации к патчу пишут что для процессоров на архитектуре bulldozer в параметрах компиляции надо выставлять -march=bdver1. Что будет действительно лучше native или bdver1 ?

bdver1. native не всегда правильно определяет.

2. Нужен ли -mtune ? Если да, то какой: native или bdver1 ?

Такой же, как -march

3. Нужно ли сначала пересобирать GCC и libtool, перед компиляцией целевых пакетов с данными оптимизациями ?

Нет, пересборка ничего не даст.

xDShot ★★★★★
()

По-моему, на современных камнях уже давно просто бессмысленно пересобирать ведро. Слишком малый профит, на уровне погрешности измерений.

slamd64 ★★★★★
()

Ты можешь сказать нормально, какой у тебя процессор?

Bruce_Lee ★★
()

От этого патча есть реальный смысл только на embedded. Всегда Ваш И.О. Капитана.

init_6 ★★★★★
()

Попробуй кростулом собрать GCC в -mnative

Deleted
()
Ответ на: комментарий от greenman

AMD Family 15h (Piledriver) -march=bdver2
Так у тебя Bulldozer или Piledriver?

Простите, опечатался. А make.conf стоит правильно, bdver1 для Bulldozer.

Ты можешь сказать нормально, какой у тебя процессор?

Да. AMD A8-5557M.

От этого патча есть реальный смысл только на embedded. Всегда Ваш И.О. Капитана.

Почему ?

Попробуй кростулом собрать GCC в -mnative

Не понял

d-7
() автор топика
Ответ на: комментарий от Deleted

У меня этот native считал, что на Pentium Dual Core E2180 не было никаких SSE. Потом поправили, конечно. Но выхлоп его стоит проверять.

a1batross ★★★★★
()

Если ядро собираешь из sys-kernel/gentoo-sources, то этот патч можно не накатывать ручками — просто ставь пакет с USE="experimental".

march=native смело используй, если не используешь какой-нибудь DistCC (с поправкой на версию GCC, лучше проверить, что этот native включает). Если используешь — лучше явно задай в march архитектуру своего CPU.

Пересобирать GCC и остальной тулчейн нет необходимости.

spijet ★★★
()
Последнее исправление: spijet (всего исправлений: 1)
Ответ на: комментарий от spijet

USE=«experimental»

Спасибо. Вчера как раз обратил на этот юзфлаг.

Где то год назад юзал скрипт app-portage/cpuid2cpuflags, который выдал мне вот этот результат:

aes avx fma3 fma4 mmx mmxext popcnt sse sse2 sse3 sse4_1 sse4_2 sse4a ssse3 xop

Сегодня решил перепроверить, и у меня появился новый флаг

f16c

Это из-за того, что я пропатчил ядро? бтв, мой make.conf (кусок с оптимизациями)

CFLAGS="-O2 -mtune=bdver1 -march=bdver1 -pipe"
CXXFLAGS="${CFLAGS}"
CPU_FLAGS_X86="aes avx f16c fma3 fma4 mmx mmxext popcnt sse sse2 sse3 sse4_1 sse4_2 sse4a ssse3 xop"
MAKEOPTS="-j4"

Есть какие то замечания или советы?

d-7
() автор топика
Ответ на: комментарий от init_6

Уже прогуглил. Встраиваемые системы... Но патч поддерживает архитектуры, которые не всегда юзают в банкоматах\терминалах итд.

d-7
() автор топика
Ответ на: комментарий от d-7

Этот патч не сделает чудес. Всё ускорение, которого ты можешь добится от его применения, будет на уровне погрешности. Это следствия а в причинах ты сможешь разобраться и сам если захочешь.

init_6 ★★★★★
()
Ответ на: комментарий от d-7

От ядра новые флаги не появятся. Скорее всего, обновился GCC или этот самый app-portage/cpuid2cpuflags.

Есть какие то замечания или советы?

Если указал -march=<архитектура твоего CPU>, то -mtune по умолчанию принимает аналогичное значение, поэтому указывать его явно не требуется.

Ещё можешь добавить эти флаги CPU в USE=.

spijet ★★★
()
Ответ на: комментарий от init_6

Этот патч не сделает чудес. Всё ускорение, которого ты можешь добится от его применения, будет на уровне погрешности.

Я полностью с этим согласен. Но как я писал выше, у меня гента, мне в любом случае компилировать, так почему же не выжать самый максимум и получить максимальный профит от этого процесса, пусть он и будет в районе погрешности.

spijet Спасибо за совет.

Еще хотелось бы сравнить native и bdver1 по выводу флагов, что бы уж наверняка. Как можно посмотреть для bdver1 ?

d-7
() автор топика
Ответ на: комментарий от d-7

Еще хотелось бы сравнить native и bdver1 по выводу флагов, что бы уж наверняка. Как можно посмотреть для bdver1 ?

Напрямую флаги конкретного march посмотреть не получится. Косвенно можно вытащить из исходников компилятора (gcc/config/i386/i386.c). Еще можно из вывода echo | gcc -dM -E - -march=${ARCH}, если искать определения похожие на -m${OPTION}, например:

#define __SSE2__ 1  // -msse2
#define __SSSE3__ 1 // -msse3
#define __RDRND__ 1 // -mrdrnd

anonymous
()
Ответ на: комментарий от anonymous

Еще хотелось бы сравнить native и bdver1 по выводу флагов, что бы уж наверняка. Как можно посмотреть для bdver1 ?

Напрямую флаги конкретного march посмотреть не получится...

Добавлю. GCC любит самопроизвольно включать опцию -mavx, тем самым генерируя невалидный код с неподдерживаемыми avx-инструкциями. Поэтому, если -mnative выводить -mno-avx, то надо принудительно указывать -march=ARCH -mno-avx.

anonymous
()

получение максимально быстрого кода под данный процессор, вне зависимости от того, насколько мал будет прирост производительности.

Собери разные варианты, померь производительность, выбери самое быстрое.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Собери разные варианты, померь производительность, выбери самое быстрое.

Что лучше всего можно собрать и как\чем это померить ?

echo | gcc -dM -E - -march=${ARCH}

Спасибо, native и bdver1 не много отличаются. Интересно было бы взглянуть на результаты тестов.

d-7
() автор топика
Ответ на: комментарий от Ford_Focus

На одних ресурсах пишут что на архтектуре бульдозер, если загуглить проц в связке с Piledriver то эта. Кому верить?

d-7
() автор топика
Ответ на: комментарий от d-7

Что лучше всего можно собрать

Ты же собрался собирать ядро? Вот его и собирай.

и как/чем это померить?

Предполагается, что у тебя уже есть критерий, по которому определяется «самое быстрое ядро». Вот его нужно измерять. Параметров можно придумать сотни. Например, время, которое тратится на один системный вызов, в который передан неправильный параметр.

i-rinat ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.