Java на Эльбрусеpublic.jugru.org › jpointsd › 2016 › msk › day_1 › track_3 ›...
Transcript of Java на Эльбрусеpublic.jugru.org › jpointsd › 2016 › msk › day_1 › track_3 ›...
JavaнаЭльбрусе
АртемьевРоман
Новосибирскийцентринформационныхтехнологий«УНИПРО»
JPointStudentday,24апреля2016
ЭЛЬБРУС*/&?+=?!!!
2
Эльбрус?
3
ЗачемЭльбрус?
• Импортозамещение• Безопасность
4
ЗачемJavaнаЭльбрусе?
• Java– промышленныйстандарт• ПоддержкаJVM-basedязыков• ШагнапутикподдержкеJavaScript,C#
5
Очемдоклад?
• ПроЭльбрусJ• Происториюпортирования OpenJDK наЭльбрус• Прокомпиляторы• ПроJava-runtime• ПропроблемывработеJavaприложенийнаЭльбрусе• ПроспособыувеличенияскоростиJavaнаЭльбруса
6
Ктомытакие?
• Унипро:• УчаствоваливразработкеплатформыJavaс1996 г.• РазработчикJavaCompatibilityKit• «Реинкарнатор»ApacheHarmony
7
Отличия архитектурЭльбрус x86-64
8
Отличия архитектурЭльбрус• VLIW• Многорегистров(192+32)• Явнаяспекулятивность
x86-64• Суперскалярный• Малорегистров(16+16+8)• Неявнаяспекулятивность
9
Спекулятивность
10
Отличия архитектурЭльбрус• VLIW• Многорегистров(192+32)• Явнаяспекулятивность• Условноеисполнение
x86-64• Суперскалярный• Малорегистров(16+16+8)• Неявнаяспекулятивность• cmov
11
Условноеисполнение
12
Отличия архитектурЭльбрус• VLIW• Многорегистров(192+32)• Явнаяспекулятивность• Условноеисполнение• 3аппаратныхстека(2защищены)
x86-64• Суперскалярный• Малорегистров(16+16+8)• Неявнаяспекулятивность• cmov• 1аппаратныйвседоступныйстек
13
Отличия архитектурСтекиЭльбруса
UserStack
localvar 3
localvar 2
localvar 1
parameter1
parameter2
Parameter3
Стекx86-64
Reg Stack
saved%r0
saved%r1
saved%r2
…
saved%r191
saved%r192
ChainStack
returnaddr 1
returnaddr 2
returnaddr 3
returnaddr 4
returnaddr 5
returnaddr 6
14
Отличия архитектурЭльбрус• VLIW• Многорегистров(192+32)• Явнаяспекулятивность• Условноеисполнение• 3аппаратныхстека• Нетпредсказателяпереходов
x86-64• Суперскалярный• Малорегистров(16+16+8)• Неявнаяспекулятивность• cmov• 1аппаратныйстек• Динамическийпредсказательпереходов
15
Свитчи– Зло
16
17
18
19
nop 3setwd wsz = 0x4return %ctpr3ldw,0 %dr0, 0x0, %r0ldw,2 %dr0, 0x4, %r1ldw,3 %dr1, 0x0, %r2ldw,5 %dr1, 0x4, %r3
nop 2fsubs,0 %r0, %r2, %r0fsubs,3 %r1, %r3, %r1
nop 4fmuls,0 %r0, %r0, %r0fmuls,3 %r1, %r1, %r1
nop 3fadds,0 %r0, %r1, %r0
nop 3fsqrts,0 %r0, %r0ct %ctpr3
20
nop 3setwd wsz = 0x4return %ctpr3ldw,0 %dr0, 0x0, %r0ldw,2 %dr0, 0x4, %r1ldw,3 %dr1, 0x0, %r2ldw,5 %dr1, 0x4, %r3
nop 2fsubs,0 %r0, %r2, %r0fsubs,3 %r1, %r3, %r1
nop 4fmuls,0 %r0, %r0, %r0fmuls,3 %r1, %r1, %r1
nop 3fadds,0 %r0, %r1, %r0
nop 3fsqrts,0 %r0, %r0ct %ctpr3
21
nop 3setwd wsz = 0x4return %ctpr3ldw,0 %dr0, 0x0, %r0ldw,2 %dr0, 0x4, %r1ldw,3 %dr1, 0x0, %r2ldw,5 %dr1, 0x4, %r3
nop 2fsubs,0 %r0, %r2, %r0fsubs,3 %r1, %r3, %r1
nop 4fmuls,0 %r0, %r0, %r0fmuls,3 %r1, %r1, %r1
nop 3fadds,0 %r0, %r1, %r0
nop 3fsqrts,0 %r0, %r0ct %ctpr3 ? predX
22
nop 3setwd wsz = 0x4return %ctpr3ldw,0 %dr0, 0x0, %r0ldw,2 %dr0, 0x4, %r1ldw,3 %dr1, 0x0, %r2ldw,5 %dr1, 0x4, %r3
nop 2fsubs,0 %r0, %r2, %r0fsubs,3 %r1, %r3, %r1
nop 4fmuls,0 %r0, %r0, %r0fmuls,3 %r1, %r1, %r1
nop 3fadds,0 %r0, %r1, %r0
nop 3fsqrts,0 %r0, %r0ct %ctpr3
23
nop 3setwd wsz = 0x4return %ctpr3ldw,0 %dr0, 0x0, %r0ldw,2 %dr0, 0x4, %r1ldw,3 %dr1, 0x0, %r2ldw,5 %dr1, 0x4, %r3
; a->x; a->y; b->x; b->y
nop 2fsubs,0 %r0, %r2, %r0fsubs,3 %r1, %r3, %r1
nop 4fmuls,0 %r0, %r0, %r0fmuls,3 %r1, %r1, %r1
nop 3fadds,0 %r0, %r1, %r0
nop 3fsqrts,0 %r0, %r0ct %ctpr3
24
nop 3setwd wsz = 0x4return %ctpr3ldw,0 %dr0, 0x0, %r0ldw,2 %dr0, 0x4, %r1ldw,3 %dr1, 0x0, %r2ldw,5 %dr1, 0x4, %r3
nop 2fsubs,0 %r0, %r2, %r0fsubs,3 %r1, %r3, %r1
; (a.x - b.x); (a.y - b.y)
nop 4fmuls,0 %r0, %r0, %r0fmuls,3 %r1, %r1, %r1
; (.x) * (.x); (.y) * (.y)
nop 3fadds,0 %r0, %r1, %r0 ; (x*x) + (y*y)
nop 3fsqrts,0 %r0, %r0ct %ctpr3
; sqrt(..)
25
history|grepelbrus
1. OpenJDK+Zero+LLVM2. VLIW-кодогенератор3. Client-JITдляЭльбруса4. Server-JITдляЭльбруса5. Шаблонныйинтерпретатор
26
Version1.0• LLVMBackendдляЭльбруса• JIT-компиляторShark• Tailcall оптимизацияCPP-интерпретатора• НаЭльбрусепоявиласьJava!
27
Первыйблинкомом…• Много,оченьмноговетвлений• Неэффективнаясборкамусора• Явныепроверки• НетHigh-levelоптимизаций• НетLow-levelоптимизаций• Ит.д.
28
Состояниедел• Дорогиепереходы• НетLow-levelоптимизаций• Низкаяскоростькомпиляции• Неэффективнаясборкамусора• ЯвныеRuntimeпроверки• НетHigh-levelоптимизаций• Медленныйинтерпретатор
29
Многорегистров Быстрыйаллокатор
VLIW Мощныйпланировщик
Ветвления If-conversion
Чтожеделать?
30
Кодогенератор
• Планировщик– “superblock”• Спекулятивность• Распределительуправляющихрегистров
• Регистры– раскраскаграфа• If-conversion– поканетL
31
Состояниедел• Дешевыепереходы• Low-levelоптимизации• Низкаяскоростькомпиляции• Неэффективнаясборкамусора• ЯвныеRuntimeпроверки• НетHigh-levelоптимизаций• Медленныйинтерпретатор
32
Client-компилятор
Байткод IR Implicitexceptions
If-conversion
SchedulerRegisterAllocator
«Быстрый»метод
33
Client-компилятор
Байткод IR Implicitexceptions
If-conversion
SchedulerRegisterAllocator
«Быстрый»метод Scheduler+RegisterAllocator
34
Состояниедел• Дешевыепереходы• Low-levelоптимизации• Высокаяскоростькомпиляции(x10)• Неэффективнаясборкамусора• ЯвныеRuntimeпроверки• НетHigh-levelоптимизаций• Медленныйинтерпретатор
35
GarbageCollection
36
GC:Эльбрус
%r0
%r1
…
%r54
%r55
37
GC:Эльбрус
%r0
%r1
…
%r54
%r55
saved%r0
saved%r1
…
saved %r55
Frame info
Javastack
38
GC:Эльбрус
%r0
%r1
…
%r54
%r55
saved%r0
saved%r1
…
saved %r55
Frame info
saved%r0saved%r1
…saved %r55
Javastack
Reg stack
Hardware
39
GC:Эльбрус
%r0
%r1
…
%r54
%r55
saved%r0
saved%r1
…
saved %r55
Frame info
saved%r0saved%r1
…saved %r55
Javastack
Reg stack
Hardware
collct %r0
collct %r1
…
collct %r55
Frame info
saved%r0saved%r1
…saved %r55
Reg stack
Javastack
DoGC
40
GC:Эльбрус
%r0
%r1
…
%r54
%r55
saved%r0
saved%r1
…
saved %r55
Frame info
saved%r0saved%r1
…saved %r55
Javastack
Reg stack
Hardware
collct %r0
collct %r1
…
collct %r55
Frame info
saved%r0saved%r1
…saved %r55
Reg stack
Javastack
DoGC%r0
%r1
…
%r54
%r55
Hardware
41
GC:Эльбрус
%r0
%r1
…
%r54
%r55
saved%r0
saved%r1
…
saved %r55
Frame info
saved%r0saved%r1
…saved %r55
Javastack
Reg stack
Hardware
collct %r0
collct %r1
…
collct %r55
Frame info
saved%r0saved%r1
…saved %r55
Reg stack
Javastack
DoGC%r0
%r1
…
%r54
%r55
Hardware
42
GC:Эльбрус
%r0
%r1
…
%r54
%r55
saved%r0
saved%r1
…
saved %r55
Frame info
saved%r0saved%r1
…saved %r55
Javastack
Reg stack
Hardware
collct %r0
collct %r1
…
collct %r55
Frame info
collct %r0collct %r1
…collct %r55
Reg stack
Javastack
DoGC%r0
%r1
…
%r54
%r55
HardwareDoGC
43
Состояниедел• Дешевыепереходы• Low-levelоптимизации• Высокаяскоростькомпиляции• Сборкамусорачерезстекрегистров(x2)• ЯвныеRuntimeпроверки• НетHigh-levelоптимизаций• Медленныйинтерпретатор
44
Runtime проверки
Идея– явноесделатьнеявным
45
Runtime проверки
• NPE– ловимSIGSEGVилиSIGILL
46
NullPointerException
load,sm [ptr1+0x10], dst «тяжелая» инструкция
47
NullPointerException
load,sm [ptr1+0x10], dst «тяжелая» инструкция
…… Что-тосчитаем
48
NullPointerException
load,sm [ptr1+0x10], dst «тяжелая» инструкция
…… Что-тосчитаем
add dst,rX,rY «легкая»инструкцияSIGILL->NPE
49
NullPointerException
load,sm [ptr1+0x10], dst «тяжелая» инструкция
…… Что-тосчитаем
add dst,rX,rY «легкая»инструкцияSIGILL->NPE
storerY,[ptr2+0x20] SIGSEGV->NPE
50
Runtime проверки
• NPE– ловимSIGSEGVилиSIGILL• Div0– ловимSIGILL• StackOverflow– guardpage,SIGSEGV
51
StackOverflow
GuardPage
Emptyspace
frame0frame1
…frameN
Frameptr*
SOptr*
52
Runtime проверки
• NPE– ловимSIGSEGV• Div0– ловимSIGILL• StackOverflow– guardpage,SIGSEGV• BoundsCheck– спомощьюусловныхинструкцийпровоцируемSIGSEGVпривыходезаграницу
53
BoundsCheck
loadarr_ptr,arr_length ; SIGSEGV ->NPE
54
BoundsCheck
loadarr_ptr,arr_length ; SIGSEGV ->NPEcmpU,index,arr_length,pred
55
BoundsCheck
loadarr_ptr,arr_length ; SIGSEGV ->NPEcmpU,index,arr_length,predmov 0,arr_ptr ?~predmov 0,index ?~pred
56
BoundsCheck
loadarr_ptr,arr_length ; SIGSEGV ->NPEcmpU,index,arr_length,predmov 0,arr_ptr ?~predmov 0,index ?~predload[arr_ptr +index],val ; SIGSEGV->OOB
57
Runtime проверки
• NPE– ловимSIGSEGV• Div0– ловимSIGILL• StackOverflow– guardpage,SIGSEGV• BoundsCheck– спомощьюусловныхинструкцийпровоцируемSIGSEGVпривыходезаграницу
58
Состояниедел• Дешевыепереходы• Low-levelоптимизаций• Высокаяскоростькомпиляции• Сборкамусорачерезстекрегистров• НеявныеRuntimeпроверки(+15%)• НетHigh-levelоптимизаций• Медленныйинтерпретатор
59
Opto
x86-64
Bytecode IdealIR
OptimizedIdealIRMachIR
OptimizedMachIR ASM
60
Opto
Эльбрус
Bytecode IdealIR
OptimizedIdealIRVLIWIR
ASM
x86-64
Bytecode IdealIR
OptimizedIdealIRMachIR
OptimizedMachIR ASM
61
Состояниедел• Дешевыепереходы• Low-levelоптимизаций• Высокаяскоростькомпиляции• Сборкамусорачерезстекрегистров• НеявныеRuntimeпроверки• High-levelоптимизаций• Медленныйинтерпретатор
62
Шаблонныйинтерпретатор• Влияетнаскоростьстартаприложений• Наx86быстрееобычногов10раз• РеализациядляЭльбрусаведется
63
Состояниедел• Дешевыепереходы• Low-levelоптимизаций• Высокаяскоростькомпиляции• Сборкамусорачерезстекрегистров• НеявныеRuntimeпроверки• High-levelоптимизаций• Быстрыйинтерпретатор
64
Сравнениережимовкомпиляции
Shark Client Server УскорениеServer/Shark
SpecJBB2005, числоопераций, больше–>лучше
SpecJBB2005 2172 6261 18378 8.5
SpecJVM98, времявсекундах,меньше–>лучше
compress 76.08 28.56 15.57 4.9jess 35.26 12.62 5.43 6.5db 60.78 32.12 19.35 3.14javac 41.78 18.16 9.74 4.3mpegaudio 70.58 36.39 10.37 6.8mtrt 32.06 12.15 1.64 19.5jack 25.33 15.99 9.92 2.5
65
Сравнениережимовкомпиляции
Shark Client Server УскорениеServer/Shark
SpecJBB2005, числоопераций, больше–>лучше
SpecJBB2005 2172 6261 18378 8.5
SpecJVM98, времявсекундах,меньше–>лучше
compress 76.08 28.56 15.57 4.9jess 35.26 12.62 5.43 6.5db 60.78 32.12 19.35 3.14javac 41.78 18.16 9.74 4.3mpegaudio 70.58 36.39 10.37 6.8mtrt 32.06 12.15 1.64 19.5jack 25.33 15.99 9.92 2.5
66
Сравнениережимовкомпиляции
Shark Client Server УскорениеServer/Shark
SpecJVM2008, числоопераций, больше–>лучшеcompiler 4.3 13.8 25.8 6.0compress 2.7 11.1 20.8 7.7crypto 3.1 6.0 20.3 6.5derby 4.9 17.2 36.9 7.5mpegaudio 2.3 4.1 12.4 5.4scimark.large 1.2 1.8 3.8 3.2scimark.small 4.0 6.8 16.5 4.1serial 1.5 5.3 12.5 8.3startup 0.7 1.4 2.3 3.3sunflow 0.9 4.0 8.2 9.1xml 5.2 14.1 34.2 6.6Общий счет 2.3 6.0 13.4 5.8
67
Тестовыйстенд
Эльбрус
• Elbrus4C• 800MHz• 4cores• 65нм• 8 MbL2Cache
x86-64
• Intel Core2Quad Q9300• 2.50GHz• 4cores• 45нм• 6 MbL2 Cache
68
Сравнениесx86-64
x86-64 Elbrus Отношениеx86-64/Elbrus
SpecJBB2005, числоопераций, больше–>лучше
SpecJBB2005 65682 18378 3.6
SpecJVM98, времявсекундах,меньше–>лучше
compress 2.38 15.57 6.5
jess 0.54 5.43 10.0
db 5.05 19.35 3.8
javac 1.63 9.74 6.0
mpegaudio 1.32 10.37 7.8
mtrt 0.3 1.64 5.5
jack 0.83 9.92 11.9
69
Сравнениес x86-64
Intel Elbrus Отношение x86-64/Elbrus
SpecJVM2008, числоопераций, больше–>лучшеcompiler 241.65 25.8 9.4compress 147.42 20.8 7.1crypto 152 20.3 7.6derby 209.91 36.9 5.7mpegaudio 86.05 12.4 6.9scimark.large 17.45 3.8 4.6scimark.small 164.54 16.5 10.0serial 88.65 12.5 7.1startup 22.49 2.3 9.8sunflow 49.49 8.2 6.0xml 308.56 34.2 9.0Общий счет 98.59 13.4 7.3
70
Чтодальше?
• Java• If-conversion• Векторизация• CompressedOops• TemplateInterpreter• ConcurrentGC
• JavaScript(V8)• C#
71
Summary
• ЧтотакоеЭльбрус• ЧтозаJavaнаЭльбрусе• Какненадописать наJava подЭльбрус• КакустроенJIT-компилятор• Какпортировать Javaна«экзотику»• «Реальную»скоростьЭльбруса• ПерспективыЭльбруса
72
73
JavaнаЭльбрус
АртемьевРоман[email protected]
Новосибирскийцентринформационныхтехнологий«УНИПРО»
JPointStudentday,24апреля2016
ВерсияJava
75
Деоптимизация
MethodA
MethodB*
MethodC
MethodD
B’sDeopt stub
C’sReexecutestub
OriginalRet
76
GC:Эльбрус
%r0
%r1
…
%r54
%r55
saved%r0saved%r1
…saved %r55
Reg stack
collct %r0collct %r1
…collct %r55
Reg stack
OS->DoGC
%r0
%r1
…
%r54
%r55
77
GC:x86-64savedRAX
savedRCX
savedRDX
…
…
savedEBP
returnpc
colllctd RAX
colllctd RCX
colllctd RDX
…
…
colllctd EBP
returnpc
rax
rcx
rdx
rbx
rsp
rbp
rsi
rdi
r8
…
r15
save
rax
rcx
rdx
rbx
rsp
rbp
rsi
rdi
r8
…
r15
loadDoGC
Java+ABIstack Java+ABIstackRegisters
78
Планированиеинструкций
• До6арифметическихинструкцийвширокойкоманде• Javaимееткороткиебазовыеблоки• Списочноепланированиедает1.3инструкции наширокуюкоманду
+30%производительности
79
Межблоковоепланированиеинструкций
A
B
C
D
E
F
G
Суперблок
Exception
Блоксоднимпредком Exceptionhandler
80
Межблоковоепланированиеинструкций
• Суперблокидаютеще15% производительности• Среднееколичествоинструкцийвширокойкоманде2.2,по-прежнемузначительноменьше6
A
B
C
D
E
F
G
Implicitexception
Блоксоднимпредком Exceptionhandler
81
Распределениерегистров
• Регистрызначения:192черезрегистровоеокно,32глобальных• Предикаты:32,можносоздатьдо65потоковуправления• Управляющиерегистры:3,служатдляпередачиуправления
82
ControlTransitionPreparationRegister
returnreturn %ctpr3
ct %ctpr3 ? predY
branchprep br %ctprX
ct %ctprX ? predY
callprep call %ctprX
call %ctprX ? predY
2-8
2-4
5-9
83
Распределениерегистров
• Linear scan register allocator дляуправляющихрегистроввовремяпланирования,+10%производительности• Вбудущемпланируемобъединитьраспределениерегистровипланированиеинструкцийдлявсехтипов
84
Пробросисключений
PCM0
PC M1
XPC
PC3
…
Chainstack
PCM0
PCM1
HPC
PC3
…
ОС
Chainstack
85
Исключения– Медленно
86
Исключения– Медленно(пока…)
87