LINUX.ORG.RU

Вопрос по опции -march=

 ,


1

0

Пробовал в make.conf выставить CFLAGS="-march=i686" CXXFLAGS="$CFLAGS" или CFLAGS="-march=generic" CXXFLAGS="$CFLAGS", в обоих случаях при попытке эмерджа ошибка C++ compiler cannot create executables.

Если не задавать -march= или задать -march=native, то всё нормально.

Почему такая ошибка? Как оптимизировать под x86_64, но не под конкретный процессор?

★★★★★

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

Ответ на: комментарий от hippi90

-march=i386

поправил. i686

Вот просто взял и поделил на ноль.

тоесть если не задать -march это будет то же самое что и задать под x86_64?

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

Почему такая ошибка?

Потому, что компилятор настроен создавать 64-х битные бинарники, а "-march=i386" приводит к

ошибка: заданный процессор не поддерживает набор команд x86-64
«generic»'и же нельзя задавать в -march:
ошибка: обобщенный процессор может использоваться только для -mtune= switch
По умолчанию бинарники и так будут созданы под обобщённый процессор.

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

-march=x86-64

о! так работает. до этого пробовал -march=x86_64
а почему ты думаешь, что лучше ничего не указывать?

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

i386 и i686 - это 32-х битные x86 процессоры, а не x86_64.

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

Прочитай уже документацию https://gcc.gnu.org/onlinedocs/gcc-6.1.0/gcc/x86-Options.html#x86-Options

-march задает набор инструкций, который может использовать компилятор. Если ты указал -march=i386, то компилятор будет собирать бинарник с инструкциями, которые были доступны только в Intel 80386.

-march=native соберет под твой текущий проц, например, если у тебя проц на архитектуре Skylake, то -march=native тождественно -march=skylake.

Если тебе нужен бинарник, который будет работать на большинстве x86-64 процов, то либо не указывай вообще этот флаг, либо выбирай самую младшую модель из тех, которые хочешь поддерживать.

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

ошибка: обобщенный процессор может использоваться только для -mtune= switch

можешь расшифровать, пожалуйста?
что значит «обобщенный процессор»?
что за switch?
в чём разница между -march=, -mtune= и -mcpu=?

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

-march=native тождественно -march=skylake

Не знаю как конкретно для skylake, но для phenom2 -march=native раскрывается в большее чем просто -march=amdfam10 количество ключей.

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

Ну так неконкретный как в сабжевом ТЗ. А «конкретный» - это когда задаётся какой-нибудь amdfam10 и бинарник собирается под конкретный набор инструкций, и на другом проце может не взлететь.

«switch» - переключатель, опция.

-march= задаёт архитектуру, а -mtune= под какой процессор оптимизировать. -mcpu= устарела и больше не используется:

gcc: предупреждение: ключ <<-mcpu=>> устарел; используйте <<-mtune=>> или <<-march=>>

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

-march= задаёт архитектуру, а -mtune= под какой процессор оптимизировать

а разве они не одно и то же название архитектуры процессора задают? например в моём случае -march=amdfam10 -mtune=amdfam10
в мане сказано, что -mtune= в отличие от -march= тюнингует производительность под конкретный процессор, а значения у них одинаковые.
вобщем непонятна мне разница между ними. какой смысл разделять это на 2 разных опции? если ты компилируешь под конкретную архитектуру, не логично ли под ЭТУ ЖЕ архитектуру и тюнинговать?

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

не логично ли под ЭТУ ЖЕ архитектуру и тюнинговать?

Нет, поскольку это может ломать совместимость с другими процами этой же архитектуры. А разница может быть. Раньше так вообще можно было легко оптимизировать под процессор с сопроцессором бинарник, который не взлетит на аналогичном процессоре, но без сопроцессора.

saahriktu ★★★★★
()
Последнее исправление: saahriktu (всего исправлений: 1)

-march=i686

оптимизировать под x86_64

*FACEPALMITY*

Как оптимизировать под x86_64, но не под конкретный процессор?

-march=x86-64, а лучше ничего не прописывать. В том числе fp, O, pipe и прочее.

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

-march задаёт доступный набор инструкций, какие инструкции компилятору можно генерировать, а какие нет

если ты компилируешь под конкретную архитектуру, не логично ли под ЭТУ ЖЕ архитектуру и тюнинговать?

архитектура (в смысле набор команд) может быть не самой последней, но при этом для конкретных процессоров способы оптимизации могут заметно отличаться

Harald ★★★★★
()

короче, практический подход такой - если скомпиленные бинарники дальше твоей генты на одном твоём компе никогда никуда не пойдут, то ставь -march=native и много не думай

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

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

Конечно школьников нужно отучивать от онанизма на непонятные зачётные ключики. Но без -O2 производительность будет печальная до неюзабельности во многих случаях.

Без ключей:
c-ray-mt v1.1
Rendering took: 9 seconds (9966 milliseconds)

-O2
c-ray-mt v1.1
Rendering took: 6 seconds (6332 milliseconds)

-O3
c-ray-mt v1.1
Rendering took: 2 seconds (2872 milliseconds)

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

-O* на это никак не влияют. Да и переносимый нативный код это оксюморон.

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

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

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

Давай начнем с того, насколько это вообще имеет смысл? Дело в том, что -O3 может привести к падению производительности, место ее прироста. Таки дела, да. Особенно на процах с небольшими кэшами.

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

Хочешь маскимального прироста производительности с максимальным количеством приключений на свою жопу - юзай -O3. Иначе - оставайся на -O2 и тюнингуй конкретные опции, если есть такое желание. Но перед этим - осиль мануал gcc, без него все эти «тюнинги» - как тыкание слепого котенка.

Pinkbyte ★★★★★
()

что за юзфлаг mmxext? точнее cpu_flags_x86_mmxext точнее CPU_FLAGS_X86=mmxext
без него не хочет собираться ffmpeg, но с ним не хочет собираться dbus

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