
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 | |
| 龙卷风 | |
| 龙卷风通知 | |
| 龙卷风工程 | |
| 龙卷风基准 | |
| 龙卷风 | |
| 龙卷风 | |