
Tornadovm adalah plug-in untuk OpenJDK dan GraAlvm yang memungkinkan programmer untuk secara otomatis menjalankan program Java pada perangkat keras yang heterogen. Tornadovm menargetkan perangkat kompatibel OpenCl, PTX dan Spir-V yang mencakup CPU multi-core, GPU khusus (Intel, Nvidia, AMD), GPU terintegrasi (Intel HD Graphics dan Arm Mali), dan FPGA (Intel dan Xilinx).
Tornadovm memiliki tiga backend yang menghasilkan OpenCl C, Nvidia cuda PTX Assembly, dan Spir-V Binary. Pengembang dapat memilih backends mana yang akan diinstal dan dijalankan.
Situs web : Tornadovm.org
Dokumentasi : https://Tornadovm.readthedocs.io/en/latest/
Untuk pengantar cepat, silakan baca FAQ berikut.
Rilis Terbaru: Tornadovm 1.0.8 - 30/09/2024: Lihat Changelog.
Di Linux dan MacOS, Tornadovm dapat diinstal secara otomatis dengan skrip instalasi. Misalnya:
$ ./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 directoryCatatan Pilih backend yang diinginkan:
opencl : Mengaktifkan backend opencl (membutuhkan driver opencl)ptx : Mengaktifkan backend PTX (membutuhkan driver NVIDIA CUDA)spirv : Memungkinkan backend spirv (membutuhkan pengemudi nol tingkat Intel)Contoh instalasi:
# 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,ptxAtau, tornadovm dapat dipasang secara manual dari sumber atau dengan menggunakan Docker.
Jika Anda berencana menggunakan Docker dengan Tornadovm di GPU, Anda juga dapat mengikuti pedoman ini.
Anda juga dapat menjalankan Tornadovm di Amazon AWS CPU, GPU, dan FPGA mengikuti instruksi di sini.
Tornadovm saat ini sedang digunakan untuk mempercepat pembelajaran mesin dan aplikasi pembelajaran yang mendalam, visi komputer, simulasi fisika, aplikasi keuangan, fotografi komputasi, dan pemrosesan sinyal.
Kasing penggunaan yang ditampilkan:
Kami juga memiliki serangkaian contoh yang mencakup perhitungan NBODY, DFT, KMEANS dan matriks.
Informasi tambahan
Tornadovm mengekspos ke tingkat tugas programmer, level data dan paralelisme tingkat pipa melalui interface pemrograman aplikasi ringan (API). Selain itu, Tornadovm menggunakan properti sumber tunggal, di mana kode yang akan dipercepat dan kode host hidup dalam program Java yang sama.
Hitung-Kernel di Tornadovm dapat diprogram menggunakan dua pendekatan berbeda (API):
Kernel Hitung ditulis dalam bentuk berurutan (tugas yang diprogram untuk eksekusi utas tunggal). Untuk mengekspresikan paralelisme, tornadovm memaparkan dua anotasi yang dapat digunakan dalam loop dan parameter: a) @Parallel untuk anotasi loop paralel; dan b) @Reduce untuk parameter anotasi yang digunakan dalam pengurangan.
Cuplikan kode berikut menunjukkan contoh lengkap untuk mempercepat multiplikasi matriks menggunakan tornadovm dan loop-paralel 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
// ...
}
}
} Cara lain untuk mengekspresikan komputasi-kernel di tornadovm adalah melalui API kernel . Untuk melakukannya, Tornadovm memaparkan struktur data KernelContext , di mana aplikasi dapat secara langsung mengakses thread-id, mengalokasikan memori dalam memori lokal (memori bersama pada perangkat NVIDIA), dan memasukkan hambatan. Model ini mirip dengan pemrograman komputasi-kernel di Sycl, OneAPI, Opencl dan CUDA. Oleh karena itu, API ini lebih cocok untuk programmer ahli GPU/FPGA yang menginginkan lebih banyak kontrol atau ingin port CUDA/OPENCL yang ada kernel komputasi ke tornadovm.
Kode-snippet berikut menunjukkan contoh multiplikasi matriks menggunakan API Kernel-Parallel:
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
// ...
}
}
}Selain itu, dua mode mengekspresikan paralelisme (kernel dan paralelisasi loop) dapat digabungkan dalam objek grafik tugas yang sama.
Konfigurasi ulang yang dinamis adalah kemampuan Tornadovm untuk melakukan migrasi tugas langsung antar perangkat, yang berarti bahwa Tornadovm memutuskan di mana untuk menjalankan kode untuk meningkatkan kinerja (jika memungkinkan). Dengan kata lain, Tornadovm beralih perangkat jika dapat mendeteksi bahwa perangkat tertentu dapat menghasilkan kinerja yang lebih baik (dibandingkan dengan yang lain).
Dengan migrasi tugas, pendekatan Tornadovm adalah hanya beralih perangkat jika mendeteksi aplikasi dapat dieksekusi lebih cepat daripada eksekusi CPU menggunakan kode yang dikumpulkan oleh C2 atau Graal-JIT, jika tidak ia akan tetap berada di CPU. Jadi Tornadovm dapat dilihat sebagai komplemen untuk kompiler C2 dan Graal Jit. Ini karena tidak ada perangkat keras tunggal untuk menjalankan semua beban kerja secara efisien. GPU sangat pandai mengeksploitasi aplikasi SIMD, dan FPGA sangat pandai mengeksploitasi aplikasi pipa. Jika aplikasi Anda mengikuti model -model tersebut, Tornadovm kemungkinan akan memilih perangkat keras yang heterogen. Kalau tidak, itu akan tetap di CPU menggunakan kompiler default (C2 atau Graal).
Untuk menggunakan konfigurasi ulang dinamis, Anda dapat mengeksekusi menggunakan kebijakan tornadovm. Misalnya:
// TornadoVM will execute the code in the best accelerator.
executionPlan . withDynamicReconfiguration ( Policy . PERFORMANCE , DRMode . PARALLEL )
. execute ();Rincian dan instruksi lebih lanjut tentang cara mengaktifkan fitur ini dapat ditemukan di sini.
Untuk menggunakan Tornadovm, Anda memerlukan dua komponen:
a) File jar Tornadovm dengan API. API dilisensikan sebagai GPLV2 dengan pengecualian ClassPath. b) Perpustakaan inti tornadovm bersama dengan pustaka dinamis untuk kode driver ( .so file untuk opencl, ptx dan/atau spirv/level nol).
Anda dapat mengimpor API Tornadovm dengan mengatur ini ketergantungan berikut dalam file Maven pom.xml :
< 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 >Untuk menjalankan Tornadovm, Anda harus menginstal ekstensi Tornadovm untuk GraAlvm/OpenJDK, atau dijalankan dengan gambar Docker kami.
Di sini Anda dapat menemukan video, presentasi, artikel teknologi, dan artefak yang menggambarkan Tornadovm, dan cara menggunakannya.
Jika Anda menggunakan tornadovm> = 0,2 (yang mencakup konfigurasi ulang dinamis, dukungan FPGA awal dan pengurangan CPU/GPU), silakan gunakan kutipan berikut:
@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 }
}Jika Anda menggunakan Tornado 0.1 (rilis awal), silakan gunakan kutipan berikut dalam pekerjaan Anda.
@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 } ,
}Publikasi yang dipilih dapat ditemukan di sini.
Pekerjaan ini sebagian didanai oleh Intel Corporation. Selain itu, telah didukung oleh hibah UE & UKRI berikut (yang paling baru):
Selanjutnya, Tornadovm telah didukung oleh hibah EPSRC berikut:
Kami menyambut kolaborasi! Silakan lihat cara berkontribusi pada proyek di halaman yang berkontribusi.
Selain itu, Anda dapat membuka proposal baru di halaman Diskusi GitHub.
Atau, Anda dapat berbagi dokumen Google dengan kami.
Untuk kolaborasi akademik & industri, silakan hubungi di sini.
Kunjungi situs web kami untuk bertemu tim.
Untuk menggunakan Tornadovm, Anda dapat menautkan API Tornadovm ke aplikasi Anda yang berada di bawah Apache 2.
Setiap modul Java Tornadovm dilisensikan sebagai berikut:
| Modul | Lisensi |
|---|---|
| Tornado-api | |
| Tornado-runtime | |
| Tornado-assembly | |
| Pengemudi tornado | |
| Tornado-drivers-opencl-headers | |
| Tornado-Scripts | |
| Tornado-anotasi | |
| Tornado-unittests | |
| Tornado-Benchmark | |
| Tornado-contoh | |
| Tornado-matrices | |