
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. Разработчики могут выбрать, какие бэкэнды для установки и запуска.
Веб -сайт : 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 Zero Drivers 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В качестве альтернативы, Tornadovm может быть установлен либо вручную из источника, либо с помощью Docker.
Если вы планируете использовать Docker с Tornadovm на графических процессорах, вы также можете следовать этим рекомендациям.
Вы также можете запустить Tornadovm на процессорах Amazon AWS, графических процессоров и FPGA, следуя инструкциям здесь.
Tornadovm в настоящее время используется для ускорения машинного обучения и глубокого обучения, компьютерного зрения, физического моделирования, финансовых приложений, вычислительной фотографии и обработки сигналов.
Избранные варианты использования:
У нас также есть набор примеров, которые включают в себя nbody, dft, вычисления Kmeans и вычисления матрицы.
Дополнительная информация
Tornadovm подвергает параллелизму на уровне задачи, уровне данных и уровне трубопровода через легкий интерфейс программирования приложения (API). Кроме того, Tornadovm использует свойство с одним источником, в котором код будет ускорен и код хоста вживую в той же программе Java.
Compute-kernels в торнадовме можно запрограммировать с использованием двух разных подходов (API):
Вычислительные ядра записаны в последовательной форме (задачи, запрограммированные для выполнения одного потока). Чтобы выразить параллелизм, Tornadovm выявляет две аннотации, которые можно использовать в петлях и параметрах: a) @Parallel для аннотирования параллельных петлей; и б) @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 , в которой приложение может напрямую получить доступ к идентификатору потока, распределять память в локальной памяти (общая память на устройствах NVIDIA) и вставить барьеры. Эта модель аналогична программированию Compute-Kernels в Sycl, Oneapi, OpenCl и CUDA. Следовательно, этот API более подходит для экспертных программистов GPU/FPGA, которые хотят большего контроля или хотят переносить существующие ядра CUDA/OpenCL в торнадов.
В следующем кодовом снепте показан пример умножения матрицы с использованием API-параллельного 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, в противном случае он останется на процессоре. Таким образом, торнадовм можно рассматривать как дополнение к компиляторам C2 и Graal JIT. Это потому, что нет единого оборудования, чтобы лучше всего выполнять все рабочие нагрузки. GPU очень хороши в использовании приложений SIMD, а FPGA очень хороши в использовании приложений трубопровода. Если ваши приложения следуют этим моделям, Tornadovm, вероятно, выберет гетерогенное оборудование. В противном случае он останется на процессоре, используя компиляторы по умолчанию (C2 или Graal).
Чтобы использовать динамическую реконфигурацию, вы можете выполнить, используя политику Tornadovm. Например:
// TornadoVM will execute the code in the best accelerator.
executionPlan . withDynamicReconfiguration ( Policy . PERFORMANCE , DRMode . PARALLEL )
. execute ();Более подробную информацию и инструкции о том, как включить эту функцию, можно найти здесь.
Чтобы использовать торнадов, вам нужно два компонента:
а) файл jar Tornadovm с API. API лицензирован как GPLV2 за исключением ClassPath. б) Основные библиотеки Торнадовма вместе с динамической библиотекой для кода драйвера ( .so fore для opencl, ptx и/или spirv/level Zero).
Вы можете импортировать API 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> = 0,2 (которая включает в себя динамическую реконфигурацию, начальную поддержку FPGA и сокращение процессора/графического процессора), используйте следующую цитату:
@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, вы можете связать API Tornadovm с вашим приложением, которое находится под Apache 2.
Каждый модуль Java Tornadovm лицензирован следующим образом:
| Модуль | Лицензия |
|---|---|
| Торнадо-Апи | |
| Торнадо-вывод | |
| Торнадо-сборная | |
| Торнадо-драйверы | |
| Торнадо-водители-версии-заголовки | |
| Торнадо-Скрипты | |
| Торнадо-аннотация | |
| Торнадо-единицы | |
| Торнадо-бочерки | |
| Торнадо-допросы | |
| Торнадо-матрицы | |