Java на Эльбрусеpublic.jugru.org › jpointsd › 2016 › msk › day_1 › track_3 ›...

Post on 27-Jun-2020

4 views 0 download

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наЭльбрус

АртемьевРоманrartemev@unipro.ru

Новосибирскийцентринформационныхтехнологий«УНИПРО»

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