[Из песочницы] Большое тестирование процессоров различных архитектур

Предисловие

Попытка сравнить производительность процессоров на разнородных архитектурах x86–64, e2k (Эльбрус), mips и arm.

Все тесты написаны на языке C (взяты из исходных кодов, которые я не модифицировал и не оптимизировал) и компилируются под конкретную архитектуру с использованием конкретного компилятора для данной архитектуры и тесты производятся на различных дистрибутивах операционных систем на ядре Linux. На результаты может влиять как тип так и версия компилятора, а также режим оптимизаций. Хотя даже таким способом можно примерно сравнить производительность процессоров на разных архитектурах.

P.S.: Знаю, что большинство тестов для очень старых компьютеров, но они работают везде. Что даже очень неплохо.


Типы архитектур сравниваемых процессоров


CISC

CISC (Complex instruction set computing) — архитектура, в которой небольшой набор регистров, команды различной длинны, операции кодируются одной командой.


RISC

RISC (Reduced instruction set computing) — процессорная архитектура, в которой инструкции упрощены и имеют фиксированную длину (например, 32 бита), что позволяет повысить производительность. Имеет большое число регистров.


VLIW

VLIW (very long instruction word) — архитектура процессоров с очень большой инструкцией. Одна инструкция содержит в себе много простых инструкций, которые могут исполняться разными блоками процессора. Всё это сильно упрощает архитектуру, но усложняет компилятор. Неэффективный код может порождать не полностью заполненные инструкции, что сильно снижает производительность программы.


Описание архитектур сравниваемых процессоров


x86–64 (ia32/x86/i386/amd64/EM64T/Intel/AMD)

x86 — CISC архитектура, созданная компанией Intel, о которой знают все. Современный вариант архитектуры пошёл со времён 32-битного процессора Intel 386. Крупные игроки: Intel, AMD и VIA (а ещё тут появился какой-то Zhaoxin).


ARM

ARM — RISC архитектура разрабатываемая компанией ARM Limited с середины 80х годов. Текущие версии 32-битных ARM ядер: armv6 (ARM1136J (F)-S), armv7 (Cortex A9, Cortex A15), armv8 (CortexA53, CortexA57, Cortex A72 и выше). Процессоры данной архитектуры широко используются в мобильных телефонах, планшетах, встраиваемых устройствах, одноплатных компьютерах. Процессоры энергоэффективные и достаточно производительные.


MIPS

MIPS — RISC система команд и микропроцессорных архитектур, разработанных компанией MIPS Computer Systems. Процессоры данной архитектуры как и ARM используются в мобильных телефонах, планшетах, встраиваемых устройствах и т.д. Но почему-то больших объёмов устройств по сравнению с ARM она не достигла. Но процессоры на архитеткуре MIPS часто можно встретить в роутерах, ну и в медиа проигрывателях, а ещё она использовалась в процессоре приставки Play Station 1. Текущие реализации: 32-битная MIPS32 и 64-битная MIPS64.


E2K (Elbrus 2000/Эльбрус)

VLIW


Список тестов


Dhrystone


Dhrystone — синтетический тест, который был написан Reinhold P. Weicker в 1984 году.
Данный тест не использует операции с плавающей запятой, а версия 2.1 написана так, чтобы исключить возможность сильных оптимизаций при компиляции.
Бенчмарк выдаёт результаты в VAX Dhrystones в секунду, где 1 VAX DMIPS = Dhrystones в секунду делить на 1757.


Whetstone


Whetstone — синтетический тест, который был написан Harold Curnow в 1972 году на языке Fortran.
Позже был переписан на языке C Roy Longbottom. Данный тест выдаёт результаты в MWIPS,
также промежуточные результаты в MOPS (Миллионов операций в секунду) и MFLOPS (Миллионы вещественных операций с плавающей запятой в секунду).
Данный тест производит различне подсчёты: производительность целочисленных и операций с плавающей запятой,
производительность операций с массивами, с условным оператором, производительность тригонометрических функций и функций возведения в степень, логарифмов и извлечения корня.

Также мной был написан тест Whetstone на языках JS (Для тестирования браузера и NodeJS) и C# (Для тестирования Mono, .Net Framework и Dotnet Core), а также я нашёл реализацию на Java.


Whetstone MP — многопоточный вариант Whetstone.


LINPACK


LINPACK — тест, который был написан Jack Dongarra на языке Fortran в 70х годах, позже переписан на язык C.
Тест считает системы линейных уравнений, делает различные операции над двумерными (матрицами) и одномерными (векторами).
Используется реализация Linpack 100×100 с числами типа float. Реализация теста хорошо используется для оценки производительности
различных суперкомпьютеров.


Набор тестов написанных на языке C. Создан в 2009 году Shay Gal-On из компании EEMBC
Содержит реализации таких алгоритмов: обработка связных списков (поиск и сортировка), обработка матриц (несколько матричных операций), машина состояний (определение, что входной символьный поток содержит действительные числа в десятичной записи), подсчет суммы CRC.


Memspeed


Memspeed — выполняет 3 различные операции, над 64-битными числами с плавающей запятой двойной точности, 32-битными с плавающей запятой одинарной точности and 32-битными целыми над 2 мя массивами:
  • Сумма с регистром r = r + x [m] * y[m] (Integer + y [m])
  • Сумма в память x[m] = x[m] + y[m]
  • Память в память x[m] = y[m]


Livermore Loops


тест для суперкомпьютеров, появился в 1970, изначально содержал 14 тестов на языке Fortran. Далее тестов было увеличено до 24 в 1980'е. Производительность измеряется в Миллионах Операций Чисел с Плавающей Точкой в Секунду или MFLOPS.
тест проверяет точно вычислений в конце. Основная цель — избежать простых операций над числами, 24 теста выполняются 3 раза в цикле Do-loop и вычисляют производительность на короткими, средними и большими последовательностями чисел.


MP MFLOPS


MP MFLOPS — многопоточный тест, который считает большое число операций над большими массивами.
Выполняет операцию вида x[i] = (x[i] + a) * b - (x[i] + c) * d + (x[i] + e) * f с 2, 8 или 32 на 1 инструкцию. Размер массива 0.1, 1 или 10 миллионов 4 байтовых слов с плавающей точкой с одинарной точностью.
Грузит ваш процессор по полной.


Scimark 2


SciMark 2 — набор тестов на языке C измеряющий производительность кода встречающегося в научных и профессиональных приложениях. Содержит в себе 5 вычислительных тестов: FFT (быстрое преобразование Фурье), Gauss-Seidel relaxation (Метод Гаусса — Зейделя для решения СЛАУ), Sparse matrix-multiply (Умножение разреженных матриц), Monte Carlo integration (Интегрирование методом Монте-Карло), и LU factorization (LU-разложение).


Тестовые стенды и их процессоры

Стенды на процессорах x86 (i386) х86–64 (amd64):

Стенды на процессорах armv6 (armel), armv7 (armhf), armv8 (aarch64):

Стенды на процессорах e2k (Elbrus 2000) (v3, v4, v5):

Стенды на процессорах MIPS:


Таблица с тестовыми стендами


Настройки компиляторов

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


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


Dhrystone

Таблица с результатами Dhrystone в 1 поток:

Dhrystone, все процессоры:
Dhrystone Benchmark, Version 2.1

Dhrystone, на 1 МГц:
Dhrystone Benchmark, Version 2.1, Per 1 MHz

Dhrystone, относительно Core i7–2600:
Dhrystone Benchmark, Version 2.1, Relative

Здесь видно, что в тесте Dhrystone процессоры x86 заметно быстрее arm и Эльбрус процессоров. Производительность 1 ядра Эльбрус 8С (E8C) сравнима с ядром Cortex A72, если сравнивать относительно Dhrystones на 1 МГц, Эльбрус 8С чуть быстрее Atom Z8350 относительно Dhrystones на 1 МГц. Производительность Baikal T1 сравнима с ядром Arm Cortex A9. Странно себя показал Эльбрус 8СВ, который с большой частотой оказался медленнее Эльбрус 8С. В МЦСТ мне ответили, что этот экземпляр тестовый и компилятор немного не доработан под данную версию, возможно с другим экземпляром тесты окажутся гораздо лучше.


Whetstone

Whetstone Single Precision, все процессоры
Whetstone Single Precision

Whetstone Single Precision, многопоточные результаты
MP Whetstone Precision Multi Core

Whetstone Single Precision, на 1 МГц
Whetstone Single Precision

Whetstone Single Precision, многопоточные результаты, на 1 МГц
MP Whetstone Precision Multi Core, Per 1 MHz

Whetstone Single Precision, относительно Core i7–2600
Whetstone Single Precision

Whetstone Single Precision, многопоточные результаты, относительно Core i7–2600
MP Whetstone Precision Multi Core Relative

Мы видим, что процессоры ARM v7 на архитектуре ядра Cortex A9 сопоставимы с процессорами Pentium III, если сравнивать частоту на 1 Мгц.
Далее, процессоры ARM v8 на архитектуре ядра Cortex A72 сравнимы с процессорами Core 2 Duo T9400 на 1 ядро и 1 МГц, но немного не дотягивают
до Atom Z8350. А ещё очень хорошо видно, что архитектура процессора Pentium 4 (NetBurst) была очень слабой и чтобы им быть более
менее производительными, нужно было иметь высокую частоту (Pentium III был более производительным на 1 МГц).
Все процессоры Эльбрус сопоставимы с Core 2 Duo T9400 на 1 ядро и относительно 1 МГц и ARM v7 Cortex A72, что уже лучше.


Whetstone: разные рантаймы и языки программирования


LINPACK 100×100 DP (однопоточный)

Существуют LINPACK 1000×1000, High Performance LINPACK, LINPACK 100×100.
Но был выбран LINPACK 100×100 DP, почему? Причина проста: данный тест легко собирается на разных архитектурах и время тестирования очень небольшое.

И тут сразу переходим к результатам тестирования:

LINPACK 100×100 Double Precision, все процессоры
Linpack 100x100 Double Precision

LINPACK 100×100 Double Precision, на 1 МГц
Linpack 100x100 Double Precision, Per 1 MHz

LINPACK 100×100 Double Precision, относительно Core i7–2600
Linpack 100x100 Double Precision, Relative to Core i7-2600

Cнова сравним Mflops’ы на 1 МГц на 1 ядро.

Ядра ARM v7 Cortex A9 (Odroid X2), ARM v8 Cortex A53 (Raspberry PI 3, Orange Pi Win, Orange Pi PC2) показывают слабый результат, даже слабее Pentium III, что даже кажется немного странным. Ядра ARM v8 Cortex A72 (Odroid N2, AWS Graviton [Alpine AL73400]) держатся почти на уровне Core 2 Duo T9400 и Atom Z8350 и это отлично.

Эльбрусы E2K (Все модели: E1C+, E4C, E8C1, E8C2) показывают одинаковый результат и сильно обгоняют ARM процессоры, даже ядра Cortex A72, но проигрывают в 1,5 — 2 раза современным процессорам Intel, хотя они обгоняют AMD A6–3650 и Core 2 Duo T9400. Эльбрусам не хватает высокой тактовой частоты, чтобы приблизиться к процессорам Intel.

Coremark, однопоточные результаты, все процессоры
Coremark

Coremark, многопоточные результаты, все процессоры
Coremark Multi Thread

Coremark, однопоточные результаты, на 1 МГц
Coremark, Per 1 MHz

Coremark, многопоточные результаты, на 1 МГц
Coremark Multi Thread, Per 1 MHz

Coremark, однопоточные результаты, относительно Core i7–2600
Coremark, Relative to Core i7-2600

Coremark, многопоточные результаты, относительно Core i7–2600
Coremark Multi Thread, Relative to Core i7-2600

В этом тесте ядра Эльбрус на 1 МГц оказываются немного слабее ядер ARM (Cortex A9, Cortex A53) и в 3 раза слабее современных ядер Intel (Core i7–2600),
ядра ARM (Cortex A9, Cortex A53) почти что на уровне Atom Z8350, Core 2 Duo T9400 и AMD A6–3650. Процессор Baikal T1 немного обгоняет Atom Z8350, Core 2 Duo T9400 и AMD A6–3650,
а в реальных частотах он на уровне Atom Z8350.


Memspeed (однопоточный)

(x[i] = x[i] + a * y[i])
(x[i] = x[i] + y[i])
(x[i] = y[i])

Memspeed, Умножение-сложение с присвоением, все процессоры
Memspeed Multiply Add Assign

Memspeed, Сложение с присвоением, все процессоры
Memspeed Add Assign

Memspeed, Присвоение, все процессоры
Memspeed Assign

Как мы знаем, на скорость работы с памятью играют частотат работы с памятью, размеры кеша и латентность.

Процессоры ARM (Cortex A9, Cortex A53) имеют медленную подсистему памяти, AWS Graviton обгоняет их в несколько раз (что и логично, так как это серверный процессор).
Процессоры Эльбрус немного отстают от современных процессоров Intel так как имеют намного меньшую тактовую частоту (в 3 раза). Также можно заметить что процессор Эльбрус 8СВ немного быстрее
процессора Эльбрус 8С за счёт того, что используется память DDR4–2400.


MP MFLOPS

Примеры операций, которые выполняет данный тест:

2 операции

x[i] = (x[i]+a)*b;

8 операций

x[i] = (x[i]+a)*b-(x[i]+c)*d+(x[i]+e)*f;

32 операции

x[i] = (x[i]+a)*b-(x[i]+c)*d+(x[i]+e)*f-(x[i]+g)*h+(x[i]+j)*k-(x[i]+l)*m+(x[i]+o)*p-(x[i]+q)*r+(x[i]+s)*t-(x[i]+u)*v+(x[i]+w)*y;

MP MFLOPS, все процессоры
MP MFLOPS

MP MFLOPS, все процессоры, 2 ops/w
MP MFLOPS, 2 ops/w

MP MFLOPS, все процессоры, 8 ops/w
MP MFLOPS, 8 ops/w

MP MFLOPS, все процессоры, 32 ops/w
MP MFLOPS, 32 ops/w

MP MFLOPS, все процессоры, относительно Core i7–2600
MP MFLOPS

Вот здесь процессоры Эльбрус показывают свою превосходство над всеми другими архитектурами: способность выполнять большое число операций за так (архитектура VLIW).
Процессор 8СВ набирает 378 ГФлопс (Теоретически 576) на 32х операциях. Core i7–2600 — 82.6 ГФлопс.
Процессоры на ARM выдают всего 23.7 ГФлопс (Для Cortex A72, Odroid N2), AWS Graviton — 117 ГФлопс, за счёт 16ти ядер.


Scimark 2 (однопоточный)

Scimark 2, однопоточные результаты, все процессоры
Scimark 2


Выводы

Performance, Relative to Core i7-2600

ARM процессоры уровня Cortex A9, Cortex A53 на уровне слабого Intel Atom, Pentium 4.
ARM процессоры уровня Cortex A72 уже приближаются к процессорам Intel Core.

Процессоры Эльбрус в основном быстрее процессоров ARM, но медленнее Intel Core из-за
маленькой тактовой частоты и могут работать намного быстрее, если программа под них хорошо оптимизированна, но в будущем надеемся, что компилятор lcc будет ещё лучше доработан.


P.S.

Спасибо команде из Телеграм чата: e2k_chat и людям с форума ixbt, которые помогли мне протестировать недостающие Эльбрусы.

Спасибо своим коллегам, которые предоставили мне некоторые одноплатные компьютеры на процессорах ARM.

Исходники и результаты

Не стесняйтесь, присылайте мне свои результаты.


Ссылки


  1. Исходники, результаты и диаграммы
  2. Сайт Роя Лонгботтома, отукда было взято большинство исходников и часть результатов
  3. Набор ссылок на бенчмарки Эльбрусов от Михаила Шигорина
  4. Independent Tests of Baikal-T1

© Habrahabr.ru