From c13044f4a273086b919882d071e77cc1b993e049 Mon Sep 17 00:00:00 2001 From: Abigale Kim Date: Tue, 11 Aug 2026 23:27:33 +0000 Subject: [PATCH] optimization --- .../parquet/experimental/variant_extract.cu | 57 ++++++++++++++----- 1 file changed, 43 insertions(+), 14 deletions(-) diff --git a/cpp/src/io/parquet/experimental/variant_extract.cu b/cpp/src/io/parquet/experimental/variant_extract.cu index 8327e6c5cde..7c8e09466cc 100644 --- a/cpp/src/io/parquet/experimental/variant_extract.cu +++ b/cpp/src/io/parquet/experimental/variant_extract.cu @@ -297,7 +297,9 @@ __device__ cuda::std::optional find_key_in_metadata(device_span locate_object_field(device_span val, int id) +__device__ device_span locate_object_field(device_span val, + int id, + bool is_sorted) { auto const val_len = static_cast(val.size()); if (val_len < 1) { return {}; } @@ -324,20 +326,46 @@ __device__ device_span locate_object_field(device_span values_extent) { return {}; } - match_start = match_offset.value(); - found = true; - break; + if (is_sorted) { + size_type lo = 0; + size_type hi = num_fields.value(); + while (lo < hi) { + size_type const mid = lo + (hi - lo) / 2; + auto const current_id = read_uint64(val, ids_start + mid * id_size, id_size); + if (!current_id.has_value()) { return {}; } + if (cuda::std::cmp_equal(current_id.value(), id)) { + auto const match_offset = read_uint64(val, offsets_start + mid * offset_size, offset_size); + if (!match_offset.has_value()) { return {}; } + if (match_offset.value() > values_extent) { return {}; } + match_start = match_offset.value(); + found = true; + break; + } + if (cuda::std::cmp_less(current_id.value(), id)) { + lo = mid + 1; + } else { + hi = mid; + } + } + } else { + for (size_type i = 0; i < num_fields.value(); ++i) { + auto const current_id = read_uint64(val, ids_start + i * id_size, id_size); + if (!current_id.has_value()) { return {}; } + if (cuda::std::cmp_not_equal(current_id.value(), id)) { continue; } + + auto const match_offset = read_uint64(val, offsets_start + i * offset_size, offset_size); + if (!match_offset.has_value()) { return {}; } + if (match_offset.value() > values_extent) { return {}; } + match_start = match_offset.value(); + found = true; + break; + } } if (!found) { return {}; } @@ -519,6 +547,7 @@ __device__ device_span resolve_path(device_span me device_span val, column_device_view path) { + bool const is_sorted = !meta.empty() && ((meta[0] >> 4) & 0x01); device_span sub_val = val; for (size_type i = 0; i < path.size(); ++i) { auto const step = path.element(i); @@ -530,7 +559,7 @@ __device__ device_span resolve_path(device_span me } else { auto const field_id = find_key_in_metadata(meta, step); if (!field_id.has_value()) { return {}; } - sub_val = locate_object_field(sub_val, field_id.value()); + sub_val = locate_object_field(sub_val, field_id.value(), is_sorted); } if (sub_val.empty()) { return {}; } }