Вообще, методов оптимизации софта под Эльбрус довольно много. Тут я просто снимаю шляпу перед разработчиками компилятора. Видно, что они работают над тем, чтобы дать разработчикам больше возможностей по ускорению работы ПО на Эльбрусе. Ранее я разбирал некоторые аспекты и сейчас мы ещё часть разберём. Если вас заинтересовала тема, уделите время руководству по эффективному программированию на платформе «Эльбрус».
Начнём с того, что у Эльбруса есть и свои родные интринсики «e2kintrin.h». То, что компилятор у Эльбруса переваривает интринсики Intel, это крутое решение для обеспечения совместимости с практически любым кодом, но, в общем-то, интринсики Intel не дадут вам такого же прироста по части производительности, как и родные интринсики Эльбруса. В каких проектах эти самые интринсики применяют? Вообще, их не так уж и мало. С одним из них вы можете ознакомиться на habr в статье «На пути к вершине: Магма и Кузнечик на Эльбрусе», а с другим мы ознакомимся в главе 4.4.
В той же статье с habr вы можете найти информацию о том, что компилятор «при подборе опций компиляции выдаёт плотность кода, которая не отличается от теоретических оценок на количество инструкций и тактов».
Что же это за опции такие? Ну, в общем-то, их дофига, но не все из них работают с любым кодом. С рядом приложений эти опции не будут работать.
Скриншот 14. Опции профилирования. Компилирование в 2 этапа. Источник: Альт Линукс.
Если вы чётко знаете, с какими данными будет работать ваша программа, и что именно она будет с ними делать, вы можете «натренировать» её. Для этого используется профилирование, компилирование выполняется в 2 этапа. Сперва вы компилируете программу, так, чтобы она при работе генерировала компиляторный профиль в определённой директории, затем прогоняете свою программу на тестовых данных, и далее, когда собрано достаточно сведений о том, с какими данными работает ваша программа, вы производите повторную компиляцию с использованием этого компиляторного профиля.
Штука просто безумная, вы буквально «тренируете» программу на том наборе данных, с которой ей потом предстоит работать. Однако, забегая наперёд, скажу, что не со всеми программами это сработает.
Скриншот 15. Попытка компиляции dav1d с профилем (-fprofile-generate).
Я пробовал скомпилировать dav1d, который я тестировал в главе 4.3, и с опцией -fprofile-generate, но мне этого сделать не удалось. Скорее всего, причина в том, что dav1d несёт в себе слишком много компонентов, и сборка всего этого дела происходит при использовании сторонних инструментов (meson и ninja). С простыми программами на C при использовании Makefile для сборки с компилятором LCC от МЦСТ, полагаю, всё будет куда проще.
Скриншот 16. Опции режима «вся программа». Источник: Альт Линукс.
Также есть возможность указать компилятору, чтобы он при проведении оптимизаций, когда анализирует код программы, анализировал всю программу, а не только отдельные её опции. По сообщениям многих людей в Telegram-чате «Эльбрусы и с чем их едят», это действительно работает, и позволяет достичь куда большей производительности.
Скриншот 17. Попытка компиляции dav1d с опциями -fPIC и -fwhole-shared.
Но, как и с профилированием, это работает не со всеми программами. Тот же dav1d, который я упоминал выше, с опцией -fwhole-shared (последний пробовал совместно с опциями -fPIC и -fPIE) мне собрать не удалось.
Скриншот 18. Попытка компиляции dav1d с опцией -fwhole.
Я также пробовал и обычную опцию -fwhole, но сборщик meson не определил эту опцию как поддерживаемую и просто проигнорировал её.
В общем, если не адаптировать код самой программы под Эльбрус, остаётся лишь танцами с бубном перебирать те опции, которые ей подойдут.
Но что касательно других языков? Например, Java? Я посмотрел запись конференции Elbrus Partner Day 13.12.2021, и обратил внимание на тесты Эльбруса представителями Сбера. Они тестировали сервер с 4 процессорами Эльбрус-8С как-раз Java-приложении. И я узнал, что при помощи подбора опций в процессе тестирования удалось повысить производительность на Java коде аж на 30%, так что вопрос подбора опций актуален не только для C.
Если вам интересно прочитать, как оптимизировали Java на Эльбрусе, советую ознакомиться со статьёй 2016-го года от Романа Артемьева.
Прежде, чем завершить эту главу, будет интересно посмотреть на то, что именно отвечает за загрузку ОС. Взглянем на Программу Начального Старта (ПНС), аналог BIOS на Эльбрусе.