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

Reply via email to