{"id":15108561,"url":"https://github.com/beehive-lab/tornadovm","last_synced_at":"2026-10-19T12:41:06.237Z","repository":{"id":41319290,"uuid":"147803317","full_name":"beehive-lab/TornadoVM","owner":"beehive-lab","description":"Write Java. Run on GPUs. Fast.","archived":false,"fork":false,"pushed_at":"2026-10-15T21:49:16.000Z","size":176882,"stargazers_count":1528,"open_issues_count":106,"forks_count":148,"subscribers_count":35,"default_branch":"master","last_synced_at":"2026-10-17T15:17:32.353Z","etag":null,"topics":["ai","cuda","cuda-programming","gpu-acceleration","gpu-computing","gpus","java","jllm","levelzero","multi-core","nvidia","opencl","parallel-computing","parallel-programming"],"latest_commit_sha":null,"homepage":"https://www.tornadovm.org","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/beehive-lab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE_APACHE2","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"claude":null,"gemini":null,"cursor":null,"copilot":null,"dco":null,"cla":null,"disclosure":null}},"created_at":"2018-09-07T09:37:44.000Z","updated_at":"2026-10-15T21:49:21.000Z","dependencies_parsed_at":"2026-08-14T15:17:56.332Z","dependency_job_id":null,"html_url":"https://github.com/beehive-lab/TornadoVM","commit_stats":{"total_commits":7414,"total_committers":32,"mean_commits":231.6875,"dds":0.5292689506339359,"last_synced_commit":"4a144f15ca615ea0638c4633fd0f1a39cb0c8f9a"},"previous_names":[],"tags_count":47,"template":false,"template_full_name":null,"purl":"pkg:github/beehive-lab/TornadoVM","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beehive-lab%2FTornadoVM","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beehive-lab%2FTornadoVM/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beehive-lab%2FTornadoVM/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beehive-lab%2FTornadoVM/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/beehive-lab","download_url":"https://codeload.github.com/beehive-lab/TornadoVM/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beehive-lab%2FTornadoVM/sbom","scorecard":{"id":230154,"data":{"date":"2025-08-11","repo":{"name":"github.com/beehive-lab/TornadoVM","commit":"6e29a5be7d5e8a70dc780ad9ec5b140a0a09c9c6"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":6.5,"checks":[{"name":"Code-Review","score":10,"reason":"all changesets reviewed","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":10,"reason":"30 commit(s) and 5 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE_APACHE2:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE_APACHE2:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T04:42:24.234Z","repository_id":41319290,"created_at":"2025-08-17T04:42:24.234Z","updated_at":"2025-08-17T04:42:24.234Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":344872684,"owners_count":38334966,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-10-03T21:59:58.778Z","status":"online","status_checked_at":"2026-10-17T02:00:06.547Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","cuda","cuda-programming","gpu-acceleration","gpu-computing","gpus","java","jllm","levelzero","multi-core","nvidia","opencl","parallel-computing","parallel-programming"],"created_at":"2024-09-25T22:04:03.967Z","updated_at":"2026-10-19T12:41:06.231Z","avatar_url":"https://github.com/beehive-lab.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg src=\"etc/tornadovm-logo.png\" alt=\"TornadoVM logo\" align=\"left\" width=\"350\"\u003e\n\n\n--- \n\n## Write Java. Run on GPUs. Fast.\n\nTornadoVM is a GPU programming framework for Java that works with JDK 21+ (currently JDK 21-27). It JIT-compiles Java bytecode into **NVIDIA CUDA, OpenCL C, and Apple Metal (MSL)** at runtime, so your existing Java code runs on **NVIDIA GPUs (via CUDA)**, AMD, Intel, and Apple Silicon GPUs, integrated GPUs, and multi-core CPUs. \n\nOn NVIDIA hardware it goes further: beyond generating CUDA, TornadoVM now calls straight into the **NVIDIA library ecosystem (cuBLAS, cuFFT, cuDNN, cuDF) and exposes Tensor Core `mma.sync` instructions from pure Java**. No CUDA C. No JNI bindings to maintain. No native toolchain in your application. In addition, it has support for Tile Programming [cuTile](https://developer.nvidia.com/cuda/tile) via its **TileContext API**.\n\n[![Build \u0026 Test](https://github.com/beehive-lab/TornadoVM/actions/workflows/build-test.yml/badge.svg)](https://github.com/beehive-lab/TornadoVM/actions/workflows/build-test.yml)\n[![Tornado API](https://img.shields.io/maven-central/v/io.github.beehive-lab/tornado-api?logo=apache-maven\u0026color=blue\u0026label=Tornado%20API)](https://central.sonatype.com/artifact/io.github.beehive-lab/tornado-api)\n[![Install with SDKMAN!](https://img.shields.io/badge/Install%20with-SDKMAN!-2c7a7b?logo=sdkman\u0026logoColor=white)](https://sdkman.io/sdks/tornadovm/)\n[![Docs](https://img.shields.io/badge/docs-readthedocs-blue)](https://tornadovm.readthedocs.io/en/latest/)\n[![Slack](https://img.shields.io/badge/chat-Slack-4A154B?logo=slack)](https://join.slack.com/t/tornadovmcommunity/shared_invite/zt-3ai2wyqva-bKz~cQRFlaJ~ZnPrbkwIEw)\n\n**Latest release:** TornadoVM 7.3.1 (JDK 21 - JDK 27) — native **NVIDIA library integration** (cuBLAS / cuFFT / cuDNN) and Tensor Core intrinsics, plus a native **Apple Metal backend** for Apple Silicon. [Changelog](https://tornadovm.readthedocs.io/en/latest/CHANGELOG.html) · [Website](https://www.tornadovm.org) · [Documentation](https://tornadovm.readthedocs.io/en/latest/)\n\n\n---\n\n## This is the whole programming model\n\nTornadoVM gives you three Java APIs for writing GPU kernels, from the least to the most explicit about how work maps onto the hardware. All three build the same `TaskGraph`, run through the same `TornadoExecutionPlan`, and can be mixed in a single graph. Here's one computation, dense matrix multiplication, `C = A × B`  written all three ways:\n\n\u003ctable\u003e\n\u003ctr\u003e\n\u003cth width=\"50%\"\u003eLoop Parallel API (\u003ccode\u003e@Parallel\u003c/code\u003e)\u003c/th\u003e\n\u003cth width=\"50%\"\u003eKernelContext API\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd valign=\"top\"\u003e\n\n```java\nvoid matmul(Matrix2DFloat A,\n     Matrix2DFloat B,\n     Matrix2DFloat C, int size) {\n  for (@Parallel int i=0; i\u003csize; i++) {\n    for (@Parallel int j=0; j\u003csize; j++) {\n      float sum = 0f;\n      for (int k=0; k\u003csize; k++)\n        sum += A.get(i,k)*B.get(k,j);\n      C.set(i, j, sum);\n    }\n  }\n}\n\n// TornadoVM infers the thread\n// mapping from the @Parallel loops.\n```\n\n\u003c/td\u003e\n\u003ctd valign=\"top\"\u003e\n\n```java\nvoid matmul(KernelContext ctx,\n     FloatArray A, FloatArray B,\n     FloatArray C, int size) {\n  int row = ctx.globalIdx;\n  int col = ctx.globalIdy;\n  float sum = 0f;\n  for (int k=0; k\u003csize; k++)\n    sum += A.get(k*size+row)\n         * B.get(col*size+k);\n  C.set(col*size+row, sum);\n}\n\n// You name the thread; TornadoVM\n// still owns memory + dispatch.\n```\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003cth colspan=\"2\"\u003eTileContext API (CuTile) 🆕 — CUDA backend only\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd colspan=\"2\"\u003e\n\n```java\nvoid matmul(TileContext tc, HalfFloatArray A, HalfFloatArray B, FloatArray C,\n            int m, int n, int k) {\n  PartitionView aView = tc.partition(tc.view(A, m, k), TILE, TILE);\n  PartitionView bView = tc.partition(tc.view(B, k, n), TILE, TILE);\n  PartitionView cView = tc.partition(tc.view(C, m, n), TILE, TILE);\n\n  Tile acc = tc.zeros(DType.F32, TILE, TILE);\n  for (int step = 0; step \u003c k / TILE; step++) {\n    acc = tc.mma(aView.load(tc.bidX(), step), bView.load(step, tc.bidY()), acc);\n  }\n  cView.store(acc, tc.bidX(), tc.bidY());\n}\n\n// No thread index, no shared memory, no barrier, no instruction shape —\n// the tile compiler picks them.\n```\n\n\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/table\u003e\n\nPick the one that matches how much control you need: `@Parallel` when TornadoVM should infer the thread mapping for you, `KernelContext` when you want CUDA/OpenCL/SYCL-style explicit thread indexing, and `TileContext` when you'd rather program in **tiles** than threads and let the tile compiler pick the tensor-core instructions. Each is covered in depth below. [Programming guide →](https://tornadovm.readthedocs.io/en/latest/programming.html)\n\n---\n\n## Loop Parallel API (`@Parallel`)\n\nThe simplest of the three models. You just annotate the parallel loops with `@Parallel` and TornadoVM infers the whole launch configuration (global bounds, local work size) for you. Because the annotation is the only GPU-specific part, the same method also runs unmodified on the plain sequential JVM path, which makes it the easiest style to write and debug first.\n\nFull runnable example: [MatrixMultiplication2D.java](tornado-examples/src/main/java/uk/ac/manchester/tornado/examples/compute/MatrixMultiplication2D.java). [Programming guide →](https://tornadovm.readthedocs.io/en/latest/programming.html#loop-parallel-api)\n\n---\n\n## KernelContext API\n\nWrite the kernel in Java with the same thread-indexing model you'd use in CUDA: global/local thread IDs, local memory, and barriers, with identical semantics across CUDA, OpenCL, and SYCL. TornadoVM still JIT-compiles the bytecode to a GPU kernel at runtime and manages all host↔device data transfers for you; on NVIDIA GPUs that kernel is emitted as **CUDA PTX** and compiled through NVRTC to a native cubin.\n\n`KernelContext` gives you the full GPU programming model while TornadoVM handles memory management and runs the *identical* code across all four backends. Don't need that control? Drop `KernelContext` and use the Loop Parallel API above instead — both styles can be combined in the same `TaskGraph`. Full runnable example: [MatrixMultiplication2DV1.java](tornado-examples/src/main/java/uk/ac/manchester/tornado/examples/kernelcontext/compute/MatrixMultiplication2DV1.java). [Programming guide →](https://tornadovm.readthedocs.io/en/latest/programming.html#kernel-context-api)\n\n---\n\n\u003ca id=\"tilecontext-api-cutile\"\u003e\u003c/a\u003e\n## TileContext API (CuTile) 🆕\n\nA task whose kernel takes a **`TileContext`** is compiled through **NVIDIA CUDA Tile** (`nvcc -tilecubin --tile-only`) instead of the SIMT path. You write what **one tile block** does; the tile compiler decides how many threads back it, which tensor-core instruction to issue, and how tiles move through shared memory. **Nothing in the API names a thread, a warp or a fragment.**\n\n```java\nWorkerGrid2D worker = new WorkerGrid2D(n / TILE, n / TILE);   // TILE BLOCKS, not threads\n```\n\n- **It composes with everything else.** A `@Parallel` kernel, a `KernelContext` kernel, a `TileContext` kernel and a native cuBLAS call sit in one `TaskGraph`, share device buffers on one stream, and are captured into **a single CUDA Graph** replayed with one launch — see [`TestTileChaining`](tornado-unittests/src/main/java/uk/ac/manchester/tornado/unittests/tile/TestTileChaining.java).\n- **It is still ordinary Java.** Every `TileContext` operation has a JVM implementation, so the same method runs and debugs on the CPU.\n- **Tile shapes are compile-time constants; extents are not.** The shape specialises the kernel, the problem size does not.\n\n[Tile API guide →](docs/source/tile-api.rst) · [runnable examples](tornado-examples/src/main/java/uk/ac/manchester/tornado/examples/tile) (matmul three ways, softmax, attention, quantized projection)\n\n---\n\n## 🟩 The NVIDIA ecosystem, native to Java\n\nOn NVIDIA hardware, TornadoVM is an open-source on-ramp to the whole CUDA software stack, callable from the same `TaskGraph` you already use. Generated kernels and native library calls **share TornadoVM-managed device buffers on one CUDA stream**, so a JIT-compiled kernel can feed a cuBLAS call and consume its output with no extra copies and no host synchronization.\n\n| Capability | What it gives Java developers |\n|---|---|\n| **CUDA backend** | Java bytecode → Graal IR → **CUDA PTX → NVRTC → cubin**, JIT-compiled and specialized to your data sizes and GPU at runtime. |\n| **cuBLAS / cuBLASLt** library tasks | SGEMV, SGEMM, strided-batched, TF32 and FP16 GemmEx on Tensor Cores, and cuBLASLt with plan caching and fused `BIAS` / `GELU_BIAS` epilogues — one library task replaces a GEMM plus a separate activation kernel. |\n| **cuFFT** library tasks | C2C, R2C / C2R, and Z2Z transforms (1D and 2D) with capture-safe plan caching; FFT-filter pipelines mix with JIT kernels in one graph. |\n| **cuDNN** library tasks | Deep-learning primitives through the cuDNN graph API, including fused scaled-dot-product (flash) attention via cudnn-frontend. |\n| **cuDF** library tasks | RAPIDS relational primitives — multi-key ordering, grouped `SUM`/`MIN`/`MAX`/`MEAN`/`COUNT` over several columns, whole-column reductions, inclusive scan, inner join and stream compaction — the cross-row operations no `@Parallel` loop expresses. A generated projection can feed a cuDF group-by in one graph, with the intermediate never leaving the device. |\n| **Tensor Core MMA intrinsics** | `mma.sync` exposed through `KernelContext` (`mmaLoadA/B`, `mma`, `mmaStore`) — FP16 (`m16n8k16` → FP32) and INT8 (`m16n8k32` → INT32), with swizzled shared-memory staging. Not a binding: real CUDA generated from Java. |\n| **CUDA Graphs** | `executionPlan.withCUDAGraph()` records kernels, library calls, and transfers into a captured graph and replays them with a single `cuGraphLaunch`. |\n| **CUDA Tile** (`TileContext`) 🆕 | A second compilation path: kernels written over *tiles* go through `nvcc -tilecubin`, and the tile compiler picks the threads, the tensor-core instruction, and the shared-memory staging. [Details](#tilecontext-api-cutile). |\n\nMixing your own kernels with NVIDIA's tuned libraries looks like this:\n\n```java\nTaskGraph tg = new TaskGraph(\"hybrid\")\n    .transferToDevice(DataTransferMode.EVERY_EXECUTION, matrix, vector)\n    .task(\"preprocess\", MyKernels::preprocess, matrix)              // JIT-compiled Java kernel\n    .libraryTask(\"gemv\", CuBlas::cublasSgemv,                       // native cuBLAS call\n            CUBLAS_OP_T, m, n, alpha, matrix, lda, vector, incx, beta, output, incy)\n    .task(\"postprocess\", MyKernels::activate, output)              // JIT-compiled Java kernel\n    .transferToHost(DataTransferMode.EVERY_EXECUTION, output);\n\ntry (TornadoExecutionPlan plan = new TornadoExecutionPlan(tg.snapshot())) {\n    plan.withCUDAGraph().execute();   // captured once, replayed each iteration\n}\n```\n\nLibrary bindings are discovered via Java `ServiceLoader`, bind the calls through `java.lang.foreign` (a JNI module only if the library genuinely needs compiled C/C++), and any native library joins the graph with no core runtime changes. TornadoVM is a member of the **NVIDIA Inception Program** and has presented this work at **NVIDIA GTC**. [Hybrid API guide →](https://tornadovm.readthedocs.io/en/latest/)\n\n\n---\n\n## What people build with it\n\n| Project | What it shows |\n|---|---|\n| 🦙 [**jitllm**](https://github.com/beehive-lab/jitllm) | LLM inference (Llama 3, Qwen 3, Mistral, Phi-3, Granite, DeepSeek distills) in pure Java — **117 tok/s on an RTX 5090**, official GPU engine for [LangChain4j](https://docs.langchain4j.dev/integrations/language-models/gpullama3-java) and [Quarkus](https://docs.quarkiverse.io/quarkus-langchain4j/dev/gpullama3-chat-model.html) |\n| 🔆 [**TornadoVM-Ray-Tracer**](https://github.com/Vinhixus/TornadoVM-Ray-Tracer) | Real-time ray tracing in Java, interactive frame rates on consumer GPUs |\n| 📷 [**kfusion-tornadovm**](https://github.com/beehive-lab/kfusion-tornadovm) | KinectFusion 3D reconstruction — a full computer-vision pipeline on integrated and discrete GPUs |\n| 📷 Gaia Mission (ESA) | High-performance algorithms for space exploration at the European Space Agency use TornadoVM |\n\n\nTornadoVM is used to accelerate machine learning and deep learning, computer vision, physics simulations, financial applications, computational photography, and signal processing. Building something with TornadoVM? [Tell us](https://github.com/beehive-lab/TornadoVM/discussions) — we feature community projects.\n\n\u003c!-- TODO: add a \"Used in production by\" line once 2–3 adopters agree to be named --\u003e\n\n---\n\n## ⚡ Quick start\n\n### Prerequisites\n\n- min **JDK 21** — `JAVA_HOME` must point to it\n- GCC/G++ ≥ 13, plus the driver for your target (OpenCL runtime, CUDA Toolkit, or macOS for Metal)\n- For the NVIDIA library tasks (cuBLAS / cuFFT / cuDNN): the **CUDA Toolkit** with the corresponding libraries; for cuDF, RAPIDS libcudf (see `tornado-cudf/README.md`); on systems with multiple toolkits, `/usr/local/cuda` (or `$CUDA_PATH`) is preferred\n\n### Install via SDKMAN!\n\n```bash\nsdk install tornadovm\n```\n\nPick a backend-specific build if you prefer a smaller install. Candidate versions are per-JDK (swap `jdk21` below for `jdk22plus` to install a build for that JDK line):\n\n| Backend | SDKMAN! version | Targets |\n|---|---|---|\n| OpenCL *(default)* | `7.3.1-opencl` | NVIDIA / AMD / Intel GPUs, multi-core CPUs, FPGAs |\n| CUDA | `7.3.1-cuda` | **NVIDIA GPUs (CUDA) — codegen, Tensor Cores, cuBLAS/cuFFT/cuDNN/cuDF library tasks** |\n| Metal 🆕 | `7.3.1-metal` | Apple Silicon GPUs (M1–M4), natively via MSL |\n| All backends | `7.3.1-full` | Everything above |\n\nBinaries are also on the [official website](https://www.tornadovm.org/downloads). For [Docker](https://github.com/beehive-lab/docker-tornado#docker-for-tornadovm) and [AWS (CPUs/GPUs)](https://tornadovm.readthedocs.io/en/latest/cloud.html) see the linked guides.\n\n### Verify your devices\n\n```bash\ntornado --devices\n```\n\n### Run your first program\n\n```bash\n# Unix (Linux/macOS)\njava @$TORNADOVM_HOME/tornado-argfile \\\n  -cp $TORNADOVM_HOME/share/java/tornado/tornado-examples-7.3.1.jar \\\n  uk.ac.manchester.tornado.examples.compute.MatrixVectorRowMajor\n\n# Windows 10+\njava @%TORNADOVM_HOME%\\tornado-argfile ^\n  -cp %TORNADOVM_HOME%\\share\\java\\tornado\\tornado-examples-7.3.1.jar ^\n  uk.ac.manchester.tornado.examples.compute.MatrixVectorRowMajor\n```\n\nMore examples — NBody, DFT, KMeans, matrix kernels, reductions: [tornado-examples](tornado-examples/src/main/java/uk/ac/manchester/tornado/examples)\n\n---\n\n## 📦 Use TornadoVM in your project\n\nMaven Central coordinates are per-JDK — pin the `-jdk21` / `-jdk22plus` version matching the JDK you build with:\n\n```xml\n\u003cdependencies\u003e\n  \u003cdependency\u003e\n    \u003cgroupId\u003eio.github.beehive-lab\u003c/groupId\u003e\n    \u003cartifactId\u003etornado-api\u003c/artifactId\u003e\n    \u003cversion\u003e7.3.1-jdk21\u003c/version\u003e\n  \u003c/dependency\u003e\n  \u003cdependency\u003e\n    \u003cgroupId\u003eio.github.beehive-lab\u003c/groupId\u003e\n    \u003cartifactId\u003etornado-runtime\u003c/artifactId\u003e\n    \u003cversion\u003e7.3.1-jdk21\u003c/version\u003e\n  \u003c/dependency\u003e\n\u003c/dependencies\u003e\n```\n\n---\n\n## ❓ FAQ\n\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eWhat can TornadoVM do on NVIDIA GPUs specifically?\u003c/b\u003e\u003c/summary\u003e\n\nOn NVIDIA hardware TornadoVM JIT-compiles your Java kernels to **CUDA PTX** and compiles them through NVRTC to native cubins. On top of that, it integrates the NVIDIA software ecosystem directly into the `TaskGraph`: **cuBLAS / cuBLASLt** (including TF32 and FP16 GemmEx on Tensor Cores and fused epilogues), **cuFFT**, **cuDNN** (including fused flash attention) and **cuDF** (RAPIDS relational primitives) are available as *library tasks* that share device buffers and a CUDA stream with your generated kernels. You can also target **Tensor Cores** directly from Java via `mma.sync` intrinsics (FP16 and INT8), and capture the whole pipeline into a **CUDA Graph** for single-launch replay. On `develop` there is a second compilation path as well: a kernel taking a **`TileContext`** is compiled through **NVIDIA CUDA Tile**, where a tile rather than a thread is the unit of work. See [The NVIDIA ecosystem, native to Java](#-the-nvidia-ecosystem-native-to-java).\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eWhat's the licensing situation for commercial use?\u003c/b\u003e\u003c/summary\u003e\n\nThe parts your application links against — **Tornado-API** and all the modules you code with — are **Apache 2.0**. The runtime and drivers are **GPLv2 with Classpath Exception**, the same license as OpenJDK itself: it does not impose copyleft obligations on your application, exactly as running on OpenJDK doesn't. Full per-module breakdown [below](#licenses-per-module).\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eDoes it replace my JVM?\u003c/b\u003e\u003c/summary\u003e\n\nNo. TornadoVM is a plug-in to your existing OpenJDK or GraalVM installation. It complements the JVM with the ability to offload selected tasks to accelerators, handling device memory management and kernel orchestration. Everything else in your application runs on the JVM as normal.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eWhich hardware is supported?\u003c/b\u003e\u003c/summary\u003e\n\nMulti-core CPUs; dedicated GPUs from NVIDIA, AMD, and Intel; and integrated GPUs (Apple Silicon M1–M4, Intel HD Graphics, ARM Mali). Backends can be installed individually or together, and tasks can migrate between devices at runtime. NVIDIA GPUs can be driven either through the **CUDA** backend (with the library and Tensor Core features above) or through the OpenCL backend.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eHow fast is it?\u003c/b\u003e\u003c/summary\u003e\n\nIt depends on the workload — data-parallel kernels with enough arithmetic intensity see order-of-magnitude speedups over sequential Java; see the [benchmarking guide](https://tornadovm.readthedocs.io/en/latest/benchmarking.html) and the [jitllm project](https://github.com/beehive-lab/jitllm) for end-to-end numbers on real applications (e.g. **117 tok/s for Llama-3 inference on an RTX 5090**). For compute-bound linear algebra, the cuBLAS library tasks reach the tuned vendor throughput — including full FP16 Tensor Core rates — from Java.\n\u003c/details\u003e\n\n---\n\n## 🤝 Contributing \u0026 community\n\n- 💬 Questions and ideas: [GitHub Discussions](https://github.com/beehive-lab/TornadoVM/discussions) or the [TornadoVM Slack](https://join.slack.com/t/tornadovmcommunity/shared_invite/zt-3ai2wyqva-bKz~cQRFlaJ~ZnPrbkwIEw)\n- 🛠️ Building from source: [INSTALL_FROM_SOURCE.md](INSTALL_FROM_SOURCE.md)\n- 📋 How to contribute: [CONTRIBUTING.md](CONTRIBUTING.md) · [`good first issue`](https://github.com/beehive-lab/TornadoVM/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22)\n- 🤖 Working with an AI coding agent? The repo ships a [TornadoVM developer skill](tornadovm-skill.skill) (build, test, debug workflows) for Claude.\n- 🏛️ Academic \u0026 industrial collaborations: [contact us](https://www.tornadovm.org/contact-us)\n\n---\n\n## 📚 Resources \u0026 publications\n\nVideos, presentations, and articles: [resources](https://tornadovm.readthedocs.io/en/latest/resources.html). Selected academic publications: [publications](https://tornadovm.readthedocs.io/en/latest/publications.html).\n\nIf you use **TornadoVM ≥ 0.2** in research, please cite:\n\n```bibtex\n@inproceedings{Fumero:DARHH:VEE:2019,\n author    = {Fumero, Juan and Papadimitriou, Michail and Zakkak, Foivos S. and\n              Xekalaki, Maria and Clarkson, James and Kotselidis, Christos},\n title     = {{Dynamic Application Reconfiguration on Heterogeneous Hardware}},\n booktitle = {Proceedings of the 15th ACM SIGPLAN/SIGOPS International\n              Conference on Virtual Execution Environments},\n series    = {VEE '19},\n year      = {2019},\n doi       = {10.1145/3313808.3313819},\n publisher = {Association for Computing Machinery}\n}\n```\n\nFor **Tornado 0.1** (initial release), cite [Clarkson et al., ManLang '18](https://doi.org/10.1145/3237009.3237016).\n\n## Licenses per module\n\nLink the **Tornado-API** (Apache 2.0) into your application.\n\n| Modules | License |\n|---|---|\n| Tornado-API, Tornado-Assembly, Tornado-scripts, Tornado-Annotation, Tornado-Unittests, Tornado-Examples, Tornado-Matrices, Tornado-Drivers-OpenCL-Headers | [Apache 2.0](LICENSE_APACHE2) |\n| Tornado-Runtime, Tornado-Drivers | [GPLv2 with Classpath Exception](LICENSE_GPLv2CE) |\n\n## Acknowledgments\n\nPartially funded by [Intel Corporation](https://www.intel.com/) and by EU \u0026 UKRI grants (most recent first): [AERO](https://aero-project.eu/) (101092850), [P2CODE](https://p2code-project.eu/) (101093069), [ENCRYPT](https://encrypt-project.eu) (101070670), [TANGO](https://tango-project.eu) (101070052), [ELEGANT](https://www.elegant-h2020.eu/) (957286), [E2Data](https://e2data.eu) (780245), [ACTiCLOUD](https://acticloud.eu) (732366); and EPSRC grants [PAMELA](http://apt.cs.manchester.ac.uk/projects/PAMELA/) (EP/K008730/1) and [AnyScale Apps](https://gow.epsrc.ukri.org/NGBOViewGrant.aspx?GrantRef=EP/L000725/1) (EP/L000725/1).\n\nMeet the [team](https://www.tornadovm.org/about-us).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeehive-lab%2Ftornadovm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbeehive-lab%2Ftornadovm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeehive-lab%2Ftornadovm/lists"}