LINUX.ORG.RU

Снова щупаю Генту - есть вопросы

 


3

6

Всем здрасте =] Арч надоел, хочу снова запилить Генту с любимым вторым гномо. Хочется собрать наиболее добротно и возникли пара вопросов:

1. -fomit-frame-pointer, -ffast-math и -mfpmath=sse (или both) во флагах сборки. Даст ли их использование ощутимую пользу (выраженной в скорости работы скомпиленного приложения или же в скорости самой компиляции). И есть ли минусы в этих флагах (кроме проблем с дебагом, при использовании -fomit-frame-pointer)? НЕ amd64.

2. Есть ли ощутимая разница между Voluntary Kernel Preemption и Preemptible Kernel (Preemption Model)? Всегда выбирал последний, но сейчас задумался.

Процессор: AMD Athlon64 X2 5200+
Старый make.conf: http://pastebin.com/Ju9rvmNV

cast megabaks

★★★★★

Последнее исправление: neocrust (всего исправлений: 3)

-ffast-math

Выкинуть. С ним бывают проблемы, например, sqlite не собирается.

Даст ли их использование ощутимую пользу (выраженной в скорости работы скомпиленного приложения или же в скорости самой компиляции)

Хуже точно не будет.

Kindly_Cat
()

-ffast-math

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

-fomit-frame-pointer

На amd64 (а x86 уже почти не осталось) этот флаг включён по умолчанию.

-mfpmath=sse

Имеет смысл.

Вообще, -O2 -pipe -march=native -mmmx -msse%сколько-то там% -mavx (если поддерживается процессором) хватит всем. Плюс графитооптимизации, если gcc собран с графитом (т. е. -floop-block -floop-strip-mine -floop-interchange). Больше не нужно.

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

А, про то, что -mfpmath=sse на 64 битах тоже дефолтный, не знал. Значит, тоже выкинь.

beresk_let ★★★★★
()

На x86_64 включён по дефолту в -O2
На amd64 (а x86 уже почти не осталось) этот флаг включён по умолчанию.

gentoo_root, beresk_let, дело в том, что система у меня будет x86 =]

neocrust ★★★★★
() автор топика
Ответ на: комментарий от Kindly_Cat

А причём тут gcc? Пролистай уже доки от amd. Хотя и в мане gcc, это внезапно, там где и ожидалось:

-mfpmath=unit
           Generate floating-point arithmetic for selected unit unit.  The
           choices for unit are:
           ...
           sse Use scalar floating-point instructions present in the SSE
           ...
           This is the default choice for the x86-64 compiler.

anonymous
()

Если у тебя amd64 - -fomit-frame-pointer не нужен. -mfpmath=both - так лучше не надо, sse предпочтительнее. С both могут быть грабли - я натыкался на них.

Preemption у меня вообще выключен - нужно для порта ZFS на Linux. А в целом я на десктопе особой разницы на глаз не заметил.

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

кстати, да, подтверждаю, у меня он был в CFLAGS, а потом я его выкинул - теперь вспомнил почему :-)

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

тогда -fomit-frame-pointer -mfpmath=sse -msse(тут подставь старшее используемое, сколько есть на проце) как минимум. Ну и USE=«mmx sse» в /etc/make.conf и остальные оптимизационные(sse2 и т.д.), сколько нужно и имеется в проце.

И да, не забудь CXXFLAGS=«${CFLAGS}» :-)

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

Могут ли быть какие-либо грабли с -mfpmath=sse и в чем может быть выражена польза от него?

neocrust ★★★★★
() автор топика
Ответ на: комментарий от Pinkbyte

Спасибо =]

-msse(тут подставь старшее используемое, сколько есть на проце)

gcc -march=native -Q --help=target

показывает, что будет использовать -march=k8-sse3. В этом случае можно не указывать -msse3, верно?

И да, не забудь CXXFLAGS=«${CFLAGS}» :-)

Само собой =]

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

Лучше sse, если уж выбирать. Если дебажить не будешь, то -fomit-frame-pointer, конечно, нужен.

CFLAGS="-O2 -pipe -march=native -mfpmath=sse -mmmx -mssse3 -fomit-frame-pointer -finline-functions -floop-block -floop-strip-mine -floop-interchange -flto"

Это мои флаги на x86, нетбук не умеет 64-битность. -finline-functions взят из -Os (между -Os и -O2 разница буквально в два флага: один включён, другой выключен), -flto включен в погоне за приключениями (приходится для отдельных пакетов выключать, не рекомендую).

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

В этом случае можно не указывать -msse3, верно?

Лучше прямо указать. Правда, в случае с -mss(s)eN не обязательно указывать всю вереницу: достаточно будет указать флаг самой новой SIMD.

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

И вот почему.

У меня на i5-2500K например нет гипертрединга (но он есть на i7-2600K), мне и на SMP с 4-мя ядрами живётся неплохо. Хотя в доках от интола я не нашёл подтверждения, что исполнение инструкций SSE невозможно при гипертрединге.

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

А я тут почитал ещё про AVX и подумал, может вместо -msseXX сделать -mavx?

Suitable for floating point-intensive calculations in multimedia, scientific and financial applications (integer operations are expected in later extensions).
Increases parallelism and throughput in floating point SIMD calculations.
Reduces register load due to the non-destructive instructions.

— со Всегда Вашей.

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

Не надо вместо. Надо в дополнение.

man gcc:

GCC depresses SSEx instructions when -mavx is used. Instead, it generates new AVX instructions or AVX equivalence for all SSEx instructions when needed.

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

Уел. Я был не прав: думал, что они независимы друг от друга.

beresk_let ★★★★★
()

1) CFLAGS="-march=native -O2 -pipe -fomit-frame-pointer -ftree-vectorize"

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

2)Выбирай Preemptible Kernel, сейчас с ним нету проблем для большинства популярного декстопного софта.

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

Падал огнелис и опенофис калк. с mfpmath=sse сняло как рукой. Но это давно было, сейчас на новом компиляторе может и нормально будет...

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

ЕМНИП это старая информация. Но я на всякий случай выключил где-то годик назад...

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

Убери -msse3, оно наверняка входит в -march=native.
Проверить можно так:

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

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

Всё равно не вижу смысла :)

kevindetry@Bigger ~ % echo | gcc -dM -E - -march=native | grep -i sse
#define __SSE4_1__ 1
#define __SSE4_2__ 1
#define __SSE2_MATH__ 1
#define __SSE_MATH__ 1
#define __SSE2__ 1
#define __SSSE3__ 1
#define __SSE__ 1
#define __SSE3__ 1

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

О Ктулше, сколько раз уже это перетирали, вам даже уже Сильвия в своё время бинарниками доказала, что оно и так учитывается, но вы всё равно продолжаете упорно откапывать этот флаг. Не надо, пожалуйста.

kevindetry@Bigger ~ % echo | gcc -dM -E - -march=native | grep -i mmx
#define __MMX__ 1
kevindetry@Bigger ~ % echo | gcc -dM -E - -march=x86-64 | grep -i mmx
#define __MMX__ 1

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

Где ты это взял? Ты какой-то не тот тред читал. В треде, который помню я, у Сильвии получились идентичные бинарники с и без -mmmx. И да, я тебе показал наглядный вывод, доказывающий, что -mmmx входит в -march=native (можешь для своего native перепроверить). Сможешь меня опровергнуть?

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

Как-то так.

beresk_let@Kiwi ~ % gcc -march=native -Q --help=target | grep mmx
  -mmmx                       		[выключено]
beresk_let@Kiwi ~ % gcc -march=native -Q --help=target | grep sse
  -mno-sse4                   		[включено]
  -msse                       		[выключено]
  -msse2                      		[выключено]
  -msse2avx                   		[выключено]
  -msse3                      		[выключено]
  -msse4                      		[выключено]
  -msse4.1                    		[выключено]
  -msse4.2                    		[выключено]
  -msse4a                     		[выключено]
  -msse5                      		
  -msseregparm                		[выключено]
  -mssse3                     		[выключено]
beresk_let ★★★★★
()
Ответ на: комментарий от Kindly_Cat

AVX ещё мало софта использует. SSE распространённее.

В сорцах машинные инструкции не захардкодишь. А остальное GCC оттранслирует.

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