beehive-lab/TornadoVM
Write Java. Run on GPUs. Fast.
🌪️ TornadoVM – GPU 上的 Java
是什麼 – TornadoVM 是一個開源執行時,讓你撰寫 純 Java 內核,並在 GPU(NVIDIA、AMD、Intel、Apple Silicon)或多核心 CPU 上執行。執行時會將 Java 位元碼 JIT 編譯為目標裝置的原生 GPU 語言(CUDA PTX、OpenCL C 或 Apple Metal MSL),並自動處理所有主機-裝置間的資料傳輸。在 NVIDIA 硬體上,它還能直接呼叫 CUDA 庫堆疊(cuBLAS、cuFFT、cuDNN),甚至暴露 Tensor-Core 的 mma.sync 內聯函數,全部透過 Java 程式碼實現。
🎯 核心理念
| 理念 | 如何運作 |
|---|---|
| 一次撰寫,到處執行 | 使用 CUDA 風格的線程索引(ctx.globalIdx)撰寫 Java 內核,或簡單地用 @Parallel 注解迴圈。TornadoVM 建構一個 TaskGraph,可分派到任意後端(OpenCL、CUDA、Metal、CPU)。 |
| JIT 編譯 | Java 位元碼 → Graal IR → 後端特定原始碼(CUDA PTX / OpenCL C / MSL)→ 執行時編譯器(NVRTC、OpenCL 驅動、Metal)→ 面向實際資料大小最佳化的原生 GPU 二進位檔。 |
| 零 JNI 樁碼 | 無需手動撰寫原生包裝器;執行時自動產生原生程式碼並連結至 Java 進程。 |
| 原生 CUDA 生態系統整合 | 產生的內核與庫呼叫(cublasSgemv、FFT、cuDNN 操作、Tensor-Core 內聯函數)共享裝置緩衝區與 CUDA 流。你可以在同一圖中混合自訂 Java 內核與廠商最佳化庫任務。 |
| CUDA 圖形擷取 | 整個圖(內核、庫呼叫、傳輸)可一次性錄製並用單一 cuGraphLaunch 重播,啟動開銷接近手寫 CUDA。 |
🚀 典型應用場景
| 領域 | 示例專案 |
|---|---|
| 大型語言模型推論 | GPULlama3.java 在 RTX 5090 上以約 117 tokens/s 的速度執行 Llama-3、Qwen-3、Mistral 等模型,純 Java 實作,已被 LangChain4j 和 Quarkus 使用。 |
| 即時圖形 | TornadoVM-Ray-Tracer 展示了完全以 Java 寫成的互動式光線追蹤。 |
| 電腦視覺 / 3D 重構 | kfusion-tornadovm 在 GPU 上實作 KinectFusion 流程。 |
| 科學/工程程式碼 | 線性代數內核(SGEMV/SGEMM)、FFT、物理模擬、金融建模 – 全部受益於 cuBLAS/cuFFT 加速。 |
| 通用資料平行工作負載 | 任何「極易平行」的迴圈皆可用 @Parallel 注解,並在不重寫演算法的前提下卸載至 GPU 或 CPU。 |
📦 快速入門
- 安裝 –
sdk install tornadovm(選擇opencl、cuda、metal或full)。 - 驗證裝置 –
tornado --devices。 - 執行範例 –
java @$TORNADOVM_HOME/tornado-argfile \ -cp $TORNADOVM_HOME/share/java/tornado/tornado-examples-5.2.0.jar \ uk.ac.manchester.tornado.examples.compute.MatrixVectorRowMajor - 加入 Maven 專案 –
<dependency> <groupId>io.github.beehive-lab</groupId> <artifactId>tornado-api</artifactId> <version>5.2.0-jdk21</version> </dependency> - 撰寫內核 – 使用低階
KernelContextAPI(如 README 所示)或高階@Parallel注解。建構TaskGraph,可選地加入庫任務(CuBlas::cublasSgemv等),並透過TornadoExecutionPlan執行。
🛠️ 主要功能
- 多後端支援:OpenCL、CUDA、Metal,以及 CPU 回退。
- 原生 NVIDIA 庫支援:cuBLAS/cuBLASLt、cuFFT、cuDNN(含 flash-attention)、Tensor-Core 內聯函數。
- TaskGraph 抽象 – 宣告式資料傳輸、內核啟動與庫呼叫。
- CUDA 圖形擷取,實現低開銷重複執行。
- 跨平台:支援 Linux、macOS、Windows;透過 OpenCL 支援整合 GPU 與 FPGA。
- SDKMAN! 分發版 與 Docker 鏡像,方便快速部署。
- Apache 2.0 API + GPLv2-CE 執行時 – 商業使用寬鬆。
👥 社群與支援
- Slack: https://join.slack.com/t/tornadovmcommunity/...
- GitHub Discussions: https://github.com/beehive-lab/TornadoVM/discussions
- 問題追蹤:標有「good first issue」標籤,適合新手參與。
- 文件:ReadTheDocs 站點提供程式設計指南、基準測試指南與 API 參考。
- 學術與產業合作:參與 NVIDIA Inception 計畫,獲 Intel、歐盟、UKRI 等資助。
📜 授權條款
- Tornado-API 及大多數模組 – Apache 2.0(你的程式碼無 copyleft 要求)。
- 執行時與驅動 – GPLv2 with Classpath Exception(與 OpenJDK 相同),對下游應用也無 copyleft 要求。
總結 – TornadoVM 將原生 GPU 程式碼的效能帶入 Java 生態系,無需你自己撰寫 CUDA 或 OpenCL。它是一個真實、可投入生產的專案,已被用於 LLM 推論、光線追蹤與科學計算。
相關
- 專案
- Dispatch
- 專案
- 專案
- 專案