Twitter author Profile picture
Sep 27, 2018 39 tweets 6 min read Read on X
У меня даже родилась идея устроить классический «один лайк - один факт» про Эльбрус. Тред иди!
RT PLS для охвата
И вообще про то, как написать порт Hotspot на что-то экзотическое типо Эльбруса
1. Эльбрус - полностью российская VLIW - архитектура, есть книга в паблике mcst.ru/files/511cea/8…
2. Документация системы команд Эльбруса - 4 пдфки примерно по 100 страниц каждая, разумеется секретные
3. Для Эльбруса уже существуют JS движки (spidermonkey, v8), JVM Hotspot (zero, native), C# (Mono)
4. Развею слухи про LLVM, бэкенд существует, достаточно ограниченный и примитивный, но работающий. Например JIT в zero-порте Хотспота работает на нем. Называется Shark
5. Компилятор C/C++ для Эльбруса называется LLC, который НЕ gcc, НЕ clang и НЕ оригинальный LLC. Сторонний FE + собственный BE, наполненный тайной и черной магией
6. JVM для Эльбруса - 100% Джава. Доподлинно известно, что там работает майнкрафт и #IntellijIDEA
7. За время разработки JVM было написано, в том числе в качестве экспериментов, 4 JIT компилятора и один интерпретатор
8. В Эльбрусе есть бинарная компиляция в x86, которая в том числе позволяет запускать там даже Windows
9. Забавный факт про бинарную компиляцию. Первая версия JVM на zero была медленее, чем оригинальный Hotspot, запущенный в режиме бинарной компиляции. С тех портя очень не доверяю LLVM в качестве бэкенда для JIT - компилятора
10. Существует миф, что Эльбрусы используются только военными. Это не так, например паспорта в РФ выдаются с помощью Эльбрусов
11. В Эльбрусе 3 стека, expression stack - ближайший аналог стека x86, procedure stack - где хранится регистровый файл при вызове процедур, и chain stack, для адресов возврата и различной служебной информации, в том числе для управления остальными стеками
12. GC собирает мусор не в памяти, как в других jvm, а в регистрах с помощью процедурного стека. Поэтому нам не приходится на каждом safepoint сбрасывать все состояние в память. За нас это делает аппаратура.
13. Любой JVM-инженер знает, какая боль - проверка границ в массиве (*aload/astore). В Эльбрусе за счет явной спекулятивностии предикатного исполения можно сделать эту проверку неявной (NPE-like), тем самым избежав ветвления в потенциальном горячем месте.
13.2 С помощью упомянутых фич возможно создать ситуацию, когда процессор сгенерирует исключение в случае выхода за границу. В ситуации, когда предсказателя переходов нет, это очень приятный бонус.
14. Hotspot Macro Asm - очень интересная штука в случае VLIW, т.к. последовательные команды там работают плохо, планировщика нет, а есть переменные тайминги выполнения команд. Поэтому приходится изобретать разные велосипеды. Внимательные читатели могут заметить такой в статье
15. Разработка нативной версии JVM (JIT + Template Interpeter + Runtime) заняла примерно 1 год
15.1 И еще полгода на отладку разумеется
16. В Эльбрусе бывает два вида переходов, подготовленный и неподготовленный. Первый состоит из двух частей (подготовка + переход), второй очевидно из одной. Таким образом нивелируется отсутствие предсказателя переходов
17. В Эльбрусе есть специальные средства для конвейризации циклов. Например, аппаратный счетчик циклов, команды асинхронной загрузки, и програмируемый регистр-ренеймер.
18. В Эльбрусе неи встроенной CAS-инструкции, поэтому ее приходится писать самому, выглядит примерно так:

cas:
load [mem], #acc // 1

cmp #acc, #cmp, #pred // 2

merge #acc, #new, #acc ? #pred // 3

store #acc, [mem] // 4
branch cas ? <interupted>
19. Был интересный случай с оптимизацией. Пользователи прислали java-бенч, который работал на xeon «быстро», а на Эльбрусе медленно. В ходе разбирательств бенч ускорился на в 20 раз на интеле, а Эльбрус практиески сравнялся по скорости с ним
20. В Эльбрусе есть TLS в виде 32 регистров. В итоге у нас наверное был самый быстрый TLAB, который видел мир JVM
21. Эльбрус - очень секьюрный процессор, поэтому пару раз приходилось договариваттся с разработчиками ОС, чтобы JVM разрешили делать что-нибудь запрещенное
22. Например, для манипулации со стековыми фреймами нам сделали специальную «функцию» для копания в chain стеке. Обработка исключений ускорилась в какое-то количество раз > 30
23. Последняя Java на Эльбрусе, которую я использовал, была 8-ой версии. Там работали в числе прочего все GC (s, p, CMS, G1), JVMTI, удаленная отладка.
Я снова с вами, я даже не ожидал такого количества реквестов
24. В рекламе Эльбруса утверждается, что «до 23 команд за такт». На самом деле вычислительных ALU там всего 6, остальные 17 юнитов - это утройство перехода, устройства для работы с массивами, вычилитель предикатов и что-то еще.
25. В Эльбрусе есть «комбинированые команды», которые позволяют выполнять «почти за такт» двойные арифмитические операции, например add_shl делает сложение и сдвиг последоватедьно одной командой. Некоторый аналог адресногл устройства в x86
26. compressed oops в jvm реализованы с помощью комбинированных операций
27. Система команд в Эльбрусе «ортогональная», т.е. «почти» любой регистр можно использовать в «почти» в любой инструкции
28. Таким образом нет разделения на вещественные и целочисленные данные. Это разруливается на уровне инструкций
29. В Эльбрусе операции доступа в память называются ldX и stX, где “X” - это b (byte), s (short), w (word) и d (double word)
30. Также Эльбрус нативно поддерживает операции с 80-битными вещественными числами
31. В Эльбрусе операции доступа в память называются ldX и stX, где “X” - это b (byte), s (short), w (word) и d (double word)
31.2 Ошибся немного, суффикс для short данных - “h” (half word)
32. В Эльбрусе нет операции mov, поэтому пересылка регистров делает с помощью целочисленного сложения (add, or)
33. Ассемблерный листинг кусочка cpp-интерпретатора

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with Twitter author

Twitter author Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Don't want to be a Premium member but still want to support us?

Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal

Or Donate anonymously using crypto!

Ethereum

0xfe58350B80634f60Fa6Dc149a72b4DFbc17D341E copy

Bitcoin

3ATGMxNzCUFzxpMCHL5sWSt4DVtS8UqXpi copy

Thank you for your support!

Follow Us!

:(