Страницы

понедельник, 26 сентября 2022 г.

Накладные расходы проверок на RISC-V, ARM, Эльбрус, AMD64

Получил в использование одноплатный компьютер StarFive VisionFive c 2-ядерным процессором на архитектуре RISC-V. На поставляемом с платой дистрибутиве Fedora провёл тестирование транслятора Восток и, в частности, проверку времени исполнения сгенерированного кода с проверками корректности и без.

Замечу, что с пользовательской точки зрения, плата с поставляемым дистрибутивом Fedora, крайне неудобоварима - нестабильна и неповоротлива. Удобней использовать в качестве небольшого сервера.

Были протестированы проверки, генерируемые транслятором Восток, и генерируемые компилятором gcc при выключенной генерации проверок из Oberon в C. На RISC-V доступны только те, что включаются -fsanitize=undefined. В проверки на уровне Oberon входят проверки индекса массива, переполнения диапазонов, инициализированности переменных, обращения по NIL и пользовательских утверждений. Компиляция из C была проведена без профилирования из-за недоступности. В качестве модельного кода служит сам транслятор.

RISC-V SiFive U74 RV64GC 1 GHz, Fedora, gcc
Размер, байт отношениеВремя, секундотношение
Без проверок 299 624 1 4,82 1
Проверки Oberon 320 160 1,35 5,33 1,11
san. undefined 512 584 1,71 6,47 1,34

Стоит отметить низкие относительные накладные расходы на проверки. Эта особенность представляет большой интерес, потому что RISC-V, например, не использует флаги для выявления целочисленного переполнения в пользу явных проверок Тем не менее, совокупно в проверках он не только не отстаёт, но даже опережает другие архитектуры, что для многих, не знакомых с задумкой, является контринтуитивным.

Доступный для этой же платы серверный образ Ubuntu позволяет задействовать профилировщик и проверить больше вариантов запуска, но даже самый эффективный из них значительно уступает тому варианту без профилирования, что есть на дистрибутиве от разработчика платы.

RISC-V SiFive U74 RV64GC 1 GHz, Ubuntu
Размер, байт отношениеВремя, секундотношение
gcc, Без проверок 297 168 1 5,53 1
gcc, Проверки Oberon 313 560 1,06 6,27 1,13
gcc, san. undefined 481 472 1,62 7,31 1,32
gcc, san. address 2 111 504 7,11 11,49 2,08
gcc, san. u. + a. 2 344 968 7,89 16,81 3,04
clang, Без проверок 261 000 0,88 6,39 1,16
clang, Проверки Oberon 298 064 1,003 7,66 1,39
clang, san. undefined 269 192 0,91 7,11 1,29
Java 374,4 67,7

Заодно провёл тестирование на ряде других доступных мне архитектурах, начиная с Raspberry Pi 400 c 4-ядерным процессором. Для компиляции через С было включено профилирование.

ARM Cortex-A72 1.8 GHz
Размер, байтотношениеВремя, секундотношение
C, Без проверок 354 216 1 1,83 1
C, Проверки Oberon386 992 1,09 2,06 1,13
C, san. undefined 657 320 1,86 2,27 1,24
C, san. address 2 275 480 6,42 6,07 3,32
C, san. u.+a. 2 541 624 7,18 6,58 3,60
Java 24,56 13,42
JavaScript 81,76 44,68

Тестирование на 8-ядерном Эльбрусе без профилирования

E8C 1.2 GHz
Размер, байтотношениеВремя, секундотношение
lcc, Без проверок 908 168 1 2,55 1
lcc, Проверки Oberon 1 522 728 1,68 4,16 1,63
lcc, san. address 7 654 808 8,43 8,56 3,36
clang, Без проверок 2 527 576 2,78 2,29 0,9
clang, Проверки Oberon 2 327 024 2,56 2,96 1,16
Java 47,9 13,8
JS со всеми проверками 1054,2 303,8
JS без границ массивов 863,9 248,96
JS и без арифметики 789,2 227,44

Бросается в глаза большой размер исполняемых файлов, особенно для clang, но что ещё интересней для этого компилятора, так это аномальное уменьшение размера при добавлении проверок Oberon. Жаль, что этот трюк не удался с временем исполнения. Проверки Оберона оказались самыми дорогими среди всех остальных платформ — в лучшем случае +30% ко времени. Если взглянуть на код сложения с контролем переполнения, то становится приблизительно понятно почему, хотя это и не повод для далекоидущих выводов.

(Editor+%231)',t:'0')),k:58.1542699724518,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4

Для исполнения через Java нет какого-либо провала по сравнению с другими архитектурами, что для широкого командного слова достижимо не так-то и просто. А вот по времени работы через JavaScript в node можно предположить, что этот скриптовый язык выполняется через пошаговую интерпретацию, что обусловило существенную разницу между кодом с проверками и без. Для других архитектур разница невелика, поэтому и не приводилась в таблице. В отличии от node у движка JavaScript в Firefox хорошая производительность, но benchmark не рассчитан на работу в браузере.

В режиме 128-битных указателей, при которых Эльбрус предоставляет дополнительную аппаратную защиту от повреждения буферов и использования неинициализированных переменных, полноценно запустить benchmark не удалось, потому что длинные вычисления обрываютcя прерыванием. Просто собранный транслятор работает как положено, поэтому можно сравнить его время работы в 128-битном режиме с отключёнными пересекающимися проверками от Oberon и в 64-битном режиме с включёнными.

E8C 1.2 GHz
Время, сек.
128 bit0,86
64 bit 0,55

Тестирование на обычном ПК с включённым профилированием. Добавлены замеры при компиляции через простой неоптимизирующий Tiny C Compiler.

Intel Core i3-4160 3.6 GHz
Размер, байт отношениеВремя, секундотношение
gcc, Без проверок 379 096 1 0,44 1
gcc, Проверки Oberon 424 160 1,12 0,52 1,18
gcc, san. undefined 637 144 1,68 0,57 1,30
gcc, san. address 2 386 032 6,29 0,77 1,75
gcc, san. u.+a. 2 684 912 7,08 0,95 2,16
clang, Без проверок 489 776 1,29 0,45 1,02
clang, Проверки Oberon387 360 1,02 0,51 1,16
clang, san. undefined567 576 1,5 0,53 1,20
clang, san. address 2 475 544 6,53 0,81 1,84
clang, san. u.+a. 2 487 896 6,56 0,92 2,09
tcc, Без проверок 472 056 1,25 1,07 2,43
tcc, Проверки Oberon 607 984 1,6 3,84 8,73
Java 4,50 10,23
JavaScript 15,36 34,91

Тестирование на смартфоне Samsung Galaxy S20 FE из Termux через clang. Профилирование было выключено, потому что эффективность кода после него оказалась в 2-а раза ниже непрофилированного.

AArch64 2.73 GHz Mongoose M5
Размер, байт отношениеВремя, секундотношение
Без проверок 401 280 1 0,63 1
Проверки Oberon 379 640 0,95 0,69 1,10
san. undefined 454 480 1,13 0,69 1,10
san. address 1 115 240 2,78 1,21 1,92
san. u.+a. 986 840 2,46 1,29 2,05
Java 8,47 13,44
JavaScript 23,44 37,21

Помимо проваленного профилирования, clang продолжил чехарду с размером исполняемого файла. Производительность кода в разы выше чем на Pi, и даже забавно, что смартфон всего лишь на треть отстал от ПК. Смартфоны уже давно технически готовы к работе в качестве легковесных ПК, но не используются так из-за отстутствия соответствующей воли. Тот же режим DEX, доступный на премиальных Samsung — это лишь бедный родственник основной потребительской системы.


Заключение

  • Компиляторные проверки C доступны не везде, не всегда, и задействовать их бывает непросто. С проверками от Oberon не возникло никаких проблем и не потребовало правок.
  • Проверки на уровне Oberon оказываются во всех смыслах дешевле проверок уровня C на всех протестированных платформах, несмотря на то, что проверки C составляются на уровне компилятора и покрывают меньше случаев, чем проверки корректности Oberon, существущие на правах обычного кода. Эффективность достижима благодаря:
    • Особенностям Оберона, более располагающим к возможностям проверок.
    • Cпецифическим решениям транслятора Восток.
    • Высокооптимизирующим компиляторам С, позволяющим генерировать эффективный код проверок, не имея специальных знаний о них.
  • Аппаратные проверки тоже имеют свою цену, и на Эльбрусе, единственной платформе, на которой они доступны, аппаратные проверки обходятся даже дороже программных, которые на нём и так оказались самыми дорогими в сравнении с другими платформами.
  • Проверки имеют вполне приемлемую цену для того, чтобы во многих случаях их никогда не отключать даже при компиляции исходного кода на C, не говоря уже про Oberon.

Комментариев нет:

Отправить комментарий

Обработка ошибок

Тема корректной обработки ошибок в программе является довольно сложным вопросом в программировании. Отчасти от того, что и она сама являет...