Skip to content

Keep GPU FSST decompression on device - #9414

Draft
joseph-isaacs wants to merge 23 commits into
developfrom
joe/gpu-decompress-on-device
Draft

Keep GPU FSST decompression on device#9414
joseph-isaacs wants to merge 23 commits into
developfrom
joe/gpu-decompress-on-device

Conversation

@joseph-isaacs

@joseph-isaacs joseph-isaacs commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

Supersedes #9147 with a fairer GPU decompression comparison and device-side FSST output construction.

What changed

  • give Parquet row groups and Vortex root chunks the same 1,048,576-row physical partitioning
  • run an untimed fresh-open Vortex warm-up while keeping the CUDA data-segment cache disabled
  • build FSST output offsets with a device-side i32 prefix scan
  • persist exact FSST length Min/Sum statistics and use them to remove both four-byte D2H validation waits
  • decode FSST directly into device-resident VarBinView data and views
  • retain the validated host-scalar path as a guarded fallback when exact statistics are unavailable
  • support independently narrowed signed or unsigned DateTimeParts components, including u16 days
  • expand nullable RunEnd value validity into a packed row-level bitmap on the GPU
  • execute primitive Masked children on the GPU, preserving device-resident buffers
  • add opt-in per-field wall, CUDA-event, encoding-tree, and NVTX diagnostics
  • allow --formats vortex to isolate Vortex-only GPU diagnostics; the fair default remains parquet,vortex

Why

The earlier benchmark gave Vortex hundreds of small input chunks while Parquet used large row groups, and FSST copied every decoded string length to the CPU to build output offsets. That made launch overhead and a bulk device-to-host synchronization dominate the Vortex number.

Matching physical partitions makes the comparison equivalent. Keeping lengths, offsets, output bytes, and BinaryViews on the GPU removes the bulk CPU round trip. Trusted exact length statistics also remove the two remaining scalar D2H synchronizations from each FSST decode.

Results

TPC-H lineitem, six equal physical partitions and all 96 field decodes:

  • original Vortex execute stage: 34.864 ms
  • first device-offset version: 11.642 ms
  • after removing scalar FSST waits: 9.351 ms
  • complete Vortex decompression: 17.818 ms
  • exact timed kernels after the change: 256 launches, 4.778 ms
  • FSST kernels after the change: 4.202 ms
  • timed D2H copies: 60 -> 0
  • CUDA host callbacks: 150 -> 90

Validation

  • cargo test -p vortex-cuda fsst --lib — 22 passed
  • cargo test -p vortex-cuda test_cuda_datetimeparts_unsigned_components --lib — passed
  • cargo check -p vortex-cuda -p vortex-btrblocks
  • cargo clippy -p vortex-cuda --all-targets --all-features -- -D warnings
  • cargo build -p compress-bench --release --features cuda,unstable_encodings
  • cargo +nightly fmt --all
  • clang-format --dry-run --Werror --style=file vortex-cuda/kernels/src/arrow_offsets.cu vortex-cuda/kernels/src/date_time_parts.cu
  • git diff --check
  • TPC-H --gpu-verify — all 96 fields matched the CPU decoder
  • Arade --gpu-verify — all 110 fields matched the CPU decoder
  • Taxi --gpu-verify — all 76 fields matched the CPU decoder
  • CUDA RunEnd suite — all 10 tests passed

claude and others added 16 commits August 3, 2026 12:02
The GPU compression benchmark only measured Vortex, and only on a single
dataset, so it could not say anything about how Vortex GPU decompression
compares to Parquet, nor about encodings beyond FSST strings.

Parquet compresses each page body independently, which is exactly the batch
shape nvCOMP's device decompressors take and how cuDF's Parquet reader gets
pages off the CPU. This adds a Parquet backend built on that: column chunks
are staged on the device through the same pinned, direct-I/O reader the Vortex
backend uses, then every page in a row group is decompressed in one batched
nvCOMP launch.

- vortex-nvcomp: bind the batched Snappy decompression entrypoints and the
  per-algorithm alignment queries, and share `DecompressBackend` between the
  Snappy and Zstd wrappers.
- compress-bench: locate compressed page bodies by walking the per-page Thrift
  headers (`parquet::format::PageHeader` is deprecated and `parquet`'s own
  parser is crate-private), and write files with GPU-friendly settings: v1
  pages, dictionary encoding, 1 MiB pages, Snappy by default.
- Run both Vortex and Parquet under `--gpu-decompress`, and expand the GPU
  dataset set from one to nine so ALP, bit-packed, run-end, date/time-parts
  and null-heavy columns are covered alongside FSST strings.
- Add `--gpu-verify`, which compares every GPU-decompressed page against the
  host codec and every GPU-decoded Vortex field against the CPU decode, and
  run it as a CI step before the timed benchmark. Independently of that flag,
  nvCOMP's per-page status and size arrays are checked on every iteration.

Page decoding is not part of the Parquet measurement, so its numbers are an
upper bound on a full GPU Parquet reader; the README states this.

Signed-off-by: Claude <noreply@anthropic.com>
A CUDA scan hands back arrays whose buffers live in device memory, so decoding
those same arrays through the host Arrow path panics rather than producing a
CPU reference. Read the file a second time through the ordinary host reader and
compare the two scans batch by batch instead.

Signed-off-by: Claude <noreply@anthropic.com>
Two changes to the Vortex GPU verification, after CI reported a `fastlanes.for`
mismatch with no detail:

- Read the CPU reference from a copy of the file. The session segment cache is
  keyed by URI and the CUDA reader deliberately bypasses it because its buffers
  are device-resident, so pointing both scans at one URI risks them sharing
  entries.
- Synchronize the stream before copying a decoded field back, and report the
  Arrow types, lengths, null counts and the first differing row when the two
  decodes disagree.

Signed-off-by: Claude <noreply@anthropic.com>
The bit-unpack kernel writes patch values straight into the output while the
lane decoder adds the frame of reference to every unpacked value. Bit-packing
exceptions are stored in the same reference-relative domain as the packed
values, so under `FoR(BitPacked)` every patched position came out short by
exactly the reference.

The existing kernel tests could not catch this: they exercise `BitPacked`
directly, where the reference is zero. The new `FoRExecutor` case bit-packs to
8 bits with values that overflow into patches and a non-zero reference.

Found by the compression benchmark's new `--gpu-verify` pass, which reported a
`fastlanes.for` field decoding row 8038 as 131072 where the CPU produced
393061 — a difference of exactly the 261989 reference.

Also thread the dataset name through compress-bench failures, so a benchmark
error says which dataset it came from.

Signed-off-by: Claude <noreply@anthropic.com>
A verification run stopped at the first dataset that failed, so finding the
GPU-clean set took one CI cycle per dataset. Run every dataset instead,
recording failures and reporting them together at the end, then exit non-zero.

Missing CUDA kernel support surfaces as a panic rather than an error, so the
survey catches those too.

Signed-off-by: Claude <noreply@anthropic.com>
The per-dataset verification verdicts were only visible by digging through a
multi-thousand-line job log. Capture the verification output, publish the
per-dataset results to the step summary and a PR comment, and keep failing the
job through a separate gate step.

Signed-off-by: Claude <noreply@anthropic.com>
The Public BI datasets build their Parquet fixture through the DuckDB CLI, as
in bench-pr.yml. The GPU job never installed it, so all six failed with ENOENT
before reaching the GPU at all.

Signed-off-by: Claude <noreply@anthropic.com>
The nvCOMP backend only ran the codec stage on the device: page decoding stayed
on the CPU and was excluded from the measurement, so the Parquet figure was an
upper bound and the comparison against Vortex was not like-for-like.

cuDF's `read_parquet` does the whole read on the device — page header decode,
decompression, dictionary/RLE/plain decoding and column assembly — which is the
same amount of work the Vortex backend does when it decodes to canonical arrays.
It is reached through the prebuilt `cudf-cu12` wheel, so it stays a runtime
dependency and never enters the Rust build.

Timing is taken inside scripts/cudf-parquet-read.py, so interpreter start,
`import cudf` and CUDA context creation are excluded; a warm-up read runs first.
`--gpu-verify` now compares the cuDF frame against a CPU Parquet read.

This removes the page scanner, the batched nvCOMP launch path and the nvCOMP
Snappy bindings, all of which existed only to serve the codec-stage backend.
What remains of the Parquet side is the GPU-friendly writer settings, now in
gpu_writer.rs.

Signed-off-by: Claude <noreply@anthropic.com>
The reference side of the Vortex verification was executing through the CUDA
context: the host scan's batches and both Arrow conversions were handed
`cuda_ctx.execution_ctx()`. A CUDA context allocates its outputs in device
memory, so the Arrow conversion then read a device buffer from the host and
panicked with "unwrap_host called for Device allocation" on the string-heavy
Public BI datasets, where canonicalisation goes through the buffer directly.

Signed-off-by: Claude <noreply@anthropic.com>
…ess-benchmarks-4mmn93

Signed-off-by: Claude <noreply@anthropic.com>
The verification gate ran before the timed pass, so a single unsupported
dataset meant the run produced no numbers at all. Two changes:

- the per-dataset survey now applies to any GPU run, not just a verifying
  one, and the timing tables render before the failure summary, so datasets
  that do decode still publish their numbers;
- the workflow runs the benchmark before the gate and fails the job at the
  end on either a failed verification or a failed benchmark.

Signed-off-by: Claude <noreply@anthropic.com>
Signed-off-by: Claude <noreply@anthropic.com>
The per-dataset grep captures only the first line of each error, so a Python
traceback from the cuDF script or a Rust backtrace never reached the comment.
Attach the tail of the raw output in a collapsed block on failure, and match
the summary line's current wording.

Signed-off-by: Claude <noreply@anthropic.com>
fix(cuda): copy validity back to the host in `into_host`

`CanonicalCudaExt::into_host` migrated a canonical array's values buffer but
passed its validity through untouched, so a nullable array came back to the
host half-migrated and the first host read of the mask panicked with
"unwrap_host called for Device allocation" — via `Validity::execute_mask` ->
`BoolArray::into_bit_buffer`. Non-nullable arrays were unaffected, which is
why it only showed up on the Public BI tables. The `Bool` arm already carried
a TODO for exactly this.

Do not compare Parquet DATE columns across representations

pyarrow materialises a DATE column as `datetime.date` objects and cuDF as
`datetime64[s]`. The values agree, but `check_dtype=False` does not bridge
object-vs-datetime64, so the comparison reported every row as different and
failed both TPC-H datasets. Coerce both sides to datetime64 first.

Read the Vortex GPU file through the page cache by default

cuDF takes an untimed warm-up read, so its timed read is served from the page
cache, while the Vortex reader used `O_DIRECT` on every iteration and paid
real disk reads each time. That compared a read of the disk against a read of
RAM. Direct IO is now off by default and available behind `--gpu-direct-io`
for measuring storage bandwidth, which is not a decode comparison.

Signed-off-by: Claude <noreply@anthropic.com>
The GPU ratio says which of two GPU readers is faster, not whether either
beats the CPU decoders. Run the same binary over the same datasets with the
CPU path on the same machine and publish it alongside, so the GPU numbers can
be read against something.

Also capture the benchmark's exit status rather than letting `shell: bash`'s
-e skip the `cat`, which kept the timing tables out of the job log and left
them only in the PR comment.

Signed-off-by: Claude <noreply@anthropic.com>
Signed-off-by: Joe Isaacs <2413449+joseph-isaacs@users.noreply.github.com>
@joseph-isaacs joseph-isaacs added the action/bench-gpu-compress Run only the GPU compression benchmark on this PR label Aug 14, 2026
@github-actions github-actions Bot removed the action/bench-gpu-compress Run only the GPU compression benchmark on this PR label Aug 14, 2026
@codspeed-hq

codspeed-hq Bot commented Aug 14, 2026

Copy link
Copy Markdown

Merging this PR will degrade performance by 14.59%

⚠️ Unknown Walltime execution environment detected

Using the Walltime instrument on standard Hosted Runners will lead to inconsistent data.

For the most accurate results, we recommend using CodSpeed Macro Runners: bare-metal machines fine-tuned for performance measurement consistency.

❌ 6 regressed benchmarks
✅ 2037 untouched benchmarks
⏩ 46 skipped benchmarks1

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Mode Benchmark BASE HEAD Efficiency
WallTime cuda/alp_f64/10%[100M] 6.9 ms 8.4 ms -17.63%
WallTime cuda/alp_f32/0%[100M] 2.5 ms 2.9 ms -16.55%
WallTime cuda/alp_f64/1%[100M] 6.6 ms 7.7 ms -14.06%
WallTime cuda/alp_f32/1%[100M] 4.8 ms 5.6 ms -13.99%
WallTime cuda/alp_f32/10%[100M] 4.5 ms 5.1 ms -12.92%
Simulation cold_misaligned[(64, 256)] 4.4 ms 5 ms -12.24%

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing joe/gpu-decompress-on-device (5b7e3a3) with develop (b363fb7)

Open in CodSpeed

Footnotes

  1. 46 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

GPU decompression verification

Verification failed. Per-dataset results:

2026-08-14T17:30:39.225341Z  INFO compress_bench::gpu_vortex: benchmarks/compress-bench/src/gpu_vortex.rs:364: verified 96 GPU-decoded Vortex fields against the CPU decode
2026-08-14T17:31:22.498171Z  INFO compress_bench::gpu_vortex: benchmarks/compress-bench/src/gpu_vortex.rs:364: verified 96 GPU-decoded Vortex fields against the CPU decode
2026-08-14T17:31:32.265456Z  INFO compress_bench::gpu_vortex: benchmarks/compress-bench/src/gpu_vortex.rs:364: verified 76 GPU-decoded Vortex fields against the CPU decode
2026-08-14T17:32:22.906180Z  INFO compress_bench::gpu_vortex: benchmarks/compress-bench/src/gpu_vortex.rs:364: verified 110 GPU-decoded Vortex fields against the CPU decode
2026-08-14T17:34:59.272716Z  INFO compress_bench::gpu_vortex: benchmarks/compress-bench/src/gpu_vortex.rs:364: verified 852 GPU-decoded Vortex fields against the CPU decode
2026-08-14T17:38:23.507221Z  INFO compress_bench::gpu_vortex: benchmarks/compress-bench/src/gpu_vortex.rs:364: verified 30 GPU-decoded Vortex fields against the CPU decode
2026-08-14T17:39:08.739569Z  INFO compress_bench::gpu_vortex: benchmarks/compress-bench/src/gpu_vortex.rs:364: verified 101 GPU-decoded Vortex fields against the CPU decode
GPU decompression failed for 2 dataset(s):
  - CMSprovider: panicked: Assertion failed error: expected host buffer
  - Euro2016: panicked: Assertion failed error: expected host buffer
Error: GPU decompression failed for: CMSprovider, Euro2016
Full error detail
             at /home/runner/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:206:18
  44: <&dyn core::ops::function::Fn<(), Output = i32> + core::panic::unwind_safe::RefUnwindSafe + core::marker::Sync as core::ops::function::FnOnce<()>>::call_once
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/core/src/ops/function.rs:287:21
  45: std::panicking::catch_unwind::do_call::<&dyn core::ops::function::Fn<(), Output = i32> + core::panic::unwind_safe::RefUnwindSafe + core::marker::Sync, i32>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panicking.rs:581:40
  46: std::panicking::catch_unwind::<i32, &dyn core::ops::function::Fn<(), Output = i32> + core::panic::unwind_safe::RefUnwindSafe + core::marker::Sync>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panicking.rs:544:19
  47: std::panic::catch_unwind::<&dyn core::ops::function::Fn<(), Output = i32> + core::panic::unwind_safe::RefUnwindSafe + core::marker::Sync, i32>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panic.rs:359:14
  48: std::rt::lang_start_internal::{closure#0}
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/rt.rs:175:24
  49: std::panicking::catch_unwind::do_call::<std::rt::lang_start_internal::{closure#0}, isize>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panicking.rs:581:40
  50: std::panicking::catch_unwind::<isize, std::rt::lang_start_internal::{closure#0}>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panicking.rs:544:19
  51: std::panic::catch_unwind::<std::rt::lang_start_internal::{closure#0}, isize>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panic.rs:359:14
  52: std::rt::lang_start_internal
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/rt.rs:171:5
  53: main
  54: <unknown>
  55: __libc_start_main
  56: _start

  - Euro2016: panicked: Assertion failed error: expected host buffer
Backtrace:
   0: <core::option::Option<&vortex_buffer::buffer::Buffer<u8>> as vortex_error::VortexExpect>::vortex_expect::{closure#0}
             at ./vortex-error/src/lib.rs:357:26
   1: <core::option::Option<&vortex_buffer::buffer::Buffer<u8>>>::unwrap_or_else::<<core::option::Option<&vortex_buffer::buffer::Buffer<u8>> as vortex_error::VortexExpect>::vortex_expect::{closure#0}>
             at /home/runner/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs:1064:21
   2: <core::option::Option<&vortex_buffer::buffer::Buffer<u8>> as vortex_error::VortexExpect>::vortex_expect
             at ./vortex-error/src/lib.rs:354:14
   3: <vortex_array::buffer::BufferHandle>::as_host
             at ./vortex-array/src/buffer.rs:271:28
   4: <vortex_array::array::typed::Array<vortex_array::arrays::bool::vtable::Bool> as vortex_array::arrays::bool::array::BoolArrayExt>::to_bit_buffer
             at ./vortex-array/src/arrays/bool/array.rs:106:32
   5: vortex_runend::decompress_bool::runend_decode_bools
             at ./encodings/runend/src/decompress_bool.rs:45:29
   6: vortex_runend::array::run_end_canonicalize
             at ./encodings/runend/src/array.rs:483:13
   7: <vortex_runend::array::RunEnd as vortex_array::array::vtable::VTable>::execute
             at ./encodings/runend/src/array.rs:180:9
   8: <vortex_array::array::typed::ArrayData<vortex_runend::array::RunEnd> as vortex_array::array::DynArrayData>::execute_unchecked
             at ./vortex-array/src/array/mod.rs:490:9
   9: <vortex_array::array::erased::ArrayRef>::execute_encoding_unchecked
             at ./vortex-array/src/array/erased.rs:669:33
  10: <vortex_array::array::erased::ArrayRef>::execute_until::<vortex_array::canonical::AnyCanonical>
             at ./vortex-array/src/executor.rs:273:40
  11: <vortex_array::canonical::Canonical as vortex_array::executor::Executable>::execute
             at ./vortex-array/src/canonical.rs:623:28
  12: <vortex_array::array::erased::ArrayRef>::execute::<vortex_array::canonical::Canonical>
             at ./vortex-array/src/executor.rs:84:9
  13: vortex_cuda::canonical::validity_into_host::{closure#0}
             at ./vortex-cuda/src/canonical.rs:53:14
  14: <vortex_array::canonical::Canonical as vortex_cuda::canonical::CanonicalCudaExt>::into_host::{closure#0}
             at ./vortex-cuda/src/canonical.rs:120:50
  15: <core::pin::Pin<alloc::boxed::Box<dyn core::future::future::Future<Output = core::result::Result<vortex_array::canonical::Canonical, vortex_error::VortexError>> + core::marker::Send>> as core::future::future::Future>::poll
             at /home/runner/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/future/future.rs:133:9
  16: <vortex_array::canonical::Canonical as vortex_cuda::canonical::CanonicalCudaExt>::into_host::{closure#0}
             at ./vortex-cuda/src/canonical.rs:174:22
  17: <core::pin::Pin<alloc::boxed::Box<dyn core::future::future::Future<Output = core::result::Result<vortex_array::canonical::Canonical, vortex_error::VortexError>> + core::marker::Send>> as core::future::future::Future>::poll
             at /home/runner/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/future/future.rs:133:9
  18: compress_bench::gpu_vortex::verify_against_host_scan::{closure#0}
             at ./benchmarks/compress-bench/src/gpu_vortex.rs:349:47
  19: <compress_bench::gpu_vortex::GpuVortexCompressor as vortex_bench::compress::Compressor>::decompress::{closure#0}
             at ./benchmarks/compress-bench/src/gpu_vortex.rs:108:78
  20: <core::pin::Pin<alloc::boxed::Box<dyn core::future::future::Future<Output = core::result::Result<core::time::Duration, anyhow::Error>> + core::marker::Send>> as core::future::future::Future>::poll
             at /home/runner/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/future/future.rs:133:9
  21: vortex_bench::compress::benchmark_decompress::{closure#0}
             at ./vortex-bench/src/compress/mod.rs:192:59
  22: compress_bench::run_benchmark_for_dataset::{closure#0}
             at ./benchmarks/compress-bench/src/main.rs:451:22
  23: <core::panic::unwind_safe::AssertUnwindSafe<compress_bench::run_benchmark_for_dataset::{closure#0}> as core::future::future::Future>::poll
             at /home/runner/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/panic/unwind_safe.rs:300:9
  24: <futures_util::future::future::catch_unwind::CatchUnwind<core::panic::unwind_safe::AssertUnwindSafe<compress_bench::run_benchmark_for_dataset::{closure#0}>> as core::future::future::Future>::poll::{closure#0}
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/futures-util-0.3.33/src/future/future/catch_unwind.rs:37:44
  25: <core::panic::unwind_safe::AssertUnwindSafe<<futures_util::future::future::catch_unwind::CatchUnwind<core::panic::unwind_safe::AssertUnwindSafe<compress_bench::run_benchmark_for_dataset::{closure#0}>> as core::future::future::Future>::poll::{closure#0}> as core::ops::function::FnOnce<()>>::call_once
             at /home/runner/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/panic/unwind_safe.rs:275:9
  26: std::panicking::catch_unwind::do_call::<core::panic::unwind_safe::AssertUnwindSafe<<futures_util::future::future::catch_unwind::CatchUnwind<core::panic::unwind_safe::AssertUnwindSafe<compress_bench::run_benchmark_for_dataset::{closure#0}>> as core::future::future::Future>::poll::{closure#0}>, core::task::poll::Poll<core::result::Result<(vortex_bench::compress::CompressMeasurements, alloc::vec::Vec<vortex_bench::v3::V3Record>), anyhow::Error>>>
             at /home/runner/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:581:40
  27: std::panicking::catch_unwind::<core::task::poll::Poll<core::result::Result<(vortex_bench::compress::CompressMeasurements, alloc::vec::Vec<vortex_bench::v3::V3Record>), anyhow::Error>>, core::panic::unwind_safe::AssertUnwindSafe<<futures_util::future::future::catch_unwind::CatchUnwind<core::panic::unwind_safe::AssertUnwindSafe<compress_bench::run_benchmark_for_dataset::{closure#0}>> as core::future::future::Future>::poll::{closure#0}>>
             at /home/runner/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panicking.rs:544:19
  28: std::panic::catch_unwind::<core::panic::unwind_safe::AssertUnwindSafe<<futures_util::future::future::catch_unwind::CatchUnwind<core::panic::unwind_safe::AssertUnwindSafe<compress_bench::run_benchmark_for_dataset::{closure#0}>> as core::future::future::Future>::poll::{closure#0}>, core::task::poll::Poll<core::result::Result<(vortex_bench::compress::CompressMeasurements, alloc::vec::Vec<vortex_bench::v3::V3Record>), anyhow::Error>>>
             at /home/runner/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/panic.rs:359:14
  29: <futures_util::future::future::catch_unwind::CatchUnwind<core::panic::unwind_safe::AssertUnwindSafe<compress_bench::run_benchmark_for_dataset::{closure#0}>> as core::future::future::Future>::poll
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/futures-util-0.3.33/src/future/future/catch_unwind.rs:37:9
  30: compress_bench::run_compress::{closure#0}
             at ./benchmarks/compress-bench/src/main.rs:313:56
  31: compress_bench::main::{closure#0}
             at ./benchmarks/compress-bench/src/main.rs:155:6
  32: <tokio::runtime::park::CachedParkThread>::block_on::<compress_bench::main::{closure#0}>::{closure#0}
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/runtime/park.rs:284:71
  33: tokio::task::coop::with_budget::<core::task::poll::Poll<core::result::Result<(), anyhow::Error>>, <tokio::runtime::park::CachedParkThread>::block_on<compress_bench::main::{closure#0}>::{closure#0}>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/task/coop/mod.rs:167:5
  34: tokio::task::coop::budget::<core::task::poll::Poll<core::result::Result<(), anyhow::Error>>, <tokio::runtime::park::CachedParkThread>::block_on<compress_bench::main::{closure#0}>::{closure#0}>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/task/coop/mod.rs:133:5
  35: <tokio::runtime::park::CachedParkThread>::block_on::<compress_bench::main::{closure#0}>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/runtime/park.rs:284:31
  36: <tokio::runtime::context::blocking::BlockingRegionGuard>::block_on::<compress_bench::main::{closure#0}>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/runtime/context/blocking.rs:66:14
  37: <tokio::runtime::scheduler::multi_thread::MultiThread>::block_on::<compress_bench::main::{closure#0}>::{closure#0}
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/runtime/scheduler/multi_thread/mod.rs:92:22
  38: tokio::runtime::context::runtime::enter_runtime::<<tokio::runtime::scheduler::multi_thread::MultiThread>::block_on<compress_bench::main::{closure#0}>::{closure#0}, core::result::Result<(), anyhow::Error>>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/runtime/context/runtime.rs:65:16
  39: <tokio::runtime::scheduler::multi_thread::MultiThread>::block_on::<compress_bench::main::{closure#0}>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/runtime/scheduler/multi_thread/mod.rs:91:9
  40: <tokio::runtime::runtime::Runtime>::block_on_inner::<compress_bench::main::{closure#0}>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/runtime/runtime.rs:376:50
  41: <tokio::runtime::runtime::Runtime>::block_on::<compress_bench::main::{closure#0}>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/runtime/runtime.rs:343:18
  42: compress_bench::main
             at ./benchmarks/compress-bench/src/main.rs:155:6
  43: <fn() -> core::result::Result<(), anyhow::Error> as core::ops::function::FnOnce<()>>::call_once
             at /home/runner/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5
  44: std::sys::backtrace::__rust_begin_short_backtrace::<fn() -> core::result::Result<(), anyhow::Error>, core::result::Result<(), anyhow::Error>>
             at /home/runner/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys/backtrace.rs:166:18
  45: std::rt::lang_start::<core::result::Result<(), anyhow::Error>>::{closure#0}
             at /home/runner/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:206:18
  46: <&dyn core::ops::function::Fn<(), Output = i32> + core::panic::unwind_safe::RefUnwindSafe + core::marker::Sync as core::ops::function::FnOnce<()>>::call_once
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/core/src/ops/function.rs:287:21
  47: std::panicking::catch_unwind::do_call::<&dyn core::ops::function::Fn<(), Output = i32> + core::panic::unwind_safe::RefUnwindSafe + core::marker::Sync, i32>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panicking.rs:581:40
  48: std::panicking::catch_unwind::<i32, &dyn core::ops::function::Fn<(), Output = i32> + core::panic::unwind_safe::RefUnwindSafe + core::marker::Sync>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panicking.rs:544:19
  49: std::panic::catch_unwind::<&dyn core::ops::function::Fn<(), Output = i32> + core::panic::unwind_safe::RefUnwindSafe + core::marker::Sync, i32>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panic.rs:359:14
  50: std::rt::lang_start_internal::{closure#0}
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/rt.rs:175:24
  51: std::panicking::catch_unwind::do_call::<std::rt::lang_start_internal::{closure#0}, isize>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panicking.rs:581:40
  52: std::panicking::catch_unwind::<isize, std::rt::lang_start_internal::{closure#0}>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panicking.rs:544:19
  53: std::panic::catch_unwind::<std::rt::lang_start_internal::{closure#0}, isize>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panic.rs:359:14
  54: std::rt::lang_start_internal
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/rt.rs:171:5
  55: main
  56: <unknown>
  57: __libc_start_main
  58: _start

Error: GPU decompression failed for: CMSprovider, Euro2016

Stack backtrace:
   0: <anyhow::Error>::msg::<alloc::string::String>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/anyhow-1.0.104/src/backtrace.rs:10:14
   1: compress_bench::run_compress::{closure#0}
             at ./benchmarks/compress-bench/src/main.rs:373:9
   2: compress_bench::main::{closure#0}
             at ./benchmarks/compress-bench/src/main.rs:155:6
   3: <tokio::runtime::park::CachedParkThread>::block_on::<compress_bench::main::{closure#0}>::{closure#0}
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/runtime/park.rs:284:71
   4: tokio::task::coop::with_budget::<core::task::poll::Poll<core::result::Result<(), anyhow::Error>>, <tokio::runtime::park::CachedParkThread>::block_on<compress_bench::main::{closure#0}>::{closure#0}>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/task/coop/mod.rs:167:5
   5: tokio::task::coop::budget::<core::task::poll::Poll<core::result::Result<(), anyhow::Error>>, <tokio::runtime::park::CachedParkThread>::block_on<compress_bench::main::{closure#0}>::{closure#0}>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/task/coop/mod.rs:133:5
   6: <tokio::runtime::park::CachedParkThread>::block_on::<compress_bench::main::{closure#0}>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/runtime/park.rs:284:31
   7: <tokio::runtime::context::blocking::BlockingRegionGuard>::block_on::<compress_bench::main::{closure#0}>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/runtime/context/blocking.rs:66:14
   8: <tokio::runtime::scheduler::multi_thread::MultiThread>::block_on::<compress_bench::main::{closure#0}>::{closure#0}
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/runtime/scheduler/multi_thread/mod.rs:92:22
   9: tokio::runtime::context::runtime::enter_runtime::<<tokio::runtime::scheduler::multi_thread::MultiThread>::block_on<compress_bench::main::{closure#0}>::{closure#0}, core::result::Result<(), anyhow::Error>>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/runtime/context/runtime.rs:65:16
  10: <tokio::runtime::scheduler::multi_thread::MultiThread>::block_on::<compress_bench::main::{closure#0}>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/runtime/scheduler/multi_thread/mod.rs:91:9
  11: <tokio::runtime::runtime::Runtime>::block_on_inner::<compress_bench::main::{closure#0}>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/runtime/runtime.rs:376:50
  12: <tokio::runtime::runtime::Runtime>::block_on::<compress_bench::main::{closure#0}>
             at /home/runner/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/tokio-1.53.1/src/runtime/runtime.rs:343:18
  13: compress_bench::main
             at ./benchmarks/compress-bench/src/main.rs:155:6
  14: <fn() -> core::result::Result<(), anyhow::Error> as core::ops::function::FnOnce<()>>::call_once
             at /home/runner/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:250:5
  15: std::sys::backtrace::__rust_begin_short_backtrace::<fn() -> core::result::Result<(), anyhow::Error>, core::result::Result<(), anyhow::Error>>
             at /home/runner/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys/backtrace.rs:166:18
  16: std::rt::lang_start::<core::result::Result<(), anyhow::Error>>::{closure#0}
             at /home/runner/.rustup/toolchains/1.97.1-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:206:18
  17: <&dyn core::ops::function::Fn<(), Output = i32> + core::panic::unwind_safe::RefUnwindSafe + core::marker::Sync as core::ops::function::FnOnce<()>>::call_once
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/core/src/ops/function.rs:287:21
  18: std::panicking::catch_unwind::do_call::<&dyn core::ops::function::Fn<(), Output = i32> + core::panic::unwind_safe::RefUnwindSafe + core::marker::Sync, i32>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panicking.rs:581:40
  19: std::panicking::catch_unwind::<i32, &dyn core::ops::function::Fn<(), Output = i32> + core::panic::unwind_safe::RefUnwindSafe + core::marker::Sync>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panicking.rs:544:19
  20: std::panic::catch_unwind::<&dyn core::ops::function::Fn<(), Output = i32> + core::panic::unwind_safe::RefUnwindSafe + core::marker::Sync, i32>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panic.rs:359:14
  21: std::rt::lang_start_internal::{closure#0}
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/rt.rs:175:24
  22: std::panicking::catch_unwind::do_call::<std::rt::lang_start_internal::{closure#0}, isize>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panicking.rs:581:40
  23: std::panicking::catch_unwind::<isize, std::rt::lang_start_internal::{closure#0}>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panicking.rs:544:19
  24: std::panic::catch_unwind::<std::rt::lang_start_internal::{closure#0}, isize>
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/panic.rs:359:14
  25: std::rt::lang_start_internal
             at /rustc/8bab26f4f68e0e26f0bb7960be334d5b520ea452/library/std/src/rt.rs:171:5
  26: main
  27: <unknown>
  28: __libc_start_main
  29: _start

@github-actions

github-actions Bot commented Aug 14, 2026

Copy link
Copy Markdown
Contributor

GPU Compression

┌───────────────────────────────────────────┬─────────────────────┬────────────────────────┐
│ Benchmark                                 │ parquet             │ vortex-file-compressed │
├───────────────────────────────────────────┼─────────────────────┼────────────────────────┤
│ decompress time/TPC-H l_comment canonical │ 243914.00 μs (1.00) │�[102m�[30m �[49m�[39m�[102m�[30m45611.00 μs (0.19)�[49m�[39m�[102m�[30m    �[49m�[39m�[102m�[30m �[49m�[39m│
├───────────────────────────────────────────┼─────────────────────┼────────────────────────┤
│ decompress time/TPC-H l_comment chunked   │ 244311.00 μs (1.00) │�[102m�[30m �[49m�[39m�[102m�[30m49250.00 μs (0.20)�[49m�[39m�[102m�[30m    �[49m�[39m�[102m�[30m �[49m�[39m│
├───────────────────────────────────────────┼─────────────────────┼────────────────────────┤
│ decompress time/taxi                      │ 93971.00 μs (1.00)  │�[102m�[30m �[49m�[39m�[102m�[30m20932.00 μs (0.22)�[49m�[39m�[102m�[30m    �[49m�[39m�[102m�[30m �[49m�[39m│
├───────────────────────────────────────────┼─────────────────────┼────────────────────────┤
│ decompress time/Arade                     │ 295318.00 μs (1.00) │�[102m�[30m �[49m�[39m�[102m�[30m60929.00 μs (0.21)�[49m�[39m�[102m�[30m    �[49m�[39m�[102m�[30m �[49m�[39m│
├───────────────────────────────────────────┼─────────────────────┼────────────────────────┤
│ decompress time/Bimbo                     │ 175495.00 μs (1.00) │�[102m�[30m �[49m�[39m�[102m�[30m174281.00 μs (0.99)�[49m�[39m�[102m�[30m   �[49m�[39m�[102m�[30m �[49m�[39m│
├───────────────────────────────────────────┼─────────────────────┼────────────────────────┤
│ decompress time/CMSprovider               │ 443132.00 μs (1.00) │�[102m�[30m �[49m�[39m�[102m�[30m311727.00 μs (0.70)�[49m�[39m�[102m�[30m   �[49m�[39m�[102m�[30m �[49m�[39m│
├───────────────────────────────────────────┼─────────────────────┼────────────────────────┤
│ decompress time/Euro2016                  │ 207189.00 μs (1.00) │�[102m�[30m �[49m�[39m�[102m�[30m45283.00 μs (0.22)�[49m�[39m�[102m�[30m    �[49m�[39m�[102m�[30m �[49m�[39m│
├───────────────────────────────────────────┼─────────────────────┼────────────────────────┤
│ decompress time/Food                      │ 103779.00 μs (1.00) │�[102m�[30m �[49m�[39m�[102m�[30m28179.00 μs (0.27)�[49m�[39m�[102m�[30m    �[49m�[39m�[102m�[30m �[49m�[39m│
├───────────────────────────────────────────┼─────────────────────┼────────────────────────┤
│ decompress time/HashTags                  │ 257118.00 μs (1.00) │�[102m�[30m �[49m�[39m�[102m�[30m120578.00 μs (0.47)�[49m�[39m�[102m�[30m   �[49m�[39m�[102m�[30m �[49m�[39m│
└───────────────────────────────────────────┴─────────────────────┴────────────────────────┘
┌───────────────────────────────────────────────────────────────────────────┬────────────────────────┐
│ Benchmark                                                                 │ vortex-file-compressed │
├───────────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-snappy gpu ratio decompress time/TPC-H l_comment canonical │ 0.19 ratio (1.00)      │
├───────────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-snappy gpu ratio decompress time/TPC-H l_comment chunked   │ 0.20 ratio (1.00)      │
├───────────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-snappy gpu ratio decompress time/taxi                      │ 0.22 ratio (1.00)      │
├───────────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-snappy gpu ratio decompress time/Arade                     │ 0.21 ratio (1.00)      │
├───────────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-snappy gpu ratio decompress time/Bimbo                     │ 0.99 ratio (1.00)      │
├───────────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-snappy gpu ratio decompress time/CMSprovider               │ 0.70 ratio (1.00)      │
├───────────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-snappy gpu ratio decompress time/Euro2016                  │ 0.22 ratio (1.00)      │
├───────────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-snappy gpu ratio decompress time/Food                      │ 0.27 ratio (1.00)      │
├───────────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-snappy gpu ratio decompress time/HashTags                  │ 0.47 ratio (1.00)      │
└───────────────────────────────────────────────────────────────────────────┴────────────────────────┘

CPU baseline (same machine, same datasets)

┌───────────────────────────────────────────┬──────────────────────┬────────────────────────┐
│ Benchmark                                 │ parquet              │ vortex-file-compressed │
├───────────────────────────────────────────┼──────────────────────┼────────────────────────┤
│ decompress time/taxi                      │ 320663.00 μs (1.00)  │�[102m�[30m �[49m�[39m�[102m�[30m54301.00 μs (0.17)�[49m�[39m�[102m�[30m    �[49m�[39m�[102m�[30m �[49m�[39m│
├───────────────────────────────────────────┼──────────────────────┼────────────────────────┤
│ decompress time/Arade                     │ 725946.00 μs (1.00)  │�[102m�[30m �[49m�[39m�[102m�[30m87420.00 μs (0.12)�[49m�[39m�[102m�[30m    �[49m�[39m�[102m�[30m �[49m�[39m│
├───────────────────────────────────────────┼──────────────────────┼────────────────────────┤
│ decompress time/Bimbo                     │ 2470558.00 μs (1.00) │�[102m�[30m �[49m�[39m�[102m�[30m458379.00 μs (0.19)�[49m�[39m�[102m�[30m   �[49m�[39m�[102m�[30m �[49m�[39m│
├───────────────────────────────────────────┼──────────────────────┼────────────────────────┤
│ decompress time/CMSprovider               │ 2072370.00 μs (1.00) │�[102m�[30m �[49m�[39m�[102m�[30m285252.00 μs (0.14)�[49m�[39m�[102m�[30m   �[49m�[39m�[102m�[30m �[49m�[39m│
├───────────────────────────────────────────┼──────────────────────┼────────────────────────┤
│ decompress time/Euro2016                  │ 413042.00 μs (1.00)  │�[102m�[30m �[49m�[39m�[102m�[30m94141.00 μs (0.23)�[49m�[39m�[102m�[30m    �[49m�[39m�[102m�[30m �[49m�[39m│
├───────────────────────────────────────────┼──────────────────────┼────────────────────────┤
│ decompress time/Food                      │ 242762.00 μs (1.00)  │�[102m�[30m �[49m�[39m�[102m�[30m27045.00 μs (0.11)�[49m�[39m�[102m�[30m    �[49m�[39m�[102m�[30m �[49m�[39m│
├───────────────────────────────────────────┼──────────────────────┼────────────────────────┤
│ decompress time/HashTags                  │ 693554.00 μs (1.00)  │�[102m�[30m �[49m�[39m�[102m�[30m385959.00 μs (0.56)�[49m�[39m�[102m�[30m   �[49m�[39m�[102m�[30m �[49m�[39m│
├───────────────────────────────────────────┼──────────────────────┼────────────────────────┤
│ decompress time/TPC-H l_comment chunked   │ 690876.00 μs (1.00)  │�[102m�[30m �[49m�[39m�[102m�[30m159366.00 μs (0.23)�[49m�[39m�[102m�[30m   �[49m�[39m�[102m�[30m �[49m�[39m│
├───────────────────────────────────────────┼──────────────────────┼────────────────────────┤
│ decompress time/TPC-H l_comment canonical │ 683897.00 μs (1.00)  │�[102m�[30m �[49m�[39m�[102m�[30m159635.00 μs (0.23)�[49m�[39m�[102m�[30m   �[49m�[39m�[102m�[30m �[49m�[39m│
└───────────────────────────────────────────┴──────────────────────┴────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┬────────────────────────┐
│ Benchmark                                                           │ vortex-file-compressed │
├─────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-zstd ratio decompress time/taxi                      │ 0.17 ratio (1.00)      │
├─────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-zstd ratio decompress time/Arade                     │ 0.12 ratio (1.00)      │
├─────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-zstd ratio decompress time/Bimbo                     │ 0.19 ratio (1.00)      │
├─────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-zstd ratio decompress time/CMSprovider               │ 0.14 ratio (1.00)      │
├─────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-zstd ratio decompress time/Euro2016                  │ 0.23 ratio (1.00)      │
├─────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-zstd ratio decompress time/Food                      │ 0.11 ratio (1.00)      │
├─────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-zstd ratio decompress time/HashTags                  │ 0.56 ratio (1.00)      │
├─────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-zstd ratio decompress time/TPC-H l_comment chunked   │ 0.23 ratio (1.00)      │
├─────────────────────────────────────────────────────────────────────┼────────────────────────┤
│ vortex:parquet-zstd ratio decompress time/TPC-H l_comment canonical │ 0.23 ratio (1.00)      │
└─────────────────────────────────────────────────────────────────────┴────────────────────────┘

Signed-off-by: Joe Isaacs <2413449+joseph-isaacs@users.noreply.github.com>
Signed-off-by: Joe Isaacs <2413449+joseph-isaacs@users.noreply.github.com>
@joseph-isaacs joseph-isaacs added the action/bench-gpu-compress Run only the GPU compression benchmark on this PR label Aug 14, 2026
@github-actions github-actions Bot removed the action/bench-gpu-compress Run only the GPU compression benchmark on this PR label Aug 14, 2026
Signed-off-by: Joe Isaacs <2413449+joseph-isaacs@users.noreply.github.com>
Signed-off-by: Joe Isaacs <2413449+joseph-isaacs@users.noreply.github.com>
Signed-off-by: Joe Isaacs <2413449+joseph-isaacs@users.noreply.github.com>
Signed-off-by: Joe Isaacs <2413449+joseph-isaacs@users.noreply.github.com>
Signed-off-by: Joe Isaacs <2413449+joseph-isaacs@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants