This is an automated email from the ASF dual-hosted git repository. kxiao pushed a commit to branch branch-2.0-beta in repository https://gitbox.apache.org/repos/asf/doris.git
commit 46e2277a304399a2ff77a41adcd82c26bb1eae94 Author: Gabriel <gabrielleeb...@gmail.com> AuthorDate: Fri Jun 9 13:10:57 2023 +0800 [Improvement](column) reduce cache miss for data copy (#20583) --- be/src/vec/columns/column.h | 1 + be/src/vec/columns/column_decimal.h | 3 +++ be/src/vec/columns/column_string.cpp | 3 +++ be/src/vec/columns/column_string.h | 5 +++++ be/src/vec/columns/column_vector.cpp | 6 ++++++ be/src/vec/exec/join/vhash_join_node.cpp | 4 ++-- 6 files changed, 20 insertions(+), 2 deletions(-) diff --git a/be/src/vec/columns/column.h b/be/src/vec/columns/column.h index 8bf83b533c..00f1824b99 100644 --- a/be/src/vec/columns/column.h +++ b/be/src/vec/columns/column.h @@ -98,6 +98,7 @@ protected: using Offsets64 = PaddedPODArray<Offset64>; public: + static constexpr int PREFETCH_STEP = 64; // 32bit offsets for string using Offset = UInt32; using Offsets = PaddedPODArray<Offset>; diff --git a/be/src/vec/columns/column_decimal.h b/be/src/vec/columns/column_decimal.h index 26a9abde9a..f935c0c826 100644 --- a/be/src/vec/columns/column_decimal.h +++ b/be/src/vec/columns/column_decimal.h @@ -129,6 +129,9 @@ public: const T* src_data = reinterpret_cast<const T*>(src.get_raw_data().data); for (int i = 0; i < new_size; ++i) { + if (i + IColumn::PREFETCH_STEP < new_size) { + __builtin_prefetch(&src_data[indices_begin[i + IColumn::PREFETCH_STEP]], 0, 1); + } data[origin_size + i] = src_data[indices_begin[i]]; } } diff --git a/be/src/vec/columns/column_string.cpp b/be/src/vec/columns/column_string.cpp index 66fec57787..81ee29a70f 100644 --- a/be/src/vec/columns/column_string.cpp +++ b/be/src/vec/columns/column_string.cpp @@ -113,6 +113,9 @@ void ColumnString::insert_indices_from(const IColumn& src, const int* indices_be if (*x == -1) { ColumnString::insert_default(); } else { + if (x + IColumn::PREFETCH_STEP < indices_end) { + ColumnString::prefetch(src, *(x + IColumn::PREFETCH_STEP)); + } ColumnString::insert_from(src, *x); } } diff --git a/be/src/vec/columns/column_string.h b/be/src/vec/columns/column_string.h index 06e8914907..66d0a77e5d 100644 --- a/be/src/vec/columns/column_string.h +++ b/be/src/vec/columns/column_string.h @@ -149,6 +149,11 @@ public: offsets.push_back(new_size); } + void prefetch(const IColumn& src_, size_t n) { + const ColumnString& src = assert_cast<const ColumnString&>(src_); + __builtin_prefetch(&src.chars[src.offsets[n - 1]], 0, 1); + } + void insert_from(const IColumn& src_, size_t n) override { const ColumnString& src = assert_cast<const ColumnString&>(src_); const size_t size_to_append = diff --git a/be/src/vec/columns/column_vector.cpp b/be/src/vec/columns/column_vector.cpp index 388b436bc5..35534d95e7 100644 --- a/be/src/vec/columns/column_vector.cpp +++ b/be/src/vec/columns/column_vector.cpp @@ -376,12 +376,18 @@ void ColumnVector<T>::insert_indices_from(const IColumn& src, const int* indices if constexpr (std::is_same_v<T, UInt8>) { // nullmap : indices_begin[i] == -1 means is null at the here, set true here for (int i = 0; i < new_size; ++i) { + if (i + IColumn::PREFETCH_STEP < new_size) { + __builtin_prefetch(&src_data[indices_begin[i + IColumn::PREFETCH_STEP]], 0, 1); + } data[origin_size + i] = (indices_begin[i] == -1) + (indices_begin[i] != -1) * src_data[indices_begin[i]]; } } else { // real data : indices_begin[i] == -1 what at is meaningless for (int i = 0; i < new_size; ++i) { + if (i + IColumn::PREFETCH_STEP < new_size) { + __builtin_prefetch(&src_data[indices_begin[i + IColumn::PREFETCH_STEP]], 0, 1); + } data[origin_size + i] = src_data[indices_begin[i]]; } } diff --git a/be/src/vec/exec/join/vhash_join_node.cpp b/be/src/vec/exec/join/vhash_join_node.cpp index c2b9d915ec..e47cda7d1d 100644 --- a/be/src/vec/exec/join/vhash_join_node.cpp +++ b/be/src/vec/exec/join/vhash_join_node.cpp @@ -469,6 +469,8 @@ Status HashJoinNode::prepare(RuntimeState* state) { _build_rows_counter = ADD_COUNTER(record_profile, "BuildRows", TUnit::UNIT); _build_side_compute_hash_timer = ADD_TIMER(record_profile, "BuildSideHashComputingTime"); _build_runtime_filter_timer = ADD_TIMER(record_profile, "BuildRuntimeFilterTime"); + _push_down_timer = ADD_TIMER(record_profile, "PublishRuntimeFilterTime"); + _push_compute_timer = ADD_TIMER(record_profile, "PushDownComputeTime"); // Probe phase auto probe_phase_profile = runtime_profile()->create_child("ProbePhase", true, true); @@ -484,8 +486,6 @@ Status HashJoinNode::prepare(RuntimeState* state) { _open_timer = ADD_TIMER(runtime_profile(), "OpenTime"); _allocate_resource_timer = ADD_TIMER(runtime_profile(), "AllocateResourceTime"); - _push_down_timer = ADD_TIMER(runtime_profile(), "PublishRuntimeFilterTime"); - _push_compute_timer = ADD_TIMER(runtime_profile(), "PushDownComputeTime"); _build_buckets_counter = ADD_COUNTER(runtime_profile(), "BuildBuckets", TUnit::UNIT); _build_buckets_fill_counter = ADD_COUNTER(runtime_profile(), "FilledBuckets", TUnit::UNIT); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org