Помощь студентам в учебе
Реализация intrinsic-функций для процессорной архитектуры RISC-V в OpenJDK
|
Введение 4
2. Постановка задачи 6
3. Обзор 7
3.1. Существующие intrinsic-функции 7
3.2. Криптографические алгоритмы в OpenJDK 8
3.3. Поддерживаемые в OpenJDK платформы 13
3.4. Расширения RISC-V 13
4. Алгоритм работы 15
4.1. Основной алгоритм 15
4.2. Апробация 16
4.3. Замеры производительности 16
5. Реализация 18
6. Замеры производительности 24
7. Результаты 29
Приложение 30
Список литературы 46
2. Постановка задачи 6
3. Обзор 7
3.1. Существующие intrinsic-функции 7
3.2. Криптографические алгоритмы в OpenJDK 8
3.3. Поддерживаемые в OpenJDK платформы 13
3.4. Расширения RISC-V 13
4. Алгоритм работы 15
4.1. Основной алгоритм 15
4.2. Апробация 16
4.3. Замеры производительности 16
5. Реализация 18
6. Замеры производительности 24
7. Результаты 29
Приложение 30
Список литературы 46
RISC-V — это открытая [17] процессорная архитектура, в основе которой лежит небольшой набор команд, с возможностью использования
различных расширений [48] для увеличения производительности.
Компания Syntacore занимается созданием и сопровождением процессорных ядер на микропроцессорной архитектуре RISC-V. В число её
работ входит также поддержка инструментов разработки для данной
архитектуры. Одним из таких инструментов является OpenJDK — один
из наиболее популярных [45] на 2023 год наборов утилит для разработки на языке Java. Приоритетное направление для работы — ускорение
методов, использующихся в работе с криптографией.
Одной из особенностей среды исполнения OpenJDK (виртуальной
машины «HotSpot») является концепция уровней компиляции [39]. Согласно ей, исполнение Java методов начинается в интерпретаторе Java
байт-кода сразу после загрузки пришедшего виртуальной машине класса, без дополнительных оптимизаций. При достаточно частом исполнении метода, он будет скомпилирован компилятором C1, с использованием некоторых оптимизаций, например, «constant folding» или «value
numbering» [16]. При последующем исполнении этого метода, он будет скомпилирован уже более мощным компилятором C2, который, например, способен более эффективно выделять регистры или проводить
«global code motion» [40]. Ещё одной из возможных оптимизаций является подмена сгенерированного по Java-байткоду метода на его вручную
написанную в нативных кодах специализацию [21], которая, как ожидается, работает более эффективно, чем порождённая компилятором
версия. Такой подход в OpenJDK называется «intrinsification» («интринсификация»), а сами функции, написанные в ассемблерных кодах
конкретной архитектуры — intrinsic-функциями.
Несмотря на то, что в OpenJDK существует порт для RISC-V, на
данный момент он не поддерживает все существующие криптографические intrinsic-функции: например, в некоторых из таких «ручных»
реализаций этих функций для оптимизаций могут применяться ин-
4струкции из расширений архитектуры, которые совсем недавно были
ратифицированы, и поддержка которых как в OpenJDK, так и в процессорах ещё не успела появиться1. Поэтому, для ускорения работы
HotSpot необходимо расширить текущую поддержку криптографических intrinsic-функций в OpenJDK для архитектуры RISC-V.
различных расширений [48] для увеличения производительности.
Компания Syntacore занимается созданием и сопровождением процессорных ядер на микропроцессорной архитектуре RISC-V. В число её
работ входит также поддержка инструментов разработки для данной
архитектуры. Одним из таких инструментов является OpenJDK — один
из наиболее популярных [45] на 2023 год наборов утилит для разработки на языке Java. Приоритетное направление для работы — ускорение
методов, использующихся в работе с криптографией.
Одной из особенностей среды исполнения OpenJDK (виртуальной
машины «HotSpot») является концепция уровней компиляции [39]. Согласно ей, исполнение Java методов начинается в интерпретаторе Java
байт-кода сразу после загрузки пришедшего виртуальной машине класса, без дополнительных оптимизаций. При достаточно частом исполнении метода, он будет скомпилирован компилятором C1, с использованием некоторых оптимизаций, например, «constant folding» или «value
numbering» [16]. При последующем исполнении этого метода, он будет скомпилирован уже более мощным компилятором C2, который, например, способен более эффективно выделять регистры или проводить
«global code motion» [40]. Ещё одной из возможных оптимизаций является подмена сгенерированного по Java-байткоду метода на его вручную
написанную в нативных кодах специализацию [21], которая, как ожидается, работает более эффективно, чем порождённая компилятором
версия. Такой подход в OpenJDK называется «intrinsification» («интринсификация»), а сами функции, написанные в ассемблерных кодах
конкретной архитектуры — intrinsic-функциями.
Несмотря на то, что в OpenJDK существует порт для RISC-V, на
данный момент он не поддерживает все существующие криптографические intrinsic-функции: например, в некоторых из таких «ручных»
реализаций этих функций для оптимизаций могут применяться ин-
4струкции из расширений архитектуры, которые совсем недавно были
ратифицированы, и поддержка которых как в OpenJDK, так и в процессорах ещё не успела появиться1. Поэтому, для ускорения работы
HotSpot необходимо расширить текущую поддержку криптографических intrinsic-функций в OpenJDK для архитектуры RISC-V.
Возникли сложности?
Нужна помощь преподавателя?
Помощь в написании работ!
[1] ARM. Armv8.x and Armv9.x extensions and features. —
URL: https://developer.arm.com/documentation/102378/
0201/Armv8-x-and-Armv9-x-extensions-and-features (дата обращения: 14.12.2023).
[2] Awati R., Bernstein C., Cobb M. Advanced Encryption Standard.— URL: https://www.techtarget.com/searchsecurity/definition/ Advanced-Encryption-Standard/ (дата обращения: 01.05.2024).
[3] Bernstain D. The Poly1305-AES Message-Authentication Code.— Springer, Berlin, Heidelberg, 2005. — URL: https://link.springer. com/chapter/10.1007/11502760_3 (дата обращения: 14.12.2023).
[4] Bochkarev Arseny. Adler32 RISC-V specific optimizations. —
URL: https://github.com/openjdk/jdk/pull/18382/commits/
3359ec2a82d5d1ac38f9ec142948d37a7cc53590 (дата обращения: 25.05.2024).
[5] Bochkarev Arseny. Adler32 general optimizations. — URL: https://github.com/openjdk/jdk/pull/18382/commits/ 8cef929325f4552b92d2eb6ec1f26698a97a59e8 (дата обращения: 25.05.2024).
[6] Bochkarev Arseny. CRC32 RISC-V specific optimizations. —
URL: https://github.com/openjdk/jdk/pull/17046/files#
diff-7a5c3ed05b6f3f06ed1c59f5fc2a14ec566a6a5bd1d09606115767daa9S (дата обращения: 25.05.2024).
[7] Bochkarev Arseny. CRC32 induction variable elimination. —
URL: https://github.com/openjdk/jdk/pull/17046/commits/
e0f97888fe9a4cf50bef190e4d7c30e6782347ac (дата обращения: 25.05.2024).
[8] Bochkarev Arseny. CRC32 loop unrolling. — URL: https://github.com/openjdk/jdk/pull/17046/commits/
42503b769d462c02b8893833b65397090291265c (дата обращения: 25.05.2024).
[9] Bochkarev Arseny. OpenJDK RISC-V crypto intrinsics branch. — URL: https://github.com/ArsenyBochkarev/jdk/tree/riscv_
crypto_intrinsics (дата обращения: 25.05.2024).
[10] Bochkarev Arseny. Poly1305 RISC-V specific optimizations.—
URL: https://github.com/openjdk/jdk/pull/16417/files#
diff-97f199af6d1c8c17b2fa4f50eb1bbc0081858cc59a899f32792a2d31f93 (дата обращения: 25.05.2024).
[11] Bochkarev Arseny. RISC-V boards used specs.— URL: https:// github.com/ArsenyBochkarev/OpenJDK-RISCV-Intrinsics/blob/ main/docs/benchmarks/micro/cpu/riscv/riscv_boards_specs.md (дата обращения: 25.05.2024).
[12] Bochkarev Arseny. OpenJDK intrinsics benchmarks.—
2023.— URL: https://github.com/ArsenyBochkarev/
OpenJDK-RISCV-Intrinsics/tree/main/benchmarks/ (дата
обращения: 14.12.2023).
[13] Bochkarev Arseny. Unimplemented Intrinsics Prior to Fall 2023.— 2023.— URL: https://github.com/ArsenyBochkarev/ OpenJDK-RISCV-Intrinsics/blob/main/docs/riscv_crypto_ intinsics_list.md (дата обращения: 14.12.2023).
[14] Castagnoli G., Brauer S., Herrmann M. Optimization of cyclic redundancy-check codes with 24 and 32 parity bits. — IEEE, 1993.— URL: https://ieeexplore.ieee.org/document/231911 (дата обращения: 14.12.2023).
[15] DFRobot. Stepping into RISC-V: A Detailed Look at Four Common RISC-V CPU Development Boards.— URL: https://www.dfrobot. com/blog-13481.html (дата обращения: 25.05.2024).
[16] Design of the Java HotSpotTM Client Compiler for Java 6 / T. Kotz- mann, C. Wimmer, H. Mossenbock et al.— 2008.— URL: https: //web.stanford.edu/class/cs343/resources/java-hotspot.pdf (дата обращения: 14.12.2023).
[17] International RISC-V. Frequently Asked Questions. — URL: https: //web.archive.org/web/20160219195430/http://riscv.org/faq/ (дата обращения: 14.12.2023).
[18] International RISC-V. RISC-V ”V” Vector Extension. —
2021.— URL: https://drive.google.com/file/d/1AQZ3l_ EGeMa2NftMO562gVZ4vj61od2H/view?usp=drive_link (дата
обращения: 14.12.2023).
[19] International RISC-V. RISC-V Cryptography Extensions Volume II Vector Instructions.— 2023.— URL: https://drive.google.com/ file/d/1gb9OLH-DhbCgWp7VwpPOVrrY6f3oSJLL/view?usp=sharing (дата обращения: 14.12.2023).
[20] OpenJDK. AArch64 Stubs.— URL: https://github.com/openjdk/ jdk/blob/master/src/hotspot/cpu/aarch64/stubGenerator_ aarch64.cpp (дата обращения: 14.12.2023).
[21] OpenJDK. IntrinsicCandidate.java.— URL: https://github. com/openjdk/jdk/blob/master/src/java.base/share/classes/ jdk/internal/vm/annotation/IntrinsicCandidate.java (дата обращения: 25.05.2024).
[22] OpenJDK. Intrinsics for Arm platform.— URL: https: //github.com/openjdk/jdk/blob/master/src/hotspot/cpu/ aarch64/macroAssembler_aarch64.cpp (дата обращения: 25.05.2024).
[23] OpenJDK. Intrinsics for PowerPC platform.— URL: https: //github.com/openjdk/jdk/blob/master/src/hotspot/cpu/ppc/ macroAssembler_ppc.cpp (дата обращения: 25.05.2024).
[24] OpenJDK. JDK9 stubGenerator_riscv.cpp. — URL: https: //github.com/openjdk/jdk/blob/master/src/hotspot/cpu/ aarch64/stubGenerator_aarch64.cpp (дата обращения: 25.05.2024).
[25] OpenJDK. OpenJDK available platforms. — URL: https: //github.com/openjdk/jdk/tree/master/src/hotspot/cpu/ (дата обращения: 25.05.2024).
[26] OpenJDK. Poly1305 JTreg test.— URL: https://github.com/ openjdk/jdk/blob/master/test/jdk/com/sun/crypto/provider/ Cipher/ChaCha20/unittest/Poly1305UnitTestDriver.java (дата обращения: 25.05.2024).
[27] OpenJDK. TestAESMain.java.— URL: https://github.com/ openjdk/jdk/blob/master/test/hotspot/jtreg/compiler/ codegen/aes/TestAESMain.java (дата обращения: 25.05.2024).
[28] OpenJDK. TestAdler32.java. — URL: https://github.com/openjdk/ jdk/blob/master/test/hotspot/jtreg/compiler/intrinsics/ zip/TestAdler32.java (дата обращения: 25.05.2024).
[29] OpenJDK. TestCRC32C.java.— URL: https://github.com/ openjdk/jdk/blob/master/test/hotspot/jtreg/compiler/ intrinsics/zip/TestCRC32C.java (дата обращения: 25.05.2024).
[30] OpenJDK. TestCRC32.java. — URL: https://github.com/openjdk/ jdk/blob/master/test/hotspot/jtreg/compiler/intrinsics/ zip/TestCRC32.java (дата обращения: 25.05.2024).
[31] OpenJDK. TestGHASH.java.— URL: https://github.com/ openjdk/jdk/blob/master/test/jdk/com/sun/crypto/provider/ Cipher/AES/TestGHASH.java (дата обращения: 25.05.2024).
[32] OpenJDK. Zlib in JVM. — URL: https://github.com/openjdk/jdk/ blob/master/src/java.base/share/native/libzip/zlib/zlib.h (дата обращения: 02.05.2024).
[33] OpenJDK. library_call.cpp in OpenJDK. — URL: https: //github.com/openjdk/jdk/blob/master/src/hotspot/share/ opto/library_call.cpp (дата обращения: 14.12.2023).
[34] OpenJDK. stubGenerator_riscv.cpp. URL: https://github. com/openjdk/jdk/blob/master/src/hotspot/cpu/riscv/ stubGenerator_riscv.cpp (дата обращения: 25.05.2024).
URL: https://developer.arm.com/documentation/102378/
0201/Armv8-x-and-Armv9-x-extensions-and-features (дата обращения: 14.12.2023).
[2] Awati R., Bernstein C., Cobb M. Advanced Encryption Standard.— URL: https://www.techtarget.com/searchsecurity/definition/ Advanced-Encryption-Standard/ (дата обращения: 01.05.2024).
[3] Bernstain D. The Poly1305-AES Message-Authentication Code.— Springer, Berlin, Heidelberg, 2005. — URL: https://link.springer. com/chapter/10.1007/11502760_3 (дата обращения: 14.12.2023).
[4] Bochkarev Arseny. Adler32 RISC-V specific optimizations. —
URL: https://github.com/openjdk/jdk/pull/18382/commits/
3359ec2a82d5d1ac38f9ec142948d37a7cc53590 (дата обращения: 25.05.2024).
[5] Bochkarev Arseny. Adler32 general optimizations. — URL: https://github.com/openjdk/jdk/pull/18382/commits/ 8cef929325f4552b92d2eb6ec1f26698a97a59e8 (дата обращения: 25.05.2024).
[6] Bochkarev Arseny. CRC32 RISC-V specific optimizations. —
URL: https://github.com/openjdk/jdk/pull/17046/files#
diff-7a5c3ed05b6f3f06ed1c59f5fc2a14ec566a6a5bd1d09606115767daa9S (дата обращения: 25.05.2024).
[7] Bochkarev Arseny. CRC32 induction variable elimination. —
URL: https://github.com/openjdk/jdk/pull/17046/commits/
e0f97888fe9a4cf50bef190e4d7c30e6782347ac (дата обращения: 25.05.2024).
[8] Bochkarev Arseny. CRC32 loop unrolling. — URL: https://github.com/openjdk/jdk/pull/17046/commits/
42503b769d462c02b8893833b65397090291265c (дата обращения: 25.05.2024).
[9] Bochkarev Arseny. OpenJDK RISC-V crypto intrinsics branch. — URL: https://github.com/ArsenyBochkarev/jdk/tree/riscv_
crypto_intrinsics (дата обращения: 25.05.2024).
[10] Bochkarev Arseny. Poly1305 RISC-V specific optimizations.—
URL: https://github.com/openjdk/jdk/pull/16417/files#
diff-97f199af6d1c8c17b2fa4f50eb1bbc0081858cc59a899f32792a2d31f93 (дата обращения: 25.05.2024).
[11] Bochkarev Arseny. RISC-V boards used specs.— URL: https:// github.com/ArsenyBochkarev/OpenJDK-RISCV-Intrinsics/blob/ main/docs/benchmarks/micro/cpu/riscv/riscv_boards_specs.md (дата обращения: 25.05.2024).
[12] Bochkarev Arseny. OpenJDK intrinsics benchmarks.—
2023.— URL: https://github.com/ArsenyBochkarev/
OpenJDK-RISCV-Intrinsics/tree/main/benchmarks/ (дата
обращения: 14.12.2023).
[13] Bochkarev Arseny. Unimplemented Intrinsics Prior to Fall 2023.— 2023.— URL: https://github.com/ArsenyBochkarev/ OpenJDK-RISCV-Intrinsics/blob/main/docs/riscv_crypto_ intinsics_list.md (дата обращения: 14.12.2023).
[14] Castagnoli G., Brauer S., Herrmann M. Optimization of cyclic redundancy-check codes with 24 and 32 parity bits. — IEEE, 1993.— URL: https://ieeexplore.ieee.org/document/231911 (дата обращения: 14.12.2023).
[15] DFRobot. Stepping into RISC-V: A Detailed Look at Four Common RISC-V CPU Development Boards.— URL: https://www.dfrobot. com/blog-13481.html (дата обращения: 25.05.2024).
[16] Design of the Java HotSpotTM Client Compiler for Java 6 / T. Kotz- mann, C. Wimmer, H. Mossenbock et al.— 2008.— URL: https: //web.stanford.edu/class/cs343/resources/java-hotspot.pdf (дата обращения: 14.12.2023).
[17] International RISC-V. Frequently Asked Questions. — URL: https: //web.archive.org/web/20160219195430/http://riscv.org/faq/ (дата обращения: 14.12.2023).
[18] International RISC-V. RISC-V ”V” Vector Extension. —
2021.— URL: https://drive.google.com/file/d/1AQZ3l_ EGeMa2NftMO562gVZ4vj61od2H/view?usp=drive_link (дата
обращения: 14.12.2023).
[19] International RISC-V. RISC-V Cryptography Extensions Volume II Vector Instructions.— 2023.— URL: https://drive.google.com/ file/d/1gb9OLH-DhbCgWp7VwpPOVrrY6f3oSJLL/view?usp=sharing (дата обращения: 14.12.2023).
[20] OpenJDK. AArch64 Stubs.— URL: https://github.com/openjdk/ jdk/blob/master/src/hotspot/cpu/aarch64/stubGenerator_ aarch64.cpp (дата обращения: 14.12.2023).
[21] OpenJDK. IntrinsicCandidate.java.— URL: https://github. com/openjdk/jdk/blob/master/src/java.base/share/classes/ jdk/internal/vm/annotation/IntrinsicCandidate.java (дата обращения: 25.05.2024).
[22] OpenJDK. Intrinsics for Arm platform.— URL: https: //github.com/openjdk/jdk/blob/master/src/hotspot/cpu/ aarch64/macroAssembler_aarch64.cpp (дата обращения: 25.05.2024).
[23] OpenJDK. Intrinsics for PowerPC platform.— URL: https: //github.com/openjdk/jdk/blob/master/src/hotspot/cpu/ppc/ macroAssembler_ppc.cpp (дата обращения: 25.05.2024).
[24] OpenJDK. JDK9 stubGenerator_riscv.cpp. — URL: https: //github.com/openjdk/jdk/blob/master/src/hotspot/cpu/ aarch64/stubGenerator_aarch64.cpp (дата обращения: 25.05.2024).
[25] OpenJDK. OpenJDK available platforms. — URL: https: //github.com/openjdk/jdk/tree/master/src/hotspot/cpu/ (дата обращения: 25.05.2024).
[26] OpenJDK. Poly1305 JTreg test.— URL: https://github.com/ openjdk/jdk/blob/master/test/jdk/com/sun/crypto/provider/ Cipher/ChaCha20/unittest/Poly1305UnitTestDriver.java (дата обращения: 25.05.2024).
[27] OpenJDK. TestAESMain.java.— URL: https://github.com/ openjdk/jdk/blob/master/test/hotspot/jtreg/compiler/ codegen/aes/TestAESMain.java (дата обращения: 25.05.2024).
[28] OpenJDK. TestAdler32.java. — URL: https://github.com/openjdk/ jdk/blob/master/test/hotspot/jtreg/compiler/intrinsics/ zip/TestAdler32.java (дата обращения: 25.05.2024).
[29] OpenJDK. TestCRC32C.java.— URL: https://github.com/ openjdk/jdk/blob/master/test/hotspot/jtreg/compiler/ intrinsics/zip/TestCRC32C.java (дата обращения: 25.05.2024).
[30] OpenJDK. TestCRC32.java. — URL: https://github.com/openjdk/ jdk/blob/master/test/hotspot/jtreg/compiler/intrinsics/ zip/TestCRC32.java (дата обращения: 25.05.2024).
[31] OpenJDK. TestGHASH.java.— URL: https://github.com/ openjdk/jdk/blob/master/test/jdk/com/sun/crypto/provider/ Cipher/AES/TestGHASH.java (дата обращения: 25.05.2024).
[32] OpenJDK. Zlib in JVM. — URL: https://github.com/openjdk/jdk/ blob/master/src/java.base/share/native/libzip/zlib/zlib.h (дата обращения: 02.05.2024).
[33] OpenJDK. library_call.cpp in OpenJDK. — URL: https: //github.com/openjdk/jdk/blob/master/src/hotspot/share/ opto/library_call.cpp (дата обращения: 14.12.2023).
[34] OpenJDK. stubGenerator_riscv.cpp. URL: https://github. com/openjdk/jdk/blob/master/src/hotspot/cpu/riscv/ stubGenerator_riscv.cpp (дата обращения: 25.05.2024).
Работу высылаем на протяжении 30 минут после оплаты.