diff --git a/CHANGELOG.md b/CHANGELOG.md index de50bb30..7feb9f70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ Version numbers follow [Semantic Versioning](https://semver.org/). ## [Unreleased] — 2.0.0 ### Added +- **`cuda-h200` CMake preset** (configure/build/test): CUDA backend, `CMAKE_CUDA_ARCHITECTURES=90` — the project default (86, A100) doesn't cover Hopper. Verified via `ctest --preset cuda-h200` on a gpuH200x8 node (NCSA Delta): 40/40 tests pass. - **`TUPLStage`** (`modules/shufflers/tupl/`) — the LC framework's `TUPLk` lossless component: a tuple deinterleave (AoS → SoA) transpose. Given a block of `dim`-field tuples with `word_size`-byte fields, regroups the data field-major (all field-0 words, then field-1, ...) — a decorrelation step for downstream byte-oriented coders, not a compressor on its own (size-preserving). A genuinely different shape from every prior LC port: no bitmap/histogram/atomics, just a strided permutation, so it lands in `modules/shufflers/` alongside `BitshuffleStage` rather than the RRE-family container format. Faithful port of `d_TUPL`/`d_iTUPL`; unlike upstream (which generates one fixed `(dim, word_size)` instantiation per component — `TUPL2_1`, `TUPL6_8`, `TUPL12_1`, ... — over a hardcoded 16 KB chunk), `dim`, `word_size`, and `block_size` are all independent runtime parameters here, and intra-block leftover bytes (`block_size` not evenly divisible by `dim*word_size` — the common case for `dim` in {3, 6, 12} at LC's own default chunk size) are copied through unchanged rather than requiring an evenly-divisible configuration. `StageType::TUPL` (31), TOML `TUPL` stage, CLI `tupl[_]` (e.g. `tupl6_4`). - Test coverage: `test_tupl_stage.cpp` (16 tests — all of LC's canonical `(dim, word_size)` combinations including its two extremes (`TUPL12_1`, `TUPL6_8`), a hand-verified exact SoA layout check, an engineered case that exercises the intra-block leftover-byte path, a degenerate case where the block is smaller than one tuple, multi-block and partial-stream-tail cases, header round-trip, invalid-config throws, and a `LorenzoQuant→TUPL` pipeline integration test). Full suite green, `compute-sanitizer --tool memcheck` and `--tool racecheck` both clean. diff --git a/CMakePresets.json b/CMakePresets.json index 01c453cf..6516511b 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -54,6 +54,18 @@ } }, + { + "name": "cuda-h200", + "inherits": "base", + "displayName": "CUDA (H200 / Hopper, sm_90)", + "description": "Release build against the CUDA backend for compute capability 9.0 (H100/H200). The project default (86, A100) does not cover Hopper, so this preset overrides CMAKE_CUDA_ARCHITECTURES explicitly.", + "cacheVariables": { + "CMAKE_BUILD_TYPE": "Release", + "FZGMOD_BACKEND": "CUDA", + "CMAKE_CUDA_ARCHITECTURES": "90" + } + }, + { "name": "compute-san", "inherits": "base", @@ -88,6 +100,11 @@ "configurePreset": "hip", "displayName": "Build HIP (AMD ROCm)" }, + { + "name": "cuda-h200", + "configurePreset": "cuda-h200", + "displayName": "Build CUDA (H200 / Hopper)" + }, { "name": "compute-san", "configurePreset": "compute-san", @@ -130,6 +147,14 @@ "output": { "outputOnFailure": true } }, + { + "name": "cuda-h200", + "configurePreset": "cuda-h200", + "displayName": "All tests (CUDA H200)", + "description": "Run the full test suite against the CUDA sm_90 (H200/Hopper) build.", + "output": { "outputOnFailure": true } + }, + { "name": "asan", "configurePreset": "asan",