GraalVM Native Image đáp ứng RISC-V
Hiện có thể sử dụng Hình ảnh gốc GraalVM trên RISC-V! Tôi sẽ giải thích ở đây cách biên dịch các ứng dụng cho RISC-V và cách triển khai. Theo mặc định, Hình ảnh gốc sử dụng trình biên dịch Graal để tạo mã máy, nhưng thay vào đó, nó có thể sử dụng trình biên dịch LLVM bằng cách bật phần phụ trợ LLVM ( tài liệu ). Một trong những lý do chính để sử dụng LLVM là nó hỗ trợ nhiều loại kiến trúc, nghĩa là chúng ta không cần triển khai trình biên dịch Graal cho chúng, đây là bước khó nhất khi thêm hỗ trợ cho một kiến trúc mới. Để chứng minh điều này, tôi đã điều chỉnh chương trình phụ trợ LLVM Hình ảnh gốc cho các máy RISC-V trong Linux với bản dựng dành cho nhà phát triển GraalVM .
RISC-V
RISC-V là Kiến trúc Tập lệnh mã nguồn mở (ISA) được tạo ra vào năm 2010. Sự khác biệt chính giữa kiến trúc này và kiến trúc dẫn đầu thị trường hiện tại là RISC-V là mã nguồn mở. Mặc dù mục đích sử dụng đầu tiên của nó là dành cho nghiên cứu và giáo dục, nhưng sự quan tâm của ngành hiện đang tăng lên.
Nó sử dụng một ISA số nguyên cơ sở đơn giản, giúp tránh việc khớp quá mức các mẫu kiến trúc vi mô cụ thể và các tính năng được tối ưu hóa quá mức được thiết kế cho các miền cụ thể, giúp giảm chi phí và cải thiện hiệu suất cho các tác vụ đơn giản hơn. Đối với các mục đích sử dụng phức tạp hơn, các tiện ích mở rộng có thể được thêm vào trên cùng của ISA cơ sở, chẳng hạn như hỗ trợ phép nhân, dấu phẩy động, vectơ, v.v. Một số tiện ích mở rộng đó được xác định trước, nhưng chúng cũng có thể được tùy chỉnh.
trình diễn vi phi hành gia
Để cho thấy sự khác biệt về hiệu suất giữa việc chạy trên JVM và Hình ảnh gốc, chúng tôi đã thực hiện một minh họa dựa trên ứng dụng Micronaut, một máy chủ web nhỏ, trên trình giả lập RISC-V. Các nguồn demo có thể được tìm thấy ở đây .
Khởi tạo máy chủ Micronaut bằng ứng dụng được biên dịch bằng Hình ảnh gốc:
__ __ _ _
| \/ (_) ___ _ __ ___ _ __ __ _ _ _| |_
| |\/| | |/ __| '__/ _ \| '_ \ / _` | | | | __|
| | | | | (__| | | (_) | | | | (_| | |_| | |_
|_| |_|_|\___|_| \___/|_| |_|\__,_|\__,_|\__|
Micronaut (v3.6.0)
16:52:29.965 [main] INFO io.micronaut.runtime.Micronaut - Startup completed in 305ms. Server Running: http://fedora-riscv:8080
Xây dựng chéo các tệp nhị phân cho RISC-V với LLVM Backend
Xem xét hầu hết các cách hiện tại để chạy Linux trên máy RISC-V đều chậm, nên xây dựng chéo các tệp nhị phân cho RISC-V. Hình ảnh gốc hỗ trợ nó với một số điều kiện tiên quyết.
Chuỗi công cụ RISC-V với zlib
Chuỗi công cụ RISC-V phải được cung cấp cho Hình ảnh gốc. Nó có thể được tìm thấy ở đây . Phiên bản của gccvà glibccần phải giống hoặc cũ hơn phiên bản được sử dụng bởi máy RISC-V.
zlibđược bao gồm trong chuỗi công cụ RISC-V nhưng phải được biên dịch thủ công bằng cách sử dụng tệp riscv-gcc. Thư viện đã xuất libz.aphải được chuyển sang path/to/built/toolchain/sysroot/usr/lib/.
CAPCache và thư viện tĩnh
CAPCache là thông tin về nội tại C trên kiến trúc đích, cũng như giá trị của các tính năng và cờ của CPU. Chúng có thể được tải xuống tại đây .
Hình ảnh gốc cần các thư viện tĩnh Java và Graal. Chúng có thể được tải xuống tại đây .
Quy trình xây dựng chéo một nhị phân
Quy trình sau đây mô tả cách xây dựng chéo tệp nhị phân từ một HelloWorld.javatệp đơn giản.
Bước đầu tiên là đáp ứng các điều kiện tiên quyết được đề cập ở trên.
Sau đó, tải xuống bản dựng dành cho nhà phát triển của GraalVM cùng với Hình ảnh gốc.
Cuối cùng, chạy các lệnh sau:
$JAVA_HOME/bin/javac Helloworld.java
$JAVA_HOME/bin/native-image HelloWorld -H:CompilerBackend=llvm \
-Dsvm.targetPlatformArch=riscv64 -H:CAPCacheDir=/path/to/capcache \
-H:CCompilerPath=/path/to/riscv-gcc -H:CustomLD=/path/to/riscv-ld \
-H:CLibraryPath=/path/to/static-libraries \
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.riscv64=org.graalvm.nativeimage.builder
-Dsvm.targetPlatformArch=riscv64cho phép bạn chỉ định kiến trúc mục tiêu.-H:CompilerBackend=llvmchỉ định rằng chúng tôi sử dụng chương trình phụ trợ LLVM.-H:CAPCacheDir=/path/to/capcachecung cấp CAPCaches được tính toán trước cho Hình ảnh gốc.-H:CCompilerPath=/path/to/riscv-gcccung cấpgcctừ chuỗi công cụ RISC-V cho Hình ảnh gốc.-H:CustomLD=/path/to/riscv-ldcung cấpldtừ chuỗi công cụ RISC-V cho Hình ảnh gốc.-H:CLibraryPath=/path/to/static-librariescung cấp các thư viện tĩnh cho Hình ảnh gốc.
Tính toán CAPCache và biên dịch thư viện tĩnh theo cách thủ công
Để lấy CAPCache hoặc thư viện tĩnh theo cách thủ công, một giải pháp là xây dựng Hình ảnh gốc trên RISC-V từ nguồn. Điều này có thể được thực hiện bằng cách sử dụng các lệnh sau.
git clone https://github.com/oracle/graal.git
git clone https://github.com/graalvm/mx.git
export PATH=$PWD/mx:$PATH
cd graal/substratevm
mx fetch-jdk
# Choose one of the jdk version and run the provided export command
export SKIP_LIBRARIES=true
mx build
Để tính toán CAPCaches, hãy chạy lệnh sau.
$JAVA_HOME/bin/native-image HelloWorld -H:CompilerBackend=llvm \
-H:+ExitAfterCAPCache -H:CAPCacheDir=/path/to/capcache -H:+NewCAPCache \
-add-exports=jdk.internal.vm.ci/jdk.vm.ci.riscv64=org.graalvm.nativeimage.builder
Xây dựng nhị phân RISC-V nguyên bản
Mặc dù nên xây dựng chéo các tệp nhị phân, nhưng vẫn có thể xây dựng chúng trên máy RISC-V. Quy trình này rất giống với xây dựng chéo. Chuỗi công cụ không còn cần thiết nữa, vì nó sẽ là chuỗi công cụ gốc và CAPCache cũng như các thư viện tĩnh sẽ được cung cấp tự động. Sự khác biệt cuối cùng là trong lệnh cuối cùng:
$JAVA_HOME/bin/native-image HelloWorld -H:CompilerBackend=llvm \
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.riscv64=org.graalvm.nativeimage.builder
Để thêm mục tiêu RISC-V vào Hình ảnh gốc, chúng tôi phải triển khai tất cả các thay đổi được mô tả trong tài liệu . Tuy nhiên, có một số thay đổi khác không được đề cập liên quan đến RISC-V.
Triển khai JVMCI
Trình biên dịch Graal phụ thuộc vào Giao diện trình biên dịch máy ảo Java (JVMCI), nghĩa là thành phần con Java này phải được triển khai để sử dụng Ảnh gốc vì nó phụ thuộc vào trình biên dịch Graal. Mặc dù chương trình phụ trợ LLVM không sử dụng toàn bộ trình biên dịch Graal, nhưng nó vẫn sử dụng giao diện người dùng của nó và do đó, cần một tập hợp con của JVMCI. Việc triển khai tập hợp con này cho RISC-V có thể được tìm thấy tại đây .
Phần kết luận
Chương trình phụ trợ RISC-V LLVM hỗ trợ hầu hết tất cả các tính năng mà các chương trình phụ trợ LLVM khác hỗ trợ!
Vẫn còn nhiều việc phải làm, chẳng hạn như thêm hỗ trợ cho macOS và các hệ điều hành khác. Một số tối ưu hóa dành riêng cho mục tiêu có thể thú vị để điều tra vì RISC-V cung cấp một số thanh ghi cụ thể mà không phải tất cả các kiến trúc khác đều có. Ví dụ, có thanh ghi luồng ( x4).
Xem xét rằng chỉ mất khoảng sáu tháng để thêm hỗ trợ RISC-V cho Hình ảnh gốc bằng cách sử dụng chương trình phụ trợ LLVM, ý tưởng thêm hỗ trợ cho các mục tiêu tiềm năng khác như WebAssugging rất hấp dẫn. Trên thực tế, việc thêm các kiến trúc khác sẽ trở nên dễ tiếp cận hơn, vì phần phụ trợ LLVM sẽ sớm phát ra phần dữ liệu Hình ảnh gốc, cho phép nó bỏ qua việc thêm thông tin về các tệp đối tượng.
Chúng tôi hoan nghênh phản hồi của bạn! Bạn có thể chia sẻ nó qua Slack , GitHub , Twitter hoặc Mastodon .

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































