
Tornadovmは、OpenJDKとGraalvmのプラグインであり、プログラマーが異種ハードウェアでJavaプログラムを自動的に実行できるようにします。 Tornadovmは、マルチコアCPU、専用GPU(Intel、Nvidia、AMD)、統合GPU(Intel HDグラフィックおよびアームマリ)、およびFPGA(IntelおよびXilinx)を含むOpenCL、PTX、およびSPIR-V互換性のあるデバイスをターゲットにします。
Tornadovmには、OpenCL C、Nvidia Cuda PTXアセンブリ、およびSPIR-Vバイナリを生成する3つのバックエンドがあります。開発者は、インストールして実行するバックエンドを選択できます。
ウェブサイト:Tornadovm.org
ドキュメント:https://tornadovm.readthedocs.io/en/latest/
簡単な紹介については、次のFAQをお読みください。
最新リリース: 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バックエンドを有効にします(インテルレベルゼロドライバーが必要です)インストールの例:
# 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または、Tornadovmは、ソースから手動で、またはDockerを使用して手動でインストールできます。
GPUでTornadovmを使用してDockerを使用することを計画している場合は、これらのガイドラインに従うこともできます。
また、ここの指示に従って、Amazon AWS CPU、GPU、およびFPGAでTornadovmを実行することもできます。
Tornadovmは現在、機械学習および深い学習アプリケーション、コンピュータービジョン、物理シミュレーション、財務アプリケーション、計算写真、および信号処理を加速するために使用されています。
特徴のユースケース:
また、NBODY、DFT、KMEANS計算、マトリックス計算を含む一連の例もあります。
追加情報
Tornadovmは、ライトアプリケーションプログラミングインターフェイス(API)を介して、プログラマータスクレベル、データレベル、およびパイプラインレベルの並列性にさらされます。さらに、Tornadovmはシングルソースプロパティを使用します。このプロパティでは、コードが加速するコードを使用し、ホストコードは同じJavaプログラムに住んでいます。
Tornadovmの計算型は、2つの異なるアプローチ(API)を使用してプログラムできます。
計算カーネルは、シーケンシャル形式(単一のスレッド実行用にプログラムされたタスク)で記述されます。並列性を表現するために、Tornadovmはループとパラメーターで使用できる2つの注釈を公開します。a) @Parallelには、平行ループを注釈付けします。 b)削減で使用されるパラメーターの注釈の@Reduce 。
次のコードスニペットには、TornadovmとLoop-Parallel 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は、より多くのコントロールを望んでいるか、既存のCUDA/OPENCLコンピューティングカーネルをTornadovmに移植したいGPU/FPGAエキスパートプログラマーにより適しています。
次のコードスニッペットは、カーネル平行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
// ...
}
}
}さらに、平行性を発現する2つのモード(カーネルとループの並列化)は、同じタスクグラフオブジェクトに組み合わせることができます。
動的再構成とは、トルネドフがデバイス間でライブタスク移行を実行する能力です。つまり、トルナドフムはパフォーマンスを向上させるためにコードを実行する場所を決定します(可能な場合)。言い換えれば、Tornadovmは、特定のデバイスがより良いパフォーマンスを生成できることを検出できる場合、デバイスを切り替えます(別のパフォーマンスと比較して)。
タスク移行を行うと、Tornadovmのアプローチは、C2またはGraal-JITがコンパイルしたコードを使用してCPU実行よりも速くアプリケーションを検出できる場合にのみデバイスを切り替えることです。そうでなければ、CPUにとどまります。したがって、Tornadovmは、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を使用するには、2つのコンポーネントが必要です。
a)APIを備えたTornadovm jarファイル。 APIは、ClassPathの例外を備えたGPLV2としてライセンスされています。 b)Tornadovmのコアライブラリと、ドライバーコードの動的ライブラリ(OpenCL、PTX、および/またはSPIRV/レベルゼロの.soファイル)。
Maven pom.xmlファイルで次の依存関係を設定することにより、Tornadovm 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画像で実行する必要があります。
ここでは、Tornadovmを説明するビデオ、プレゼンテーション、ハイテクアーティクル、アーティファクトを見つけることができます。
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 }
}Tornado 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 } ,
}選択した出版物はここにあります。
この作業は、Intel Corporationによって部分的に資金提供されています。さらに、次のEU&UKRI助成金によってサポートされています(最新の最初):
さらに、Tornadovmは次のEPSRC助成金によってサポートされています。
コラボレーションを歓迎します!プロジェクトへの寄付方法を貢献ページでご紹介してください。
さらに、GitHubディスカッションページで新しい提案を開くことができます。
または、Googleドキュメントを私たちと共有することもできます。
アカデミックおよび業界のコラボレーションについては、こちらにお問い合わせください。
チームに会うために当社のウェブサイトにアクセスしてください。
Tornadovmを使用するには、Tornadovm APIをApache 2の下にあるアプリケーションにリンクできます。
各Java Tornadovmモジュールは、次のようにライセンスされています。
| モジュール | ライセンス |
|---|---|
| 竜巻-API | |
| 竜巻を走る | |
| 竜巻アセンブリ | |
| 竜巻ドライバー | |
| Tornado-drivers-opencl-headers | |
| 竜巻スクリプト | |
| 竜巻解釈 | |
| Tornado-Unittests | |
| 竜巻ベンチマーク | |
| 竜巻診断 | |
| 竜巻マトリック | |