Содержание

2.3. SSE инструкции в трансляции на Эльбрус 8С.

У x86 процессоров используются расширения SSE и AVX для того, чтобы они могли за раз обрабатывать как можно больше данных. Для SSE выделяются регистры объёмом 128 бит, а для AVX – объёмом 256 бит.

Если вспомните наш обзор Apple Macbook Pro на базе Apple M1, там я предполагал, что одним из камней преткновения, не позволяющих Apple транслировать AVX инструкции в аналогичные ARM инструкции (SVE), является именно размер регистров, используемых для хранения данных. Если SSE у x86 и SVE у ARM использовали регистры ёмкостью 128 бит, то AVX уже требовались регистры ёмкостью 256 бит, которых у M1 не было.

Ограничения Rosetta 2. Что нельзя транслировать на Mac с Apple M1.

Скриншот 29. Ограничения Rosetta 2. Что нельзя транслировать на Mac с Apple M1.

Тогда я решил, что раз для AVX нужны регистры на 256 бит, а у Apple M1 регистры есть объёмом не более 128 бит, трансляцию AVX инструкций чисто технически не получится реализовать никак. Архитектура набора команд ARM не предусматривала инструкций для использования регистров размером более 128 бит, потому и не было смысла для Apple интегрировать в процессор регистры объёмом 256 бит и более. Сами подумайте, зачем их туда ставить, если задействовать их нельзя будет? Так и вышло, что M1 не смог в работу кода, требующего 256 бит регистры, не стало так и трансляции AVX.

Но, оказывается, что не могут Apple, то могут МЦСТ: они просто задействовали 2 регистра вместо одного для трансляции SSE на процессоре, который даже 128 бит регистров не имеет.

Ограничения RTC.

Скриншот 30. Ограничения RTC. Источник: МЦСТ.

Откройте сайт МЦСТ и прочитайте, что пишут в ограничениях RTC. У МЦСТ, словно, вообще никаких ограничителей нет. Мол, если понадобится, реализуют поддержку и AVX инструкций. Медленно, но будет работать.

Возможности RTC.

Скриншот 31. Возможности RTC. Информация с сайта МЦСТ.

Ранее я писал, что компилятор LCC может скомпилировать программу с SSE-интринсиками для Intel. Но, как видите, и в трансляции Эльбрус может запускать программы с SSE кодом. Так может даже Эльбрус 8С без 128 бит регистров для SSE: он разбивает данные на 2 регистра по 64 бит, и бинго.

Просто с ума можно сойти. Тут большой вопрос в том, могли это сделать Apple или нет. Может, они решили, что лучше полностью отказаться от AVX инструкций на Mac с чипами Apple Silicon, чем при работе в трансляции задействовать в 2 раза меньше регистров. Просадка по производительности при этом действительно большая, и лучше уж использовать код, задействующий родные регистры, чем пытаться делать комбайн из этих регистров для выполнения каких-то жирных инструкций. Это же Apple, они могли рассмотреть такую возможность и решить «нет, лучше пусть меньше программ поддерживается, но эти самые программы работают быстрее». Можно долго спорить на тему того, почему у Apple этого нет, почему они не дробят регистры при трансляции, чтобы больше ПО поддерживалось в этой самой трансляции, но факт в том, что у МЦСТ это есть, МЦСТ это могут уже сегодня. И это прекрасно.

После выхода видео на канале у Стаса и после релиза статьи на сайте, я прочитал комментарии под видео и подметил, что у многих людей возникли вопросы в этом моменте. Мол, почему мы ранее говорили, что с AVX интринсиками всё замечательно, а в разделе с трансляцией кода есть нюанс: SSE транслируется, а AVX пока что - нет.

Тут вот в чём дело, код на C с использованием AVX инструкций, написанных под обычные Intel x86 процессоры, можно скомпилировать под Эльбрус. Компилятор Эльбруса, LCC, найдёт МЦСТ-шные аналоги для применяемых вами инструкций и подставит их вместо оригинальных Intel-овских, которые вы использовали. То же касается и SSE. Но вот, когда вы не собираете программу из исходного кода, а транслируете уже готовую, уже собранную под x86, транслируются SSE инструкции, но не AVX. Т.е., усвоили: собрать программу можно и с SSE интринсиками, и с AVX интринсиками даже на тех процессорах, которые 128 бит регистров не имеют (не говоря про 256 бит, которые для AVX нужны), а в трансляции пашут программы с поддержкой SSE, но без поддержки AVX.

Можно реализовать и трансляцию AVX инструкций в трансляции, МЦСТ вполне бы с этим справились, как уже сделали это в случае с SSE инструкциями на 8С, но неясно, насколько сильно просядет производительность, если выделить под инструкции (AVX) сразу 4 регистра вместо одного, т.е. банально урезать число регистров в 4 раза. МЦСТ вполне могли бы счесть такое решение не оптимальным. Но технически у них имеется возможность такое реализовать, и они уже делают это с 8С и SSE инструкциями, за что им похвала.

С поддержкой ПО на Эльбрусе проблемы отнюдь не того масштаба, каких можно было бы ожидать без подобного внимания от разработчиков компилятора LCC, а также трансляторов RTC и Lintel. И за это им огромное спасибо.