FZGPUModules builds on algorithms and GPU kernels from several open-source scientific compression projects. This page documents what we took from each, how we adapted it, and the associated licenses and citations.
For full verbatim copyright notices required by BSD-3-Clause binary redistribution, see \ref third_party_notices "Third-party notices".
| Project | License | Relationship | Stages |
|---|---|---|---|
| \ref ack_lc "LC framework" | BSD-3-Clause | Direct port / algorithm-faithful reimpl | RZEStage, RREStage, RAREStage, RAZEStage, CLOGStage, HCLOGStage, BitshuffleStage, TUPLStage, DifferenceStage, QuantizerStage |
| \ref ack_cusz "cuSZ" | BSD-3-Clause | Algorithm follow / vendored Huffman sources | LorenzoQuantStage, HuffmanStage |
| \ref ack_fzgpu "FZ-GPU" | BSD-3-Clause | Direct port of fused kernels | BitplaneRZEStage |
| \ref ack_cusz_hi "cuSZ-Hi" | BSD-3-Clause | Adapted spline kernels | GInterpStage |
| \ref ack_cuszp "cuSZp / cuSZp2 / cuSZp3" | BSD-3-Clause | Direct kernel port (AdaptiveBitpackStage, TiledLorenzoStage) + algorithmic reimpl (LorenzoStage block, QuantizerStage linear) |
AdaptiveBitpackStage, TiledLorenzoStage |
| \ref ack_mans "MANS" | BSD-3-Clause | Direct port of kernels | ADMStage |
| \ref ack_sperr "SPERR" | Apache License 2.0 | Direct port (lifting constants, boundary handling) + algorithmic attribution only (Speck2DStage, OutlierCorrectStage) |
Cdf97Stage, Speck2DStage, OutlierCorrectStage/Cdf97OutlierCorrectStage |
| \ref ack_dietgpu "dietGPU" | MIT | Vendored headers | ANSStage |
| \ref ack_gpulz "GPULZ" | None declared upstream | Substantially rewritten derivative | GPULZStage |
| \ref ack_aiz "AIZ_VLDB26" | None declared upstream | Adapted optimization | GPULZStage all-zero-chunk fast path |
| \ref ack_fsz "FSZ" | BSD-3-Clause | Algorithmic attribution only; no code used (written from the paper before FSZ 1.0.0 was released) | AdaptiveLorenzoStage, LorenzoStage centering / order-2, LorenzoQuantStage centering |
| \ref ack_log_transform "Point-wise relative transform" | n/a — paper only | Algorithmic attribution only; no code used | LogTransformStage |
| \ref ack_roibin "ROIBIN-SZ" | SZ2 BSD-style license; no code copied | Algorithmic attribution only; independent GPU/DAG implementation | ROIBinSplitStage |
| \ref ack_szp "SZp / fZ-light" | MIT | GPU reimplementation; no source copied | SZpStage |
| \ref ack_szx "SZx" | Argonne BSD-style license; no code copied | Algorithmic attribution only; paper-derived | SZxStage |
Repository: https://github.com/burtscher/LC-framework
License: BSD-3-Clause
Authors: Noushin Azami, Alex Fallin, Brandon Burtchell, Andrew Rodriguez, Benila Jerald,
Yiqian Liu, Anju Mongandampulath Akathoott, and Martin Burtscher (Texas State University)
Funding: U.S. Department of Energy, Office of Science, ASCR, contract DE-SC0022223
Stages:
- RREStage + RZEStage (
modules/coders/{rre,rze}/) — GPU kernels are a faithful port ofd_RRE.h,d_RZE.h,d_repetition_elimination.h,d_zero_elimination.h, andprefix_sum.h(the LCRREandRZElossless components used by cuSZ-Hi's LC pipelines), vendored together inmodules/coders/lc_common/lc_chunk_components.cuh. Both support LC word sizes 1/2/4/8. - RAREStage + RAZEStage (
modules/coders/{rare,raze}/) — GPU kernels are a faithful port ofd_RARE.handd_RAZE.h, the auto-k generalizations ofRRE/RZE(one global bit-width cut chosen per chunk instead of a binary match/no-match test), sharing a single mergedd_PRencode/d_PRdecode<T, PartialReduceMode>template in the same vendored header. Both support LC word sizes 1/2/4/8. - CLOGStage + HCLOGStage (
modules/coders/{clog,hclog}/) — GPU kernels are a faithful port ofd_CLOG.handd_HCLOG.h: each chunk is split into a fixed 32 subchunks, each bit-packed to the minimum width needed for its own max value (Tunsigned only); HCLOG additionally tries a per-subchunk TCMS(zigzag) reinterpretation and keeps whichever is smaller. Sharing a single mergedd_CLOGencode/d_CLOGdecode<T, CLogMode>template inmodules/coders/lc_common/lc_clog_components.cuh. Both support LC word sizes 1/2/4/8. - BitshuffleStage (
modules/shufflers/bitshuffle/) — the 4- and 8-byte butterfly shuffle kernels are adapted directly fromd_BIT_4/d_BIT_8. The 1- and 2-byte paths use a standard__ballot_syncapproach and are not LC-derived. - TUPLStage (
modules/shufflers/tupl/) — GPU kernels are a faithful port ofd_TUPL/d_iTUPL(LC'sTUPLktuple deinterleave / AoS-to-SoA transpose). Upstream generates one fixed(dim, word_size)instantiation per component over a hardcoded 16 KB chunk; heredim,word_size, andblock_sizeare independent runtime parameters instead. - DifferenceStage (
modules/predictors/diff/) — independently written CUDA kernel following thed_DIFFNBalgorithm described in the LC/PFPL framework. - QuantizerStage (
modules/quantizers/quantizer/) — independently written CUDA kernel following the LC/PFPL quantization scheme including ABS/NOA/REL error-bound modes, outlier handling, and log-space REL encoding.
Repository: https://github.com/szcompressor/cuSZ
License: BSD-3-Clause
Authors/Affiliations: cuSZ team — UChicago Argonne LLC, Washington State University,
Indiana University, University of Kentucky, Oakland University (see copyright notices in
THIRD_PARTY.md for year-by-year breakdown)
Stages:
- LorenzoQuantStage (
modules/fused/lorenzo_quant/) — GPU kernels and the fused predictor+quantizer design follow the cuSZ Lorenzo implementation (lrz_c.cuhip.inl,lrz_x.cuhip.inl). - HuffmanStage (
modules/coders/huffman/) — cuSZ's Huffman source files (hf.h,hf_bk*.cc,hf_buf.cc,hf_canon.cc,hf_hl.cc,hf_kernels.cu,hf_impl.hh) are vendored copies adapted fromorigin/v1.1.0_devof the cuSZ repository, with modifications documented at the top of each file. cuSZ usesphfas this implementation's internal namespace/type prefix.
Citation:
Jiannan Tian, Sheng Di, Xiaodong Yu, Cody Rivera, Kai Zhao, Shixun Wu, Algis Averbuch, Jon Calhoun, Dingwen Tao, Franck Cappello. pSZ/cuSZ: A GPU-Based Error-Bounded Lossy Compressor for Scientific Data. SC '21. https://doi.org/10.1145/3458817.3476173
Repository: https://github.com/szcompressor/cuSZ (vendored under modules/codec/fzg/)
License: BSD-3-Clause (same as cuSZ)
Original authors: Boyuan Zhang (kernel), Jiannan Tian (refactor)
Stages:
-
BitplaneRZEStage (
modules/fused/bitplane_rze/) — the fused bitplane-transpose + zero-group encode/decode kernels (bitplane_rze_encode.inl,bitplane_rze_decode.inl) are adapted fromKERNEL_CUHIP_fz_fused_encode/KERNEL_CUHIP_fz_fused_decodeas vendored inorigin/v1.1.0_devof cuSZ.Changes from original:
namespace fzgpu→namespace fz::bitplane_rze;err.hh/CHECK_GPUstripped;fzgpu::Bufallocation replaced by FZGPUModulesMemoryPool; the 128-bytefzg_headeris reproduced asArchiveHeader. Kernel bodies preserved verbatim. Host-side wrapper and memory-pool integration are FZGPUModules code.
Citation:
Boyuan Zhang, Jiannan Tian, Sheng Di, Xiaodong Yu, Yunhe Feng, Xin Liang, Dingwen Tao, Franck Cappello. FZ-GPU: A Fast and High-Ratio Lossy Compressor for Scientific Computing Applications on GPUs. HPDC '23. https://doi.org/10.1145/3588195.3592994
Repository: https://github.com/shixun404/cuSZ-Hi
License: BSD-3-Clause
Upstream copyright holder: UChicago Argonne, LLC and Washington State University
Stages:
-
GInterpStage (
modules/fused/ginterp/) — the multi-level spline interpolation kernels are adapted fromspline3.cuandspline3_md.inl.Changes from original:
namespace cusz→namespace fz::ginterp;err.hh/timer.hhincludes stripped;pszmem_cxx<T>buffer abstraction replaced by raw device pointers via FZGPUModulesMemoryPool;CompactDramoutlier triplet replaced by separateoutlier_vals/outlier_idxs/outlier_countoutput ports; minimalcusz_type_subset.hreproduces onlyINTERPOLATION_PARAMSandu4from upstreamcusz/type.h. Host-side wrapper, memory-pool integration, radius auto-tune, and all five auto-tune modes are FZGPUModules code.Bug fix patched locally:
pa_spline_infprecis_data's SPLINE_DIM==2 level==0 atomic offset corrected fromerrors + 15 + BIY(upstream) toerrors + 16 + BIYto avoid a slot collision with the level==1 BIY=4 write. Full analysis is in \ref stage_ginterp "GInterpStage documentation".
Citation:
Shixun Wu, Jinwen Pan, Jinyang Liu, Jiannan Tian, Ziwei Qiu, Jiajun Huang, Kai Zhao, Xin Liang, Sheng Di, Zizhong Chen, Franck Cappello. Boosting Scientific Error-Bounded Lossy Compression through Optimized Synergistic Lossy-Lossless Orchestration (cuSZ-Hi). SC '25. https://doi.org/10.1145/3712285.3759798
Repository: https://github.com/szcompressor/cuSZp
License: BSD-3-Clause (verbatim copyright reproduced in THIRD_PARTY.md)
Authors/Affiliations: Yafan Huang, Sheng Di, Guanpeng Li, Franck Cappello
(Argonne National Laboratory / University of Iowa)
Mixed relationship: two stages contain direct ports of cuSZp kernel source
(AdaptiveBitpackStage, TiledLorenzoStage); two are independent
reimplementations with no source copied (LorenzoStage block mode,
QuantizerStage linear mode).
Stages:
- AdaptiveBitpackStage (
modules/coders/adaptive_bitpack/) — direct port of the cuSZp fixed-length (per-block fixed-rate bit-plane) encode/decode kernel logic from cuSZp (SC'23), plus the plain vs. outlier selection mode from cuSZp2 (SC'24). Re-expressed one-thread-per-block with a byte-granular layout and an ordinary CUBDeviceScanfor per-block offsets where cuSZp fuses a decoupled look-back scan (that fusion is not reproduced);MemoryPoolintegration and FZM scaffolding are FZGPUModules code. - TiledLorenzoStage (
modules/predictors/tiled_lorenzo/) — direct port of the cuSZp3 / VGC (SC'25) dimension-aware (2-D/3-D tiled separable) delta kernel logic, re-expressed as a standalone integer predictor with a tile-major output reshape; the tile-major decomposition, FZM header, andMemoryPoolintegration are FZGPUModules code. - LorenzoStage::setBlockSize — independent reimplementation of the block-local 1-D delta from cuSZp (SC'23).
- QuantizerStage linear mode — independent reimplementation of
q = round(x / 2·eb)from cuSZp (SC'23).
cuSZp3's memory-efficient compression and selective decompression features are not ported; they don't map cleanly onto the staged pipeline model.
Citations:
Yafan Huang, Sheng Di, Xiaodong Yu, Guanpeng Li, Franck Cappello. cuSZp: An Ultra-fast GPU Error-bounded Lossy Compression Framework with Optimized End-to-End Performance. SC '23. https://doi.org/10.1145/3581784.3607048
Yafan Huang, Sheng Di, Guanpeng Li, Franck Cappello. cuSZp2: A GPU Lossy Compressor with Extreme Throughput and Optimized Compression Ratio. SC '24.
Yafan Huang, Sheng Di, Guanpeng Li, Franck Cappello. GPU Lossy Compression for HPC Can Be Versatile and Ultra-Fast (cuSZp3 / VGC). SC '25. https://doi.org/10.1145/3712285.3759817
Repository: https://github.com/hpdps-group/MANS
License: BSD-3-Clause
Developers: Wenjing Huang, Jinwu Yang, and Dingwen Tao (Institute of
Computing Technology, Chinese Academy of Sciences), and colleagues
Paper: Wenjing Huang, Jinwu Yang, Dingwen Tao, et al. "MANS: Efficient and
Portable ANS Encoding for Multi-Byte Integer Data on CPUs and GPUs." SC '25.
(Full author list / BibTeX: see THIRD_PARTY.md.)
Stages:
-
ADMStage (
modules/transforms/adm/) — GPU kernels (mapping_uint16.cu,mapping_uint32.cu) are a direct port ofnv/adm/mapping_uint16.cuandnv/adm/mapping_uint32.cufrom MANS. Kernel logic is unchanged.Changes from original: unused
MansParamsparameter removed; per-callcudaMalloc/cudaFreereplaced by pool-allocatedAdmScratch;check_cuda()replaced byFZ_CUDA_CHECK; namespace changed frommans::nv::admtofz::adm; kernels renamed with_u16/_u32suffix to avoid TU-level naming conflicts; inline comments translated to English.
Repository: https://github.com/NCAR/SPERR License: Apache License 2.0 Authors: Shaomeng Li, Peter Lindstrom, John Clyne (NCAR) Citation: Li, S., Lindstrom, P., Clyne, J. Lossy Scientific Data Compression With SPERR. IPDPS 2023.
Stages:
-
Cdf97Stage (
modules/transforms/cdf97/) — direct port of the numerically load-bearing constants and rules fromsperr::CDF97(include/CDF97.h,src/CDF97.cpp): the lifting constants (computed from the filter bank coefficients, not the commented QccPack literal values), the symmetric boundary-extension rule, the level-count rule, and the 3-D dyadic/wavelet-packet selection rule. Validated bit-exact againstsperr::CDF97in double precision. GPU kernels (the axis kernel, coalesced-tile kernel, persistent cooperative-groups level fusion) are FZGPUModules' own — none of that exists in SPERR, which runs single-threaded CPU. -
Speck2DStage (
modules/coders/speck2d/) — algorithmic attribution only, no SPERR code used. Codes the same kind of information SPERR'sSPECK2D_INTbit-plane coder does, but the bitstream, data structures, and encode/decode algorithms are an independent, from-scratch, GPU-parallel-decodable design. SPERR'sSPECK_INT/SPECK2D_INTuse linked LIP/LIS/LSP lists and a DFS-serial traversal; none of that structure appears here. Seememory/speck_algorithm_writeup.mdfor the full derivation and novelty statement. -
OutlierCorrectStage / Cdf97OutlierCorrectStage (modules/coders/outlier_correct/, modules/coders/cdf97_outlier_correct/) — algorithmic attribution only, no SPERR code used. Implements the same mechanism as SPERR's
Outlier_Coder(dequantize + inverse-transform a trial reconstruction, diff against the original, exact-correct every point over bound), arrived at independently fromOutlier_Coder.h/.cppandSPECK_FLT.cpp's call site — not by porting SPERR's code. Generalized beyond SPERR's own design via a transform-agnosticReconstructorpolicy.
See THIRD_PARTY.md for the full Apache License 2.0 text
required by upstream and the complete relationship writeup for each stage.
Repository: https://github.com/facebookresearch/dietgpu
License: MIT
Authors: Meta Platforms, Inc. and affiliates
Stages:
-
ANSStage (
modules/coders/ans/) — the rANS kernel headers (GpuANSCodec.h,GpuANSEncode.h,GpuANSDecode.h,GpuANSStatistics.h,BatchPrefixSum.h, andutils/) are vendored copies placed undermodules/coders/ans/dietgpu/.Changes from original:
histogramBatch/histogramSinglefunctions inGpuANSStatistics.hremoved and replaced by the sharedfz::module::GPU_histogram_generic<uint8_t>utility; namespacemultibyte_ansadapted tofz::ans. All other kernel logic is unchanged from the original.
Repository: https://github.com/hpdps-group/ICS23-GPULZ
License: none declared upstream — see the caveat below
Copyright notice: (C) 2023 by Indiana University and Argonne National Laboratory.
Authors: Boyuan Zhang, Jiannan Tian, Sheng Di, Xiaodong Yu, Martin Swany,
Dingwen Tao, Franck Cappello
Paper: "GPULZ: Optimizing LZSS Lossless Compression for Multi-byte Data on Modern
GPUs", ICS '23
Stages:
-
GPULZStage (
modules/coders/gpulz/) — a substantially rewritten derivative of upstreamgpulz.cu. It retainscompressKernelI's per-chunk flag-bitmap/token stream grammar and sequential literal/match parse. Its exact/hashed match search, block prefix sum, staged writes, and block-parallel decoder are FZGPUModules implementations; the decoder no longer follows upstream's single-threaddecompressKernel.The per-chunk container format (raw-fallback flag, CUB exclusive-scan packing offsets, deferred tail-size readback via
postStreamSync()) is FZGPUModules' own, following the same pattern asRREStage/RZEStage. Upstream's separate flag/data pack-out step (compressKernelIII) is folded into FZGPUModules'gpulzPackKernel. Split mode (emitting literals, lengths, offsets, and metadata as separate output ports) has no upstream counterpart.License caveat: the upstream repository publishes no
LICENSEfile and declares no license. Its README copyright notice does not grant redistribution permission. Anyone redistributing FZGPUModules withGPULZStageshould obtain permission or licensing terms from the GPULZ copyright holders first.
Repository: https://github.com/boyuanzhang62/AIZ_VLDB26 License: none declared upstream — same situation as GPULZ above Author: Boyuan Zhang
Stages:
-
GPULZStage all-zero-chunk fast path (
modules/coders/gpulz/) — skipping the match search and the flag/data encode entirely for chunks that are wholly zero, gated on a warp-vote check, is adapted from thenotEmptyFlagArroptimization in the "sparse" GPULZ variant attest/gpulz.cuhupstream.Changes from original: retargeted to
GPULZStage's compile-time-templated kernel structure, usingfz::backend::anySync32for the warp vote and FZGPUModules' own container format — empty chunks are marked with a(flag_size=0, data_size=0)sentinel, distinct from the raw-fallback sentinel, and the corresponding output span is zero-filled on decode.
License: BSD-3-Clause (FSZ 1.0.0, released 2026-08). Repository: https://github.com/JiajunHuang1999/FSZ Author: Jiajun Huang (University of South Florida) Paper: "FSZ: Breaking the Prediction-Throughput Trade-off in GPU Lossy Compression", SC '26, arXiv:2607.15413
Relationship: algorithmic attribution only — no code was used. These stages were written from the paper's description alone, before any source release existed. FSZ 1.0.0 was published afterwards, on 2026-08; it has not been consulted for implementation, only used as a reference build for validation (see below).
Validated against the reference implementation (2026-08-07, H100, 20 cells). The
reconstruction is faithful: PSNR is identical to the reference on every cell, and the
bitpacked payload is byte-for-byte the same size (4,277,784 B on NYX/baryon_density),
so the two make identical per-tile decisions. Compression ratio is 0.9928 of the
reference (geomean), and 99.6% of that deficit is FZGPUModules' separate modes port:
FSZ packs the same two flags free into spare bits of its per-block rate byte, which a
predictor stage decoupled from its coder cannot do. See
compression_benchmarking/docs/adapters/fsz.md.
Stages: AdaptiveLorenzoStage (modules/fused/adaptive_lorenzo/),
LorenzoStage::setCentering() / setOrder(2) (modules/predictors/lorenzo/),
LorenzoQuantStage::Config::centering (modules/fused/lorenzo_quant/).
The ideas taken from the paper are:
- Cross-block prediction state — running the prediction chain across the encoding blocks within a tile rather than restarting at every block, so a tile carries one raw seed instead of one per block.
- Per-tile adaptive multi-order prediction and centering — selecting, per tile, among first- and second-order Lorenzo with and without subtracting the tile mean, by exact encoded size rather than by an entropy proxy.
- Single-pass four-way evaluation — costing all four variants from one data read, using
the fact that a constant offset cancels exactly in k-th order finite differences
(
delta^k(q - mu) == delta^k(q)) for every element withkpredecessors, so centering perturbs only a tile's first one or two residuals.
Differences from the paper: the reference fuses prediction, quantization and encoding
into a single CUDA kernel with a decoupled-lookback prefix sum; FZGPUModules implements the
prediction step alone as a DAG stage that composes with QuantizerStage and
AdaptiveBitpackStage. Kernel structure, the cost model's coupling to
AdaptiveBitpackStage's rate formula, port layout, side-channel compaction, serialization,
and all host-side plumbing are FZGPUModules code.
License: not applicable — algorithmic attribution only; the stage was written from the paper's description, no reference implementation was used. Authors: Xin Liang, Sheng Di, Dingwen Tao, Zizhong Chen, Franck Cappello Paper: "An efficient transformation scheme for lossy data compression with point-wise relative error bound", IEEE CLUSTER 2018, pp. 179–189
Stages:
- LogTransformStage (
modules/transforms/log_transform/) — implements the paper's transformation scheme: mapping data into log space so that a point-wise relative error bound becomes a plain absolute bound, letting an ordinary ABS quantizer downstream deliver the relative guarantee. Kernel implementation, the sign/zero/near-zero outlier handling, and the DAG stage plumbing are FZGPUModules code.
Paper: Robert Underwood, Chun Hong Yoon, Ali Murat Gok, Sheng Di, and Franck Cappello, “ROIBIN-SZ: Fast and Science-Preserving Compression for Serial Crystallography,” Synchrotron Radiation News 36(4), 17–22, 2023. https://doi.org/10.1080/08940886.2023.2245722
Public implementation: https://github.com/szcompressor/SZ2/tree/master/example/roibin_example
Relationship: ROIBinSplitStage is an independent GPU/DAG implementation
of the published ROI/background separation design. No SZ2 or LibPressio source
is copied. The kernels, FZROI1 peak-table format, fixed-output geometry,
three-port layout, and inverse scatter are FZGPUModules code.
Repository: https://github.com/szcompressor/SZp
License: MIT
Relationship: SZpStage and szp_composed.toml are GPU adaptations of the
published predict-quantize-pack structure. No upstream source is copied. FZGM
uses different quantization and predictor-partition conventions, and its archive
is not byte-compatible with the upstream container.
Jiajun Huang, Sheng Di, et al. hZCCL: Accelerating Collective Communication with Co-Designed Homomorphic Compression, SC '24.
Repository: https://github.com/szcompressor/SZx
License: Argonne OPEN SOURCE LICENSE SF-16-105 (four-condition BSD style)
Relationship: SZxStage was implemented from the paper; no SZx source was
copied and the FZGM archive is not byte-compatible with the upstream format.
Xiaodong Yu, Sheng Di, Kai Zhao, Jiannan Tian, Dingwen Tao, Xin Liang, and Franck Cappello. Ultrafast Error-bounded Lossy Compression for Scientific Datasets, HPDC '22.