Содержание

4.4. Какое ПО на C/C++ круто оптимизировано под Эльбрус?

После предыдущих тестов встаёт вопрос: а кто и как умудряется из Эльбруса выжимать высокий уровень производительности? Какой тест будет хорошо оптимизирован и под Intel, и под Эльбрус? В чём их сравнить?

Результаты тестов процессоров Эльбрус в Minerd (CPU miner).

Скриншот 107. Результаты тестов процессоров Эльбрус в Minerd (CPU miner).

Здесь я сошлюсь на статью на habr с тестами инженерного образца Эльбрус-16С (того самого, который и я тестировал) от своего доброго комрада, EntityFX. Я доверяю тем данным, которые он приводит, а также тем данным, которые приводят Дмитрий и Рамиль с YouTube-канала Elbrus PC Test, и ge0gr4f и многие другие люди в чате «Эльбрусы и с чем их едят», и тем данным, что вы можете найти в Telegram-канале «Процессоры Эльбрус | Фан-клуб», т.к., у меня расхождений с их тестами не было и я вижу, что никто из них не пытается вас обмануть, дабы выставить Эльбрус в лучшем или худшем свете. Те же результаты, что они демонстрируют, получите и вы с аналогичным оборудованием. Их тестам я доверяю (не спроста, повторюсь, я за ними повторял ряд тестов и получал те же результаты), поэтому, чем переизобретать велосипед, перепроводя за ними все тесты, я просто воспользуюсь их результатами и сошлюсь на них.

Одним из тестов, что проводил EntityFX, был тест в майнинге на CPU при помощи cpuminer, бенчмарка с открытым исходным кодом. И возникает интересный вопрос, глядя на результаты: а что значит «оптимизирован»? Почему на 8С не оптимизирован, а на 8СВ и 16С он оптимизирован?

Код файла scrypt-e2k.c с E2K интринсиками (e2kintrin.h).

Скриншот 108. Код файла scrypt-e2k.c с E2K интринсиками (e2kintrin.h).

Как оказалось, на GitHub есть репозиторий, содержащий переписанный исходный код под Эльбрус 8СВ (E2Kv5) с использованием E2K интринсиков и Ассемблера. Т.е. тут полноценная оптимизация под Эльбрус, даже не Intel интринсики, которые тоже дают прирост по части производительности. Выражаю благодарность Дмитрию Щербакову за столь блестящую работу. Также спасибо ему за вклад в Вики Альт Линукса в разделе «портирование».

Языки программирования, используемые в оригинальном проекте cpuminer.

Скриншот 109. Языки программирования, используемые в оригинальном проекте cpuminer.

Содержимое файла scrypt-x64.S в оригинальном репозитории.

Скриншот 110. Содержимое файла scrypt-x64.S в оригинальном репозитории.

Возможно, кто-то из вас решит, что мы сейчас будем сравнивать базовый код на C без оптимизаций под x86 с хорошо оптимизированным кодом под E2K с его интринсиками. Это не так, мы сравнение будем проводить одной и той же утилиты с её оптимизациями под Intel (x86) и с оптимизациями под Эльбрус (E2K). В самом проекте cpuminer используется много кода на Ассемблере (59%, если верить GitHub), да и в составе файла scrypt-x64.S мы также видим, что для x86-64 платформы используются AVX инструкции по возможности. Так что у нас вполне себе релевантное сравнение получается в этот раз: x86-64 с AVX инструкциями против Эльбруса с его интринсиками, задействующими SIMD 128 бит. Всего одна проблема: у 8С (E2Kv4) нет SIMD инструкций 128 бит, под которые проводилась оптимизация. Они появились лишь начиная с 8СВ (E2Kv5).

Я взглянул на результат 8СВ в этом тесте и ахренел от того, что он в 7.07 раза выше, чем у 8С, под который софт не оптимизирован столь хорошо. 8СВ я ранее не сравнивал с моим ноутбуком Xiaomi, но вот инженерный образец 16С мы сравнивали с Xiaomi, и он во всех тестах был немного медленнее: в ffmpeg он отставал на 32%, в Blender – на 30% (проводил тест в трансляции с RTC 4.1), в dav1d разница на C составила 27% в среднем в пользу Xiaomi. Хотя, при трансляции версии из C кода разница была уже меньше, около 12%, а в трансляции версии на Ассемблере под x86 разница была 55% в среднем в пользу Xiaomi (ну, понятно, это же его Ассемблер).

Интересно глянуть на то, что же будет, если софт одинаково хорошо оптимизирован и под Эльбрус 16С, и под мой ноутбук Xiaomi с i7 8550U.

Как будем проводить тест на Linux с x86?

Вот этой командой загружаем себе исходный код cpuminer из репозитория и производим компиляцию программы из исходников:

                            git clone --recursive https://github.com/pooler/cpuminer; cd cpuminer; ./autogen.sh; ./configure CFLAGS="-O3"; make -j$(nproc);
                        

После сборки готовой программы, мы можем прогнать сами тесты. Тестов тут 2: один с алгоритмом sha256d, а другой – с алгоритмом scrypt. Нам будут интересны результаты в обоих тестах, так что мы прогоним их поочерёдно.

Команда для теста с алгоритмом sha256d:

./minerd --benchmark -a sha256d

Команда для теста с алгоритмом scrypt:

./minerd --benchmark -a scrypt

Да, всё настолько просто. 2 команды и получаем результаты по 2 тестам с двумя разными алгоритмами. Просто собирайте эту программу командой выше, вбивайте одну из этих команд и смотрите за скоростью при обработке процессором данных по этим самым алгоритмам.

Тест minerd (sha256d) на Xiaomi Mi Notebook Pro GTX.

Скриншот 111. Тест minerd (sha256d) на Xiaomi Mi Notebook Pro GTX.

Тест minerd (sha256d) на Xiaomi Mi Notebook Pro GTX (i7 8550U, Ubuntu 20.04.3).

Скриншот 112. Тест minerd (sha256d) на Xiaomi Mi Notebook Pro GTX (i7 8550U, Ubuntu 20.04.3).

Я запустил эти тесты и прождал несколько минут, пока у меня частота процессора не придёт в норму после резкого всплеска из-за Intel TurboBoost. Затем я заскринил результаты. В общем-то, глядя на них, я ахренел. Нет, не от результатов своего ноутбука с i7 8550U на 25 Ватт (у которого я снизил TDP до 20 Ватт с андервольтингом на 100 мВ и получил те же частоты). У моего ноутбука результаты в многопотоке 1 в 1 такие же, как у десктопного Core i5 6500 из статьи EntityFX. Что меня удивило, так это разница с 16С.

Выше вы видите 2 скриншота: один с алгоритмом sha256d, а другой – с алгоритмом scrypt. В Терминале вы видите результаты по каждому потоку отдельно, и результат по всем потокам (Total). Для сравнения с Эльбрусом мы воспользуемся результатами потока 0 (1-ый) и всех потоков (Total).

Тест minerd с оптимизациями под x86 и E2K на инженерном образце Эльбрус 16С и на i7 8550U.

Гистограмма 104. Тест minerd с оптимизациями под x86 и E2K на инженерном образце Эльбрус 16С и на i7 8550U.

Тест minerd с оптимизациями под x86 и E2K на инженерном образце Эльбрус 16С и на i7 8550U.

Гистограмма 105. Тест minerd с оптимизациями под x86 и E2K на инженерном образце Эльбрус 16С и на i7 8550U.

И, шок. При хорошей оптимизации и под x86 с использованием AVX инструкций, и под E2Kv5 с его SIMD 128 бит инструкциями (доступны, начиная с E2Kv5, т.е. с 8СВ), получается, что Эльбрус то быстрее даже в расчёте на один поток. Вы имейте в виду, что у Эльбруса 16С на постоянке частота 2 ГГц, а у моего ноутбука – 3 ГГц при TDP 25 Ватт (а также при 20 Ватт с андервольтингом в -100 мВ), но, сами видите, не мой ноутбук быстрее в 1.5 раза в однопотоке (что было бы сопоставимо с разницей по частоте), а, наоборот, инженерный образец Эльбрус 16С в однопотоке быстрее на 54%. Производительность на такт (т.е. при одинаковой частоте) у Эльбруса 16С выходит в 2.31 раза выше. Это просто сумасшествие.

В многопотоке инженерный образец Эльбрус 16С быстрее моего Xiaomi аж в 3 раза, что нормально, т.к. и потоков у него в 2 раза больше.

Вообще, если задуматься, а какой процессор по производительности ближе всех к Эльбрусу 16С?

Среди тех процессоров, что показал в сравнительном тесте EntityFX в своей статье, только Core i7 9700K обошёл Эльбрус 16С. У него 211.68 hkash/s в многопотоке, тогда как у Эльбруса 16С – 181.01 khash/s. Это значит, что довольно не дешёвый процессор от Intel обогнал Эльбрус 16С всего на 17%. Не в разы, не в десятки раз, а на 17%. И, заметьте, это ещё инженерник с частично отключенным кэшем, с пониженной частотой оперативной памяти, с системой, собранной под предыдущее поколение Эльбруса и с рядом других нюансов. И всё равно Эльбрус 16С на его фоне не меркнет. К релизу 16С вполне может статься так, что он значительно обгонит i7 9700K.

Тест minerd с оптимизациями под x86 и E2K на инженерном образце Эльбрус 16С и на i7 8550U.

Гистограмма 106. Тест minerd с оптимизациями под x86 и E2K на инженерном образце Эльбрус 16С и на i7 8550U.

Тест minerd с оптимизациями под x86 и E2K на инженерном образце Эльбрус 16С и на i7 8550U.

Гистограмма 107. Тест minerd с оптимизациями под x86 и E2K на инженерном образце Эльбрус 16С и на i7 8550U.

Далее посмотрим на результаты в тесте scrypt. Ну, тут разница уже меньше: 18% в расчёте на 1 поток. В многопотоке разница 2.33 раза в пользу инженерного образца Эльбрус 16С.

Короче, если в предыдущих тестах в многопотоке Эльбрус 16С отставал, т.к. эти тесты не были хорошо вылизаны под 16С, то теперь, когда код хорошо вылизан и под Intel, и под E2K, мы видим, что инженерный образец Эльбрус 16С не только не отстаёт от i7 8550U на те 30%, что мы наблюдали ранее, но и опережает его на 130% в тесте с алгоритмом scrypt и на 207% в тесте с алгоритмом sha256d.

О чём это говорит? Да о том, что Эльбрус более критичен к оптимизации, нежели другие процессоры. Он вырывается просто из грязи в князи, если на нём оптимизировать должным образом софт. При должной оптимизации ПО под него он уже сейчас является прямым конкурентом топовых потребительских решений от Intel 9-го и 10-го поколений. А это ещё только цветочки, ещё только инженерный образец с рядом своих нюансов.

Мой вывод: Эльбрус – словно Lamborghini с ручной коробкой передач. Если им будет управлять крутой специалист, он будет не хуже конкурентов.

Я, как и ранее, утверждаю, что компилятор – это не волшебная палочка, по взмаху которой любой ваш не оптимизированный код будет летать на Эльбрусе. Нужно софт оптимизировать под Эльбрус и тогда он будет реально крут, просто пушка, лялечка, конфеточка, топовый спорткар.