
Tornadovm เป็นปลั๊กอินสำหรับ OpenJDK และ GRAALVM ที่ช่วยให้โปรแกรมเมอร์สามารถเรียกใช้โปรแกรม Java โดยอัตโนมัติบนฮาร์ดแวร์ที่แตกต่างกัน Tornadovm ตั้งเป้าหมาย OpenCL, PTX และอุปกรณ์ที่เข้ากันได้กับ SPIR-V ซึ่งรวมถึงซีพียูหลายคอร์, GPU เฉพาะ (Intel, Nvidia, AMD), GPU แบบรวม (Intel HD กราฟิกและแขน Mali) และ FPGAS (Intel และ Xilinx)
Tornadovm มีสามแบ็กเอนด์ที่สร้าง OpenCl C, Nvidia Cuda PTX Assembly และ Binary 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 (ต้องใช้ไดรเวอร์ Zero ระดับ 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
หากคุณวางแผนที่จะใช้ Docker กับ Tornadovm บน GPU คุณสามารถปฏิบัติตามแนวทางเหล่านี้ได้
นอกจากนี้คุณยังสามารถเรียกใช้ Tornadovm บน CPU ของ Amazon AWS, GPU และ FPGAs ตามคำแนะนำที่นี่
Tornadovm กำลังถูกใช้เพื่อเร่งการเรียนรู้ของเครื่องและแอพพลิเคชั่นการเรียนรู้อย่างลึกซึ้งวิสัยทัศน์คอมพิวเตอร์การจำลองฟิสิกส์แอปพลิเคชันทางการเงินการถ่ายภาพการคำนวณและการประมวลผลสัญญาณ
กรณีการใช้งานที่โดดเด่น:
นอกจากนี้เรายังมีชุดตัวอย่างที่รวมถึง NBY, DFT, การคำนวณ KMEANS และการคำนวณเมทริกซ์
ข้อมูลเพิ่มเติม
Tornadovm แสดงให้เห็นถึงระดับงานของโปรแกรมเมอร์ระดับข้อมูลระดับข้อมูลและการขนานระดับไปป์ไลน์ผ่านอินเตอร์เฟสการเขียนโปรแกรมแอปพลิเคชันแสง (API) นอกจากนี้ Tornadovm ใช้คุณสมบัติแหล่งเดียวซึ่งรหัสที่จะเร่งความเร็วและรหัสโฮสต์สดในโปรแกรม Java เดียวกัน
compute-kernels ใน Tornadovm สามารถตั้งโปรแกรมได้โดยใช้สองวิธีที่แตกต่างกัน (APIs):
Kernels คำนวณถูกเขียนในรูปแบบลำดับ (งานที่ตั้งโปรแกรมไว้สำหรับการดำเนินการเธรดเดียว) ในการแสดงความเท่าเทียมกันพายุทอร์นาโดมแสดงสองคำอธิบายประกอบที่สามารถใช้ในลูปและพารามิเตอร์: a) @Parallel สำหรับการใส่คำอธิบายประกอบแบบขนานลูป; และ b) @Reduce สำหรับพารามิเตอร์คำอธิบายประกอบที่ใช้ในการลดลง
ตัวอย่างโค้ดต่อไปนี้แสดงตัวอย่างเต็มรูปแบบเพื่อเร่งการใช้เมทริกซ์-หลายครั้งโดยใช้ Tornadovm และ 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
// ...
}
}
} อีกวิธีหนึ่งในการแสดงการคำนวณ-เคอร์เนลในพายุทอร์นาโดมคือผ่าน เคอร์เนล API ในการทำเช่นนั้น Tornadovm จะเปิดเผยโครงสร้างข้อมูล KernelContext ซึ่งแอปพลิเคชันสามารถเข้าถึงเธรด -ID ได้โดยตรงจัดสรรหน่วยความจำในหน่วยความจำท้องถิ่น (หน่วยความจำที่ใช้ร่วมกันบนอุปกรณ์ NVIDIA) และแทรกอุปสรรค โมเดลนี้คล้ายกับการเขียนโปรแกรมการคำนวณ-เคอร์เนลใน Sycl, Oneapi, OpenCl และ Cuda ดังนั้น API นี้จึงเหมาะสำหรับโปรแกรมเมอร์ผู้เชี่ยวชาญด้าน GPU/FPGA ที่ต้องการควบคุมมากขึ้นหรือต้องการพอร์ตเคอร์เนลคำนวณ CUDA/OpenCL ที่มีอยู่ในพายุทอร์นาโด
โค้ด-สนิพเพ็ตต่อไปนี้แสดงตัวอย่างการคูณเมทริกซ์โดยใช้ 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 วิธีการสลับอุปกรณ์เท่านั้นหากตรวจพบแอปพลิเคชันสามารถดำเนินการได้เร็วกว่าการดำเนินการ CPU โดยใช้รหัสที่รวบรวมโดย C2 หรือ Graal-Jit มิฉะนั้นจะอยู่ใน CPU ดังนั้น Tornadovm สามารถมองเห็นได้ว่าเป็นส่วนประกอบของคอมไพเลอร์ C2 และ Graal JIT นี่เป็นเพราะไม่มีฮาร์ดแวร์เดียวที่จะเรียกใช้เวิร์กโหลดทั้งหมดได้ดีที่สุดอย่างมีประสิทธิภาพ GPU นั้นเก่งมากในการใช้ประโยชน์จากแอปพลิเคชัน SIMD และ FPGA นั้นเก่งมากในการใช้ประโยชน์จากแอพพลิเคชั่นไปป์ไลน์ หากแอปพลิเคชันของคุณทำตามโมเดลเหล่านั้น Tornadovm จะเลือกฮาร์ดแวร์ที่แตกต่างกัน มิฉะนั้นจะอยู่ใน CPU โดยใช้คอมไพเลอร์เริ่มต้น (C2 หรือ Graal)
ในการใช้การกำหนดค่าใหม่แบบไดนามิกคุณสามารถดำเนินการโดยใช้นโยบายพายุทอร์นาโด ตัวอย่างเช่น:
// TornadoVM will execute the code in the best accelerator.
executionPlan . withDynamicReconfiguration ( Policy . PERFORMANCE , DRMode . PARALLEL )
. execute ();รายละเอียดเพิ่มเติมและคำแนะนำเกี่ยวกับวิธีการเปิดใช้งานคุณสมบัตินี้สามารถพบได้ที่นี่
ในการใช้ Tornadovm คุณต้องมีสององค์ประกอบ:
A) ไฟล์ jar Tornadovm พร้อม API API ได้รับใบอนุญาตเป็น GPLV2 โดยมีข้อยกเว้น ClassPath b) ไลบรารีหลักของ Tornadovm พร้อมกับไลบรารีแบบไดนามิกสำหรับรหัสไดรเวอร์ (ไฟล์ .so สำหรับ OpenCL, PTX และ/หรือ SPIRV/Level Zero)
คุณสามารถนำเข้า Tornadovm API โดยการตั้งค่าการพึ่งพาต่อไปนี้ในไฟล์ 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 >ในการเรียกใช้ Tornadovm คุณต้องติดตั้งส่วนขยาย Tornadovm สำหรับ Graalvm/OpenJDK หรือเรียกใช้กับภาพนักเทียบท่าของเรา
ที่นี่คุณสามารถค้นหาวิดีโองานนำเสนอบทความด้านเทคโนโลยีและสิ่งประดิษฐ์ที่อธิบายถึงพายุทอร์นาโดมและวิธีการใช้งาน
หากคุณใช้ 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 } ,
}สิ่งพิมพ์ที่เลือกสามารถพบได้ที่นี่
งานนี้ได้รับทุนบางส่วนจาก Intel Corporation นอกจากนี้ยังได้รับการสนับสนุนจาก EU & UKRI Grants ต่อไปนี้ (ล่าสุดครั้งแรก):
นอกจากนี้ Tornadovm ยังได้รับการสนับสนุนจากทุน EPSRC ต่อไปนี้:
เรายินดีต้อนรับความร่วมมือ! โปรดดูวิธีการมีส่วนร่วมในโครงการในหน้าการบริจาค
นอกจากนี้คุณสามารถเปิดข้อเสนอใหม่ในหน้าการอภิปราย GitHub
หรือคุณสามารถแชร์เอกสาร Google กับเราได้
สำหรับความร่วมมือด้านวิชาการและอุตสาหกรรมกรุณาติดต่อที่นี่
เยี่ยมชมเว็บไซต์ของเราเพื่อพบกับทีม
ในการใช้ Tornadovm คุณสามารถเชื่อมโยง Tornadovm API กับแอปพลิเคชันของคุณซึ่งอยู่ภายใต้ Apache 2
แต่ละโมดูล Java Tornadovm ได้รับอนุญาตดังนี้:
| โมดูล | ใบอนุญาต |
|---|---|
| พายุทอร์นาโด-API | |
| พายุทอร์นาโด-รันเทม | |
| พายุทอร์นาโด | |
| ผู้ขับขี่พายุทอร์นาโด | |
| พายุทอร์นาโด-ไดร์เวอร์-หัวหน้า | |
| พายุทอร์นาโด | |
| การวิเคราะห์พายุทอร์นาโด | |
| พายุทอร์นาโด | |
| ดาราพายุทอร์นาโด | |
| พายุทอร์นาโด-ตัวอย่าง | |
| พายุทอร์นาโด-เมทริกซ์ | |