
TornadovM هو مكون إضافي لـ OpenJDK و GraalVM يتيح للمبرمجين تشغيل برامج Java تلقائيًا على أجهزة غير متجانسة. يستهدف TornadovM أجهزة OpenCl و PTX و SPIR-V والتي تشمل وحدات المعالجة المركزية متعددة النواة ، وحدات معالجة الرسومات المخصصة (Intel ، Nvidia ، AMD) ، وحدات معالجة الرسومات المتكاملة (Intel HD Graphics و ARM Mali) ، و FPGAs (Intel و Xilinx).
لدى Tornadovm ثلاثة مباريات خلفية تولد OpenCl C ، و Nvidia Cuda Ptx Assembly ، و SPIR-V Binary. يمكن للمطورين اختيار الخلفية للتثبيت والتشغيل.
الموقع الإلكتروني : 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 Level Zero)مثال على التثبيت:
# 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.
إذا كنت تخطط لاستخدام Docker مع TornadovM على وحدات معالجة الرسومات ، فيمكنك أيضًا اتباع هذه الإرشادات.
يمكنك أيضًا تشغيل Tornadovm على Amazon AWS CPU و GPU و FPGAs باتباع التعليمات هنا.
يتم استخدام TornadovM حاليًا لتسريع تطبيقات التعلم الآلي وتطبيقات التعلم العميق ورؤية الكمبيوتر ومحاكاة الفيزياء والتطبيقات المالية والتصوير الفوتوغرافي الحسابي ومعالجة الإشارات.
حالات الاستخدام المميزة:
لدينا أيضًا مجموعة من الأمثلة التي تتضمن حسابات NBODE و DFT و KMEANS وحسابات المصفوفة.
معلومات إضافية
يعرض TornadovM على مستوى المبرمج على مستوى المهمة ، ومستوى البيانات على مستوى البيانات ، على مستوى خط الأنابيب عبر واجهة برمجة تطبيق الضوء (API). بالإضافة إلى ذلك ، يستخدم TornadovM خاصية المصدر المفرد ، حيث يتم تسريع الرمز والرمز المضيف في نفس برنامج Java.
يمكن برمجة compute-kernels في TornadovM باستخدام نهجين مختلفين (APIs):
تتم كتابة نواة حساب في نموذج متسلسل (المهام مبرمجة لتنفيذ مؤشر ترابط واحد). للتعبير عن التوازي ، يعرض TornadovM اثنين من التعليقات التوضيحية التي يمكن استخدامها في الحلقات والمعلمات: أ) @Parallel للتعليق على الحلقات الموازية ؛ و B) @Reduce للتعليق المعلمات المستخدمة في التخفيضات.
يعرض مقتطف الكود التالي مثالًا كاملاً لتسريع matrix-mursiplication باستخدام 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
// ...
}
}
} هناك طريقة أخرى للتعبير عن compute-kernels في TornadovM وهي عبر Quernel API . للقيام بذلك ، يعرض TornadovM بنية بيانات KernelContext ، حيث يمكن للتطبيق الوصول مباشرة إلى معرف مؤشر الترابط ، وتخصيص الذاكرة في الذاكرة المحلية (الذاكرة المشتركة على أجهزة NVIDIA) ، وإدراج حواجز. يشبه هذا النموذج برمجة kernels في Sycl و OneApi و OpenCl و CUDA. لذلك ، فإن واجهة برمجة التطبيقات هذه أكثر ملاءمة لمبرمجي خبراء GPU/FPGA الذين يريدون المزيد من السيطرة أو يرغبون في نقل حباتات CUDA/OpenCL الحالية إلى TornadovM.
يعرض الكود التالي مثال مضاعفة المصفوفة باستخدام واجهة برمجة التطبيقات المتوازية kernel:
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
// ...
}
}
}بالإضافة إلى ذلك ، يمكن الجمع بين وضعي التعبير التوازي (kernel وموازاة الحلقة) في نفس كائن الرسم البياني المهمة.
إعادة التكوين الديناميكي هي قدرة TornadovM على إجراء ترحيل المهمة المباشرة بين الأجهزة ، مما يعني أن TornadovM تقرر مكان تنفيذ الكود لزيادة الأداء (إن أمكن). بمعنى آخر ، يقوم TornadovM بتبديل الأجهزة إذا كان بإمكانه اكتشاف أن جهازًا معينًا يمكن أن يحقق أداءً أفضل (مقارنةً بآخر).
من خلال هجرة المهمة ، يتمثل نهج TornadovM في تبديل الجهاز فقط إذا اكتشف تطبيق ما أسرع من تنفيذ وحدة المعالجة المركزية باستخدام الكود الذي تم تجميعه بواسطة C2 أو Graal-JIT ، وإلا فإنه سيبقى على وحدة المعالجة المركزية. لذلك يمكن اعتبار Tornadovm مكملاً لمرسلات C2 و Graal JIT. هذا لأنه لا يوجد جهاز واحد لتنفيذ جميع أعباء العمل بشكل أفضل. تعد وحدات معالجة الرسومات جيدة جدًا في استغلال تطبيقات SIMD ، و FPGAs جيدة جدًا في استغلال تطبيقات خطوط الأنابيب. إذا اتبعت تطبيقاتك هذه النماذج ، فمن المحتمل أن تختار TornadovM أجهزة غير متجانسة. خلاف ذلك ، سيبقى على وحدة المعالجة المركزية باستخدام المترجمين الافتراضيين (C2 أو Graal).
لاستخدام إعادة التكوين الديناميكي ، يمكنك التنفيذ باستخدام سياسات TornadovM. على سبيل المثال:
// TornadoVM will execute the code in the best accelerator.
executionPlan . withDynamicReconfiguration ( Policy . PERFORMANCE , DRMode . PARALLEL )
. execute ();يمكن العثور على مزيد من التفاصيل والتعليمات حول كيفية تمكين هذه الميزة هنا.
لاستخدام Tornadovm ، تحتاج إلى مكونين:
أ) ملف jar Tornadovm مع API. تم ترخيص API كـ GPLV2 مع استثناء ClassPath. ب) المكتبات الأساسية لـ TornadovM جنبًا إلى جنب مع المكتبة الديناميكية لرمز برنامج التشغيل (ملفات. .so ملفات OpenCl و PTX و/أو spiRV/Level Zero).
يمكنك استيراد واجهة برمجة تطبيقات TornadovM عن طريق تعيين هذا التبعية التالية في ملف 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 ، أو تشغيل صور Docker الخاصة بنا.
هنا يمكنك العثور على مقاطع فيديو وعروض تقديمية وجزيئات تقنية ومصنوعات ثنائية تصف TornadovM ، وكيفية استخدامها.
إذا كنت تستخدم Tornadovm> = 0.2 (والتي تتضمن إعادة التكوين الديناميكي ، ودعم FPGA الأولي وتخفيضات وحدة المعالجة المركزية/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. بالإضافة إلى ذلك ، تم دعمه من خلال منح الاتحاد الأوروبي والأوكرى التالية (الأحدث أولاً):
علاوة على ذلك ، تم دعم TornadovM من خلال منح EPSRC التالية:
نرحب بالتعاون! يرجى الاطلاع على كيفية المساهمة في المشروع في الصفحة المساهمة.
بالإضافة إلى ذلك ، يمكنك فتح مقترحات جديدة على صفحة مناقشات GitHub.
بدلاً من ذلك ، يمكنك مشاركة مستند Google معنا.
للتعاون الأكاديمي والصناعة ، يرجى الاتصال هنا.
تفضل بزيارة موقعنا لمقابلة الفريق.
لاستخدام TornadovM ، يمكنك ربط واجهة برمجة تطبيقات TornadovM بالتطبيق الخاص بك تحت Apache 2.
كل وحدة Java Tornadovm مرخصة على النحو التالي:
| الوحدة النمطية | رخصة |
|---|---|
| تورنادو أبي | |
| تورنادو-وقت | |
| تجميع الإعصار | |
| سائقي الإعصار | |
| تورنادو-سائقي السائقين | |
| تورنادو سكني | |
| إعصار | |
| تورنادو-أونتيست | |
| علامات تورنادو | |
| أمثلة الإعصار | |
| تورنادو ماتريكس | |