From 4e6600a96c8e762f678f37a8f951b6614addd663 Mon Sep 17 00:00:00 2001 From: leonarski_f Date: Sat, 22 Aug 2026 18:06:43 +0200 Subject: [PATCH] Build device code for Volta, and document the driver floor CMAKE_CUDA_ARCHITECTURES had no sm_70 entry, and PTX only ever JIT-compiles forwards, so a V100 had no runnable code in the fatbin at all - every kernel launch failed with "no kernel image is available for execution on the device". Append 70 only for a CUDA 12 toolkit: CUDA 13 removed offline compilation for Volta, so an unconditional entry would break the RHEL 9, Ubuntu and Windows builds. 12.8/12.9 still emit it but warn on every .cu, hence -Wno-deprecated-gpu-targets. The append goes after ENABLE_LANGUAGE(CUDA), where the nvcc version is known, matching the existing sm_121 handling. Verified: all 15 CUDA sources compile for sm_70 (including ffbidx, which already guards on __CUDA_ARCH__ >= 700/800), and cuobjdump shows an sm_70 cubin in the built rugnux binary. Consequence worth documenting: a V100 can only run the artefacts built with CUDA 12 - the RHEL 8 packages and the portable Linux .tgz. Document that alongside the minimum NVIDIA driver of every released artefact (525.60.13 for CUDA 12, 580.65.06 for CUDA 13), which applies because the CUDA runtime is linked statically and cuFFT is bundled, so the driver is the only NVIDIA component the target host must supply. Co-Authored-By: Claude Opus 5 (1M context) --- CMakeLists.txt | 12 +++++++++++- docs/CHANGELOG.md | 6 ++++++ docs/JFJOCH_VIEWER.md | 7 +++++++ docs/RELEASE_CONTENTS.md | 30 ++++++++++++++++++++++++++++++ docs/RUGNUX.md | 6 ++++++ 5 files changed, 60 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 87a015d9..5885cf69 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -71,7 +71,7 @@ CHECK_LANGUAGE(CUDA) # GPU architectures to generate device code for: Turing (T4), Ampere (A100; RTX A4000), Ada (L4), # Hopper, and Blackwell in both its data-centre and consumer forms. A bare entry emits SASS *and* # PTX for that architecture, so the newest one here also covers any future GPU: the driver -# JIT-compiles its PTX on first launch. +# JIT-compiles its PTX on first launch. Volta (V100) is added below, once the nvcc version is known. SET(CMAKE_CUDA_ARCHITECTURES 75 80 86 89 90 100 120) SET(CMAKE_CUDA_STANDARD 20) SET(CMAKE_CUDA_STANDARD_REQUIRED True) @@ -93,6 +93,16 @@ IF (CMAKE_CUDA_COMPILER) IF (CMAKE_CUDA_COMPILER_VERSION VERSION_GREATER_EQUAL "12.9") LIST(APPEND CMAKE_CUDA_ARCHITECTURES 121) ENDIF() + # Volta (V100) is sm_70, and PTX only ever JITs *forwards* - without an sm_70 entry a + # V100 has no runnable code in the fatbin at all and every launch fails with "no kernel + # image is available for execution on the device". CUDA 13 removed offline compilation + # for Volta, so only a CUDA 12 toolkit can emit it; 12.8/12.9 still do, but warn on + # every .cu, hence -Wno-deprecated-gpu-targets. Volta is the floor - older GPUs are + # not in use here. + IF (CMAKE_CUDA_COMPILER_VERSION VERSION_LESS "13.0") + LIST(APPEND CMAKE_CUDA_ARCHITECTURES 70) + SET(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -Wno-deprecated-gpu-targets") + ENDIF() ELSE() MESSAGE(WARNING "CUDA older than 12.8 not supported") ENDIF() diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 25716849..56260509 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog ## 1.0.0 +### 1.0.0-rc.162 +This is an UNSTABLE release. It includes many experimental features, as well as many AI generated fixes. We recommend using rc.152 for production use. + +* CUDA builds made with a CUDA 12 toolkit now also contain device code for Volta, so the RHEL 8 packages and the portable Linux `.tgz` run on a V100; CUDA 13 dropped Volta, so the RHEL 9, Ubuntu and Windows artefacts remain Turing and newer. +* Documentation: the supported GPU generations and the minimum NVIDIA driver version of every released artefact. + ### 1.0.0-rc.161 This is an UNSTABLE release. It includes many experimental features, as well as many AI generated fixes. We recommend using rc.152 for production use. diff --git a/docs/JFJOCH_VIEWER.md b/docs/JFJOCH_VIEWER.md index b355d7de..ae3a3278 100644 --- a/docs/JFJOCH_VIEWER.md +++ b/docs/JFJOCH_VIEWER.md @@ -65,6 +65,13 @@ Windows installer) for the embedded indexing and integration; the non-CUDA build pipeline on the CPU at much lower throughput. The CUDA build also runs on a machine without a GPU — see [Release contents ▸ CUDA and non-CUDA builds](RELEASE_CONTENTS.md#cuda-and-non-cuda-builds). +The CUDA build needs an NVIDIA **driver** on the host but no CUDA toolkit — 525.60.13 or newer for +the CUDA 12 artefacts (RHEL 8 packages, portable Linux `.tgz`), 580.65.06 or newer on Linux and an +R580 driver on Windows for the CUDA 13 ones (RHEL 9, Ubuntu, Windows installer). The Windows +installer and the `.tgz` are CUDA 13 and CUDA 12 respectively, which also decides the oldest GPU +they run on — a V100 needs the CUDA 12 `.tgz`. See +[Release contents ▸ GPU generations and the NVIDIA driver](RELEASE_CONTENTS.md#gpu-generations-and-the-nvidia-driver). + ## Opening data - **File ▸ Open** (`Ctrl+O`) — open a local HDF5 file. diff --git a/docs/RELEASE_CONTENTS.md b/docs/RELEASE_CONTENTS.md index 5b131f8f..2b4718d2 100644 --- a/docs/RELEASE_CONTENTS.md +++ b/docs/RELEASE_CONTENTS.md @@ -82,6 +82,36 @@ bigger than the CPU ones — the other reason for shipping both. On a machine with an NVIDIA GPU, take the CUDA variant: only that one uses the GPU. +## GPU generations and the NVIDIA driver + +A CUDA variant carries compiled device code for a fixed set of GPU generations, and which +generations those are follows from the CUDA toolkit it was built with. The CUDA runtime is linked +statically, so the only NVIDIA component the target machine has to supply is the **driver** — there +is no CUDA-toolkit version requirement on the host. + +| Artefact | CUDA toolkit | GPU generations | Minimum driver | +| --- | --- | --- | --- | +| RHEL 8 packages, portable Linux `.tgz` | 12.9 | Volta (V100) through Blackwell: `sm_70`, `75`, `80`, `86`, `89`, `90`, `100`, `120`, `121` | 525.60.13 | +| RHEL 9 and Ubuntu packages, Windows installer | 13.x | Turing (T4) through Blackwell: the same list **without** `sm_70` | 580.65.06 (Linux), R580 (Windows) | +| any `cpu` / `nocuda` variant | — | — | none | + +**A V100 needs the CUDA 12 build.** CUDA 13 dropped offline compilation for Volta, and the PTX a +fatbin also carries only ever JIT-compiles *forwards*, so a CUDA 13 artefact contains nothing a V100 +can execute: every kernel launch fails with *no kernel image is available for execution on the +device*. On a V100 host take the RHEL 8 packages or the portable Linux `.tgz`. Nothing older than +Volta is supported. + +Newer GPUs never need a newer build — the highest generation in the list ships PTX as well as SASS, +which the driver JIT-compiles for a GPU that came out after the release. + +The minimum driver above is the floor for the whole CUDA *major* version, which is what applies here +because the CUDA runtime is statically linked +([CUDA minor version compatibility](https://docs.nvidia.com/deploy/cuda-compatibility/minor-version-compatibility.html)). +Newer drivers are always fine; they are backward compatible. A driver from the same release as the +build toolkit (575.57.08 for the CUDA 12.9 build, 610.43.02 for a CUDA 13.3 one) additionally rules +out the single caveat of minor version compatibility — a call into a driver API newer than the +installed driver, which fails with `cudaErrorCallRequiresNewerDriver`. + ## Windows installer The Windows artefact covers `jfjoch_viewer` and the portable analysis CLIs only; the rest of diff --git a/docs/RUGNUX.md b/docs/RUGNUX.md index c26598a1..3d40cb57 100644 --- a/docs/RUGNUX.md +++ b/docs/RUGNUX.md @@ -32,6 +32,12 @@ provides the GPU fast-feedback indexer (`ffbidx`) and the GPU FFT indexer (`fft` only the CPU `fftw` indexer is available. Spot finding, integration and scaling run on the CPU and scale with the thread count (`-N`). +The released CUDA builds need only an NVIDIA **driver** on the host, no CUDA toolkit: 525.60.13 or +newer for the CUDA 12 artefacts (RHEL 8 packages, portable Linux `.tgz`) and 580.65.06 or newer for +the CUDA 13 ones (RHEL 9, Ubuntu, Windows). Which GPU generations each artefact supports — a V100 +in particular works only with the CUDA 12 build — is in +[Release contents ▸ GPU generations and the NVIDIA driver](RELEASE_CONTENTS.md#gpu-generations-and-the-nvidia-driver). + ## Input and output **Input** is a single Jungfraujoch HDF5 master file (NXmx-based). Spots are always found by `rugnux`