- PVSM.RU - https://www.pvsm.ru -

Сравнение эффективности компиляторов под Эльбрус на примере решета Эратосфена

На Хабре уже тестирование Эльбрусов на разных языках программирования (например, здесь [1]). И данный обзор стоит рассматривать как дополнение, с ещё одним тестом, новыми версиями компиляторов и новыми участниками (Rust, С++). Так же обзор сделан с упором на тест возможностей именно компиляторов и настройки оптимизации.

Тестовые стенды:

x86:

  • AMD FX-6300@3500 Мгц. (турбобуст отключен).

  • Intel Celeron (Haswell) G1820@2700 Мгц.

Софт:

Ubuntu 22.04.

Java: OpenJDK Runtime Environment (build 11.0.25+9-post-Ubuntu-1ubuntu122.04).

Rust: rustc / cargo v.1.83.0; LLVM version: 19.1.1.

C++: GCC v11.4.0; LLVM version 19.1.5.

e2k:

  • Эльбрус 8С@1200 Мгц.

Софт:

Java: OpenJDK Runtime Environment (build 11.0.15-Unipro+0-adhoc.root.openjdk11-11.0.15).

Rust: rustc / cargo v.1.57.0.

C++: GCC v9.3.0 compatible; LLVM version 13.0.1.

Испытуемые: Java, Rust, C++(GCC, LLC).

Тест.

В качестве теста выступает решето Эратосфена в блочном варианте. Один поток. На трёх языках реализовано максимально идентично. Программа в консольном варианте. Есть возможность повторного расчёта.

Методика тестирования.

Выполняем два запуска по пять прогонов поиска простых чисел в диапазоне 0 - 5*108. Первый прогон разогревочный и в расчёт не идёт. Для Java прогревочный проход обязателен. И, как показала практика, на C++ и Rust первый прогон тоже чуть медленнее. По оставшимся результатам двух прогонов вычисляется средний показатель.

Результаты тестов.

В сравнении gcc и llc, gcc оказался чуть эффективнее, но разница очень маленькая, меньше 1%. Поэтому ниже в тестах будут фигурировать значения llc с обозначением gcc/llc. Значения указаны в миллисекундах.

Некоторые неожиданности.

Ожидалось, что исполняемые файлы, полученные на одной x86-машине должны работать на другой x86-машине. Но файлы, скомпилированные GCC/LLC на AMD FX с настройкой оптимизации выше чем O0, на Intel Celeron (Haswell) выпадали с ошибкой: "Недопустимая инструкция (образ памяти сброшен на диск)". Однако с Rust таких проблем не наблюдалось. И так же всё, что скомпилировано на Intel, работало на AMD FX. При этом, независимо от того, на какой машине был получен исполняемый файл, результаты тестов совпадали.

gcc
O0

gcc/llc O2

gcc/llc O3

gcc/llc O4

Rust
O2

Rust
O3

Java

Elbrus 8C @ 1.2Ghz

45712

4694

3912

3830

4941

5033

19357

AMD FX @ 3.5Ghz

7743

2373

2208

2205

1818

1918

4635

Cel G1820 @ 2.7Ghz

7508

1648

1523

1543

1183

1213

5123

Жирным выделены результаты самых удачных настроек компиляции для каждой машины.

Сразу бросается в глаза разница между gcc O0 и gcc/llc O2 на Эльбрусе. Такова плата за запуск неоптимизированных программ на e2k.

Сравнение эффективности компиляторов под Эльбрус на примере решета Эратосфена - 1

В отличие от x86, для Эльбруса оптимизация O4 даёт профит.

Сравнение эффективности компиляторов под Эльбрус на примере решета Эратосфена - 2

А вот для Rust везде лучший результат показала оптимизация O2.

И так, лучшие настройки оптимизации для данного теста на платформах:

  • x86: Rust - O2, C++ - O3.

  • e2k: Rust - O2, C++ - O4.

Сравнение эффективности компиляторов под Эльбрус на примере решета Эратосфена - 3
Сравнение эффективности компиляторов под Эльбрус на примере решета Эратосфена - 4

P.S.

Не являюсь специалистом по Rust и C++. Код достаточно простой и там вряд ли будут серьёзные недочёты. Но мог недоработать в плане настроек компиляции.
Благодарю компанию МЦСТ за возможность ознакомления с ЦП семейства Эльбрус!

Ресурсы:

Исходник Java [2], исходник Rust [3], исходник C++ [4]

Автор: VVS_AMD

Источник [5]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/kompilyatory-2/405010

Ссылки в тексте:

[1] здесь: https://habr.com/ru/companies/icl_group/articles/648219/

[2] Исходник Java: https://gitlab.com/vvsamd/the-sieve-of-eratosthenes-in-java

[3] исходник Rust: https://gitlab.com/vvsamd/the-sieve-of-eratosthenes-in-rust

[4] исходник C++: https://gitlab.com/vvsamd/the-sieve-of-eratosthenes-in-c/edit#js-general-project-settings

[5] Источник: https://habr.com/ru/articles/866460/?utm_campaign=866460&utm_source=habrahabr&utm_medium=rss