diff --git a/cpp/benchmarks/io/nvbench_helpers.hpp b/cpp/benchmarks/io/nvbench_helpers.hpp index ebffb930c275..99aaa55d4a5a 100644 --- a/cpp/benchmarks/io/nvbench_helpers.hpp +++ b/cpp/benchmarks/io/nvbench_helpers.hpp @@ -137,6 +137,8 @@ NVBENCH_DECLARE_ENUM_TYPE_STRINGS( enum class converts_strings : bool { YES, NO }; +enum class output_dict : bool { YES, NO }; + enum class uses_pandas_metadata : bool { YES, NO }; NVBENCH_DECLARE_ENUM_TYPE_STRINGS( @@ -150,6 +152,17 @@ NVBENCH_DECLARE_ENUM_TYPE_STRINGS( }, [](auto) { return std::string{}; }) +NVBENCH_DECLARE_ENUM_TYPE_STRINGS( + output_dict, + [](auto value) { + switch (value) { + case output_dict::YES: return "YES"; + case output_dict::NO: return "NO"; + default: return "Unknown"; + } + }, + [](auto) { return std::string{}; }) + NVBENCH_DECLARE_ENUM_TYPE_STRINGS( uses_pandas_metadata, [](auto value) { diff --git a/cpp/benchmarks/io/parquet/parquet_reader_options.cpp b/cpp/benchmarks/io/parquet/parquet_reader_options.cpp index 07c12ab41fab..c0e114c73d6f 100644 --- a/cpp/benchmarks/io/parquet/parquet_reader_options.cpp +++ b/cpp/benchmarks/io/parquet/parquet_reader_options.cpp @@ -1,5 +1,5 @@ /* - * SPDX-FileCopyrightText: Copyright (c) 2022-2026, NVIDIA CORPORATION. + * SPDX-FileCopyrightText: Copyright (c) 2022-2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved. * SPDX-License-Identifier: Apache-2.0 */ @@ -37,18 +37,21 @@ template void BM_parquet_read_options(nvbench::state& state, nvbench::type_list, nvbench::enum_type, nvbench::enum_type, nvbench::enum_type, + nvbench::enum_type, nvbench::enum_type>) { auto const num_chunks = RowSelection == row_selection::ALL ? 1 : chunked_read_num_chunks; - auto constexpr str_to_categories = ConvertsStrings == converts_strings::YES; - auto constexpr uses_pd_metadata = UsesPandasMetadata == uses_pandas_metadata::YES; + auto constexpr str_to_categories = ConvertsStrings == converts_strings::YES; + auto constexpr output_dict_columns = OutputDict == output_dict::YES; + auto constexpr uses_pd_metadata = UsesPandasMetadata == uses_pandas_metadata::YES; auto const ts_type = cudf::data_type{Timestamp}; @@ -84,6 +87,7 @@ void BM_parquet_read_options(nvbench::state& state, cudf::io::parquet_reader_options::builder(source_sink.make_source_info()) .column_names(cols_to_read) .convert_strings_to_categories(str_to_categories) + .output_dict_columns(output_dict_columns) .use_pandas_metadata(uses_pd_metadata) .timestamp_type(ts_type); @@ -139,12 +143,14 @@ NVBENCH_BENCH_TYPES(BM_parquet_read_options, row_selections, nvbench::enum_type_list, nvbench::enum_type_list, + nvbench::enum_type_list, nvbench::enum_type_list)) .set_name("parquet_read_row_selection") .set_type_axes_names({"column_selection", "row_selection", "str_to_categories", "uses_pandas_metadata", + "output_dict_columns", "timestamp_type"}) .set_min_samples(4) // NOTE: row_selection::ROW_GROUPS reads a fraction of row groups; non-zero @@ -161,12 +167,14 @@ NVBENCH_BENCH_TYPES(BM_parquet_read_options, nvbench::enum_type_list, nvbench::enum_type_list, nvbench::enum_type_list, + nvbench::enum_type_list, nvbench::enum_type_list)) .set_name("parquet_read_column_selection") .set_type_axes_names({"column_selection", "row_selection", "str_to_categories", "uses_pandas_metadata", + "output_dict_columns", "timestamp_type"}) .set_min_samples(4) .add_int64_axis("row_group_size_bytes", {0}) @@ -178,13 +186,39 @@ NVBENCH_BENCH_TYPES( nvbench::enum_type_list, nvbench::enum_type_list, nvbench::enum_type_list, + nvbench::enum_type_list, nvbench::enum_type_list)) .set_name("parquet_read_misc_options") .set_type_axes_names({"column_selection", "row_selection", "str_to_categories", "uses_pandas_metadata", + "output_dict_columns", "timestamp_type"}) .set_min_samples(4) .add_int64_axis("row_group_size_bytes", {0}) .add_int64_axis("row_group_size_rows", {0}); + +// Sweep `output_dict_columns` on/off. Only flat STRING columns are dictionary-transcoded, so this +// case reports read throughput and peak memory for both the direct transcode (YES) and the plain +// STRING materialization (NO). Varying `row_group_size_rows` exercises the single-row-group fast +// path (few, large row groups) versus the multi-row-group concatenate path (many, small ones). +NVBENCH_BENCH_TYPES(BM_parquet_read_options, + NVBENCH_TYPE_AXES(nvbench::enum_type_list, + nvbench::enum_type_list, + nvbench::enum_type_list, + nvbench::enum_type_list, + nvbench::enum_type_list, + nvbench::enum_type_list)) + .set_name("parquet_read_dict_output") + .set_type_axes_names({"column_selection", + "row_selection", + "str_to_categories", + "uses_pandas_metadata", + "output_dict_columns", + "timestamp_type"}) + .set_min_samples(4) + .add_int64_axis("row_group_size_bytes", {0}) + // 0 == cuDF default (1,000,000 rows/RG → few, large row groups); 100,000 forces ~10x more, + // smaller row groups, exercising the multi-row-group concatenate path. + .add_int64_axis("row_group_size_rows", {0, 100'000});