Эльбрус/оптимизация: различия между версиями
(нач из чатика) |
м (→Ссылки: dev.mcst.ru!) |
||
(не показано 17 промежуточных версий 2 участников) | |||
Строка 2: | Строка 2: | ||
= FAQ = | = FAQ = | ||
== -march/-mtune == | |||
Q: Как оптимизировать сборку под конкретный процессор? | |||
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: | |||
{{note|{{pkg|lcc}} по умолчанию выставляет {{cmd|-march}} для целевой версии архитектуры, под которую собран сам компилятор (но ''не'' выставляет уровень оптимизации, в отличие от gcc); {{pkg|clang}} по умолчанию ''не'' выставляет и {{cmd|-march}}, а <tt>generic</tt> будет <tt>e2kv2</tt>.}} | |||
{{note|Если на стадии линковки компилятор принимает в работу разделяемые библиотеки, собранные для более высокой версии системы команд, чем заданная по {{cmd|-march}} -- в итоговом бинарнике будет проставлена более высокая вместо заданной.}} | |||
== -O2 == | |||
Q: Мой код на x86 собирается с -O2, почему он работает так медленно на "Эльбрусе"? | |||
A1: [[lcc]] осмысленным образом поддерживает уровни оптимизации вплоть до -O4, при этом в дистрибутивах ОС Альт (и вроде как Эльбрус Линукс) штатно применяется -O3; попробуйте указать этот уровень оптимизации для сборки. Вслепую задавать -O4 не следует, т.к. результаты могут быть противоречивыми и обязательно надо смотреть предметно. | |||
A2: Проверьте, что хотя бы -O2 при сборке на e2k "долетело" до компилятора -- {{cmd|make V=1 VERBOSE=1}} в случае {{cmd|cmake}} либо {{cmd|ps auxww | grep -- -O}} в общем случае. Попадались сборочные системы, которые вовсе ничего не передавали, что на lcc равнозначно -O0 (в альте сделана обёртка, которая при отсутствии -O* выставляет -O3, но закладываться на такую подстраховку всё же не следует). | |||
== if-else-if-else vs switch == | == if-else-if-else vs switch == | ||
Q: Если много условий в elseif, то м.б. переделать на switch case, будет быстрее? (Сергей Еронов) | Q: Если много условий в elseif, то м.б. переделать на switch case, будет быстрее? (Сергей Еронов) | ||
A: Если switch сможет соптимизироваться, то да. Если нет - то по скорости будет | A: Если switch сможет соптимизироваться, то да. Если нет - то по скорости будет так же. Так что лучше переделать. | ||
Это к ситуации, если идёт цепочка if-else if-...else if-else. Если подразумевалось много условий внутри одного else if, то неважно. (Alex Markin) | Это к ситуации, если идёт цепочка if-else if-...else if-else. Если подразумевалось много условий внутри одного else if, то неважно. (Alex Markin) | ||
Строка 13: | Строка 34: | ||
* [[эльбрус/lcc]] | * [[эльбрус/lcc]] | ||
* [[эльбрус/портирование]] | * [[эльбрус/портирование]] | ||
* [http://mcst.ru/ | * [[:en:Elbrus/optimization]] | ||
* [http://dev.mcst.ru/book/index.html Руководство по эффективному программированию на платформе «Эльбрус»] <!-- исходно http://mcst.ru/elbrus_prog --> | |||
** [http://ftp.altlinux.org/pub/people/mike/elbrus/docs/elbrus_prog/html/chapter6.html 6. Повышение производительности] | ** [http://ftp.altlinux.org/pub/people/mike/elbrus/docs/elbrus_prog/html/chapter6.html 6. Повышение производительности] | ||
** [http://ftp.altlinux.org/pub/people/mike/elbrus/docs/elbrus_prog/html/chapter8.html 8. Рекомендации по оптимизации программ под архитектуру Эльбрус] | ** [http://ftp.altlinux.org/pub/people/mike/elbrus/docs/elbrus_prog/html/chapter8.html 8. Рекомендации по оптимизации программ под архитектуру Эльбрус] | ||
* [http://github.com/FulgurIgor/Elbrus-Optimization заметки на манжетах] (в основном фортран) | |||
* [http://m.habr.com/ru/post/563308/ На пути к вершине: Магма и Кузнечик на Эльбрусе] и другие заметки Дмитрия Щербакова (КриптоПро): | |||
** [http://github.com/crypto-das/cpuminer-e2kv5-template Заготовка оптимизации cpuminer] (sha2, scrypt) | |||
** [http://habr.com/ru/post/647165/ Война с компилятором и собой: об оптимизациях вещественной арифметики на Эльбрусе] | |||
* [http://github.com/ilyakurdyukov/e2k-ports/blob/main/README.md Elbrus porting cheat sheet] | |||
* [http://alexanius.ru/comp_opt_azbuka.html Азбука оптимизаций компилятора (дорабатывается)] (Алексей Маркин) | |||
* [http://0x1.tv/20210617J Оптимизация СПО для платформы Эльбрус] ([http://vimeo.com/64297725 видео], слайды) | |||
* [http://youtube.com/watch?v=Azh25lsHqPE UNIGINE C++ School 1.1 - Лекция #1 - Мировые константы] (общее) | |||
* [http://mcst.ru/postroenie-optimizirovannogo-koda-dlya-vliwarkhitektur Построение оптимизированного кода для VLIW-архитектур] | |||
* [http://t.me/qemu_e2k/4301 Особенности запуска ШК на исполнение] | |||
* [http://smartengines.ru/elbrus/ Оптимизация нейросетей на платформе «Эльбрус»] | |||
{{Category navigation|title=E2K|category=E2K|sortkey=*}} | {{Category navigation|title=E2K|category=E2K|sortkey=*}} |
Текущая версия от 15:33, 3 июля 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)
Ссылки
- эльбрус/lcc
- эльбрус/портирование
- en:Elbrus/optimization
- Руководство по эффективному программированию на платформе «Эльбрус»
- заметки на манжетах (в основном фортран)
- На пути к вершине: Магма и Кузнечик на Эльбрусе и другие заметки Дмитрия Щербакова (КриптоПро):
- Elbrus porting cheat sheet
- Азбука оптимизаций компилятора (дорабатывается) (Алексей Маркин)
- Оптимизация СПО для платформы Эльбрус (видео, слайды)
- UNIGINE C++ School 1.1 - Лекция #1 - Мировые константы (общее)
- Построение оптимизированного кода для VLIW-архитектур
- Особенности запуска ШК на исполнение
- Оптимизация нейросетей на платформе «Эльбрус»