oracle/graal · critical · GraalError

No backend available for specified GPU architecture \"%s\"

Error message

No backend available for specified GPU architecture \"%s\"

What it means

After the host backend is created, HotSpotGraalRuntime iterates the JVMCI runtimes's non-host JVMCIBackends (e.g. GPU architectures registered by external JVMCI providers) and needs a HotSpotBackendFactory for each; a missing factory throws GraalError 'No backend available for specified GPU architecture "arch"' during initialization.

Source

Thrown at compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/HotSpotGraalRuntime.java:189

            HotSpotBackendFactory factory = backendMap.getBackendFactory(hostArchitecture);
            if (factory == null) {
                throw new GraalError("No backend available for host architecture \"%s\"", hostArchitecture);
            }
            if (replayCompilationSupport != null) {
                factory = replayCompilationSupport.decorateBackendFactory(factory, jvmciRuntime);
            }
            hostBackend = registerBackend(factory.createBackend(this, compilerConfiguration, jvmciRuntime, null));
        }

        for (JVMCIBackend jvmciBackend : jvmciRuntime.getJVMCIBackends().values()) {
            if (jvmciBackend == hostJvmciBackend) {
                continue;
            }

            Architecture gpuArchitecture = jvmciBackend.getTarget().arch;
            HotSpotBackendFactory factory = backendMap.getBackendFactory(gpuArchitecture);
            if (factory == null) {
                throw new GraalError("No backend available for specified GPU architecture \"%s\"", gpuArchitecture);
            }
            try (InitTimer t = timer("create backend:", gpuArchitecture)) {
                registerBackend(factory.createBackend(this, compilerConfiguration, null, hostBackend));
            }
        }

        // Complete initialization of backends
        try (InitTimer st = timer(hostBackend.getTarget().arch.getName(), ".completeInitialization")) {
            hostBackend.completeInitialization(jvmciRuntime, options);
        }
        for (HotSpotBackend backend : backends.getValues()) {
            if (backend != hostBackend) {
                try (InitTimer st = timer(backend.getTarget().arch.getName(), ".completeInitialization")) {
                    backend.completeInitialization(jvmciRuntime, options);
                }
            }
        }

View on GitHub (pinned to a66e9ccd1d)

Solutions

  1. Add/enable the Graal backend module matching the registered GPU architecture, or upgrade the provider+Graal pair so they align
  2. Remove/disable the JVMCI provider registering the GPU backend you do not intend to use
  3. Select a compiler configuration whose BackendMap includes the GPU architecture
Defensive patterns

Strategy: validation

Validate before calling

for (JVMCIBackend b : jvmciRuntime.getJVMCIBackends().values()) {
    if (b != host && backendMap.getBackendFactory(b.getTarget().arch) == null) { /* unregister or refuse before init */ }
}

Prevention

When it happens

Trigger: A JVMCI runtime that registers a secondary (non-host) backend — typically a GPU arch via an external JVMCI/Graal-GPU provider — while the selected compiler configuration's BackendMap has no factory for that architecture; thrown inside the backend-registration loop of the HotSpotGraalRuntime constructor.

Common situations: Installing a GPU-accelerated JVMCI provider without the matching Graal GPU backend module; version skew between the provider and the Graal build; configurations that deliberately restrict backends while optional GPU providers are present.

Related errors


AI-assisted analysis of oracle/graal@a66e9ccd1d (2026-08-14). Data as JSON: /api/errors/c088b9303f232d90. Report an issue: GitHub.