
Tornadovm是OpenJDK和GRAALVM的插件,允許程序員在異質硬件上自動運行Java程序。 Tornadovm靶向OPENCL,PTX和SPIR-V兼容設備,其中包括多核CPU,專用GPU(Intel,Nvidia,AMD),Integrated GPU(Intel HD Graphics and Arm Mali)和FPGAS(Intel和Intel和Xilinx)。
Tornadovm有三個後端產生Opencl C,NVIDIA CUDA PTX組件和Spir-V二進制。開發人員可以選擇要安裝和運行的後端。
網站:Tornadovm.org
文檔:https://tornadovm.readthedocs.io/en/latest/
有關快速介紹,請閱讀以下常見問題解答。
最新版本: Tornadovm 1.0.8-30/09/2024:請參閱ChangElog。
在Linux和MacOS中,可以使用安裝腳本自動安裝Tornadovm。例如:
$ ./bin/tornadovm-installer
usage: tornadovm-installer [-h] [--version] [--jdk JDK] [--backend BACKEND] [--listJDKs] [--javaHome JAVAHOME]
TornadoVM Installer Tool. It will install all software dependencies except the GPU/FPGA drivers
optional arguments:
-h, --help show this help message and exit
--version Print version of TornadoVM
--jdk JDK Select one of the supported JDKs. Use --listJDKs option to see all supported ones.
--backend BACKEND Select the backend to install: { opencl, ptx, spirv }
--listJDKs List all JDK supported versions
--javaHome JAVAHOME Use a JDK from a user directory注意選擇所需的後端:
opencl :啟用OpenCL後端(需要OpenCL驅動程序)ptx :啟用PTX後端(需要NVIDIA CUDA驅動程序)spirv :啟用SPIRV後端(需要Intel級零驅動程序)安裝示例:
# Install the OpenCL backend with OpenJDK 21
$ ./bin/tornadovm-installer --jdk jdk21 --backend opencl
# It is also possible to combine different backends:
$ ./bin/tornadovm-installer --jdk jdk21 --backend opencl,spirv,ptx另外,可以從源或使用Docker手動安裝Tornadovm。
如果您打算在GPU上使用Docker與Tornadovm一起使用,也可以遵循這些準則。
您還可以按照此處的說明在Amazon AWS CPU,GPU和FPGA上運行Tornadovm。
Tornadovm目前用於加速機器學習和深度學習應用,計算機視覺,物理模擬,財務應用,計算攝影和信號處理。
特色用例:
我們還有一組示例,包括NBODY,DFT,KMEANS計算和矩陣計算。
附加信息
Tornadovm通過輕型應用程序編程接口(API)暴露於編程器任務級,數據級和管道級並行性。此外,Tornadovm使用單源屬性,其中要加速的代碼,主機代碼在同一Java程序中進行。
可以使用兩種不同的方法(API)對Tornadovm中的計算內核進行編程:
計算內核以順序形式(用於單個線程執行編程的任務)編寫。為了表達並行性,Tornadovm暴露了兩個可以在循環和參數中使用的註釋:a) @Parallel用於註釋並行循環; b) @Reduce用於減少的註釋參數。
以下代碼段顯示了一個完整的示例,以使用Tornadovm和Loop-paralallel API加速矩陣 - 刺激:
public class Compute {
private static void mxmLoop ( Matrix2DFloat A , Matrix2DFloat B , Matrix2DFloat C , final int size ) {
for ( @ Parallel int i = 0 ; i < size ; i ++) {
for ( @ Parallel int j = 0 ; j < size ; j ++) {
float sum = 0.0f ;
for ( int k = 0 ; k < size ; k ++) {
sum += A . get ( i , k ) * B . get ( k , j );
}
C . set ( i , j , sum );
}
}
}
public void run ( Matrix2DFloat A , Matrix2DFloat B , Matrix2DFloat C , final int size ) {
// Create a task-graph with multiple tasks. Each task points to an exising Java method
// that can be accelerated on a GPU/FPGA
TaskGraph taskGraph = new TaskGraph ( "myCompute" )
. transferToDevice ( DataTransferMode . FIRST_EXECUTION , A , B ) // Transfer data from host to device only in the first execution
. task ( "mxm" , Compute :: mxmLoop , A , B , C , size ) // Each task points to an existing Java method
. transferToHost ( DataTransferMode . EVERY_EXECUTION , C ); // Transfer data from device to host
// Create an immutable task-graph
ImmutableTaskGraph immutableTaskGraph = taskGraph . snaphot ();
// Create an execution plan from an immutable task-graph
try ( TornadoExecutionPlan executionPlan = new TornadoExecutionPlan ( immutableTaskGraph )) {
// Run the execution plan on the default device
TorandoExecutionResult executionResult = executionPlan . execute ();
} catch ( TornadoExecutionPlanException e ) {
// handle exception
// ...
}
}
}在Tornadovm中表達計算內核的另一種方法是通過內核API 。為此,Tornadovm揭露了KernelContext數據結構,在該數據結構中,應用程序可以直接訪問線程ID,在本地內存中分配內存(NVIDIA設備上的共享內存)和插入障礙。該模型類似於SYCL,ONEAPI,OPENCL和CUDA中的編程計算 - 內核。因此,此API更適合GPU/FPGA專家程序員,他們想要更多控制權或希望將現有的CUDA/OPENCL計算核對核內核移植到Tornadovm中。
以下代碼 - 刺顯示了使用內核 - 平行API:矩陣乘法示例:
public class Compute {
private static void mxmKernel ( KernelContext context , Matrix2DFloat A , Matrix2DFloat B , Matrix2DFloat C , final int size ) {
int idx = context . globalIdx
int jdx = context . globalIdy ;
float sum = 0 ;
for ( int k = 0 ; k < size ; k ++) {
sum += A . get ( idx , k ) * B . get ( k , jdx );
}
C . set ( idx , jdx , sum );
}
public void run ( Matrix2DFloat A , Matrix2DFloat B , Matrix2DFloat C , final int size ) {
// When using the kernel-parallel API, we need to create a Grid and a Worker
WorkerGrid workerGrid = new WorkerGrid2D ( size , size ); // Create a 2D Worker
GridScheduler gridScheduler = new GridScheduler ( "myCompute.mxm" , workerGrid ); // Attach the worker to the Grid
KernelContext context = new KernelContext (); // Create a context
workerGrid . setLocalWork ( 16 , 16 , 1 ); // Set the local-group size
TaskGraph taskGraph = new TaskGraph ( "myCompute" )
. transferToDevice ( DataTransferMode . FIRST_EXECUTION , A , B ) // Transfer data from host to device only in the first execution
. task ( "mxm" , Compute :: mxmKernel , context , A , B , C , size ) // Each task points to an existing Java method
. transferToHost ( DataTransferMode . EVERY_EXECUTION , C ); // Transfer data from device to host
// Create an immutable task-graph
ImmutableTaskGraph immutableTaskGraph = taskGraph . snapshot ();
// Create an execution plan from an immutable task-graph
try ( TornadoExecutionPlan executionPlan = new TornadoExecutionPlan ( immutableTaskGraph )) {
// Run the execution plan on the default device
// Execute the execution plan
TorandoExecutionResult executionResult = executionPlan
. withGridScheduler ( gridScheduler )
. execute ();
} catch ( TornadoExecutionPlanException e ) {
// handle exception
// ...
}
}
}此外,可以在同一任務圖對像中組合表達並行性的兩種模式(內核和循環並行化)。
動態重新配置是Tornadovm在設備之間執行實時任務遷移的能力,這意味著Tornadovm決定在哪裡執行代碼以提高性能(如果可能的話)。換句話說,如果龍捲風開關設備可以檢測到特定設備可以產生更好的性能(與另一種設備相比)。
通過任務遷移,Tornadovm的方法是僅使用C2或Graal-jit編制的代碼來檢測應用程序的執行速度快,否則將其保留在CPU上。因此,龍捲風可以看作是C2和Graal JIT編譯器的補充。這是因為沒有一個硬件可以最好地執行所有工作負載。 GPU非常擅長利用SIMD應用程序,FPGA非常擅長利用管道應用。如果您的應用程序遵循這些型號,Tornadovm可能會選擇異質硬件。否則,它將使用默認編譯器(C2或GRAAL)保留在CPU上。
要使用動態重新配置,您可以使用Tornadovm策略執行。例如:
// TornadoVM will execute the code in the best accelerator.
executionPlan . withDynamicReconfiguration ( Policy . PERFORMANCE , DRMode . PARALLEL )
. execute ();可以在此處找到有關如何啟用此功能的更多詳細信息和說明。
要使用Tornadovm,您需要兩個組件:
a)帶有API的Tornadovm jar文件。 API被許可為GPLV2,具有classPath異常。 b)Tornadovm的核心庫以及用於驅動程序代碼的.so庫(openCL,ptx和/或spirv/level零的文件)。
您可以通過在maven pom.xml文件中設置以下依賴性來導入龍捲風API:
< repositories >
< repository >
< id >universityOfManchester-graal</ id >
< url >https://raw.githubusercontent.com/beehive-lab/tornado/maven-tornadovm</ url >
</ repository >
</ repositories >
< dependencies >
< dependency >
< groupId >tornado</ groupId >
< artifactId >tornado-api</ artifactId >
< version >1.0.8</ version >
</ dependency >
< dependency >
< groupId >tornado</ groupId >
< artifactId >tornado-matrices</ artifactId >
< version >1.0.8</ version >
</ dependency >
</ dependencies >要運行Tornadovm,您需要安裝GRAALVM/OPENJDK的Tornadovm擴展程序,或使用我們的Docker Images運行。
在這裡,您可以找到描述Tornadovm的視頻,演示文稿,技術片段和人工製品,以及如何使用它。
如果您使用的是龍捲風> = 0.2 (其中包括動態重新配置,初始FPGA支持和CPU/GPU減少),請使用以下引用:
@inproceedings { Fumero:DARHH:VEE:2019 ,
author = { Fumero, Juan and Papadimitriou, Michail and Zakkak, Foivos S. and Xekalaki, Maria and Clarkson, James and Kotselidis, Christos } ,
title = { {Dynamic Application Reconfiguration on Heterogeneous Hardware.} } ,
booktitle = { Proceedings of the 15th ACM SIGPLAN/SIGOPS International Conference on Virtual Execution Environments } ,
series = { VEE '19 } ,
year = { 2019 } ,
doi = { 10.1145/3313808.3313819 } ,
publisher = { Association for Computing Machinery }
}如果您使用的是龍捲風0.1 (初始版本),請在工作中使用以下引用。
@inproceedings { Clarkson:2018:EHH:3237009.3237016 ,
author = { Clarkson, James and Fumero, Juan and Papadimitriou, Michail and Zakkak, Foivos S. and Xekalaki, Maria and Kotselidis, Christos and Luj'{a}n, Mikel } ,
title = { {Exploiting High-performance Heterogeneous Hardware for Java Programs Using Graal} } ,
booktitle = { Proceedings of the 15th International Conference on Managed Languages & Runtimes } ,
series = { ManLang '18 } ,
year = { 2018 } ,
isbn = { 978-1-4503-6424-9 } ,
location = { Linz, Austria } ,
pages = { 4:1--4:13 } ,
articleno = { 4 } ,
numpages = { 13 } ,
url = { http://doi.acm.org/10.1145/3237009.3237016 } ,
doi = { 10.1145/3237009.3237016 } ,
acmid = { 3237016 } ,
publisher = { ACM } ,
address = { New York, NY, USA } ,
keywords = { Java, graal, heterogeneous hardware, openCL, virtual machine } ,
}選定的出版物可以在這裡找到。
這項工作由英特爾公司部分資助。此外,它得到了以下歐盟和烏克里贈款的支持(最近的第一筆):
此外,龍捲風得到以下EPSRC贈款的支持:
我們歡迎合作!請在貢獻頁面中查看如何為該項目做出貢獻。
此外,您可以在GitHub討論頁面上打開新建議。
另外,您可以與我們共享Google文檔。
有關學術和行業合作,請在此處聯繫。
訪問我們的網站與團隊會面。
要使用Tornadovm,您可以將Tornadovm API鏈接到Apache 2下的應用程序。
每個Java Tornadovm模塊的許可如下:
| 模塊 | 執照 |
|---|---|
| 龍捲風 | |
| 龍捲風 | |
| 龍捲風組裝 | |
| 龍捲風司機 | |
| 龍捲風驅動器 - opencl-neaders | |
| 龍捲風 | |
| 龍捲風通知 | |
| 龍捲風工程 | |
| 龍捲風基準 | |
| 龍捲風 | |
| 龍捲風 | |