Эльбрус/оптимизация: различия между версиями

Материал из ALT Linux Wiki
м (→‎Ссылки: +1 (спасибо Игорю Черноусову))
м (+проверка)
Строка 7: Строка 7:


A: [[lcc]] 1.23 и выше умеет как {{cmd|-march}} для указания [[эльбрус/совместимость|минимальной]] версии [[эльбрус/архитектура|микроархитектуры]] -- например, {{cmd|-march=elbrus-v4}} -- так и {{cmd|-mtune}} для оптимизации под конкретный [[модели процессоров Эльбрус|процессор]] (и только под него, на других не запустится), например, {{cmd|-mtune=elbrus-8c}}; разница для конкретного процессора может быть как незначительной (наблюдали порядка процента для [[Эльбрус-8C|e8c]]), так и более заметной (в тех же условиях получили ~8% для [[Эльбрус-1C+|e1cp]]).  Избегайте статической компоновки кода, собранного в разных режимах (например, при сборке с [[эльбрус/eml|EML]]).
A: [[lcc]] 1.23 и выше умеет как {{cmd|-march}} для указания [[эльбрус/совместимость|минимальной]] версии [[эльбрус/архитектура|микроархитектуры]] -- например, {{cmd|-march=elbrus-v4}} -- так и {{cmd|-mtune}} для оптимизации под конкретный [[модели процессоров Эльбрус|процессор]] (и только под него, на других не запустится), например, {{cmd|-mtune=elbrus-8c}}; разница для конкретного процессора может быть как незначительной (наблюдали порядка процента для [[Эльбрус-8C|e8c]]), так и более заметной (в тех же условиях получили ~8% для [[Эльбрус-1C+|e1cp]]).  Избегайте статической компоновки кода, собранного в разных режимах (например, при сборке с [[эльбрус/eml|EML]]).
Пример проверки результата:
$ objdump -x ''бинарник'' | grep архи
архитектура: elbrus-v4:64, флаги 0x00000112:


== -O2 ==
== -O2 ==

Версия от 21:43, 19 марта 2024

Вопросы, ответы и прочие заметки по части оптимизации кода под "Эльбрус".

FAQ

-march/-mtune

Q: Как оптимизировать сборку под конкретный процессор?

A: lcc 1.23 и выше умеет как -march для указания минимальной версии микроархитектуры -- например, -march=elbrus-v4 -- так и -mtune для оптимизации под конкретный процессор (и только под него, на других не запустится), например, -mtune=elbrus-8c; разница для конкретного процессора может быть как незначительной (наблюдали порядка процента для e8c), так и более заметной (в тех же условиях получили ~8% для e1cp). Избегайте статической компоновки кода, собранного в разных режимах (например, при сборке с EML).

Пример проверки результата:

$ objdump -x бинарник | grep архи
архитектура: elbrus-v4:64, флаги 0x00000112:

-O2

Q: Мой код на x86 собирается с -O2, почему он работает так медленно на "Эльбрусе"?

A1: lcc осмысленным образом поддерживает уровни оптимизации вплоть до -O4, при этом в дистрибутивах ОС Альт (и вроде как Эльбрус Линукс) штатно применяется -O3; попробуйте указать этот уровень оптимизации для сборки. Вслепую задавать -O4 не следует, т.к. результаты могут быть противоречивыми и обязательно надо смотреть предметно.

A2: Проверьте, что хотя бы -O2 при сборке на e2k "долетело" до компилятора -- make V=1 VERBOSE=1 в случае cmake либо ps auxww | grep -- -O в общем случае. Попадались сборочные системы, которые вовсе ничего не передавали, что на lcc равнозначно -O0 (в альте сделана обёртка, которая при отсутствии -O* выставляет -O3, но закладываться на такую подстраховку всё же не следует).

if-else-if-else vs switch

Q: Если много условий в elseif, то м.б. переделать на switch case, будет быстрее? (Сергей Еронов)

A: Если switch сможет соптимизироваться, то да. Если нет - то по скорости будет так же. Так что лучше переделать.

Это к ситуации, если идёт цепочка if-else if-...else if-else. Если подразумевалось много условий внутри одного else if, то неважно. (Alex Markin)

Ссылки