Skip to content
This repository was archived by the owner on May 9, 2024. It is now read-only.

Commit 73d181e

Browse files
akroviakovkurapov-peter
authored andcommitted
reduce copy in multifrag query mem init
1 parent ff6b55e commit 73d181e

File tree

6 files changed

+39
-30
lines changed

6 files changed

+39
-30
lines changed

.gitignore

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ version.py
1111
__pycache__
1212

1313
# Logs
14-
hdk_log/*
14+
*/hdk_log/*
1515
omniscidb/Calcite/java/calcite/hdk-log-java-test/*
1616
omniscidb/Calcite/java/calcite/dependency-reduced-pom.xml
1717
hdk-log-java-test

omniscidb/QueryEngine/QueryExecutionContext.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -124,9 +124,9 @@ ResultSetPtr QueryExecutionContext::groupBufferToDeinterleavedResults(
124124
auto deinterleaved_result_set =
125125
std::make_shared<ResultSet>(result_set->getTargetInfos(),
126126
std::vector<ColumnLazyFetchInfo>{},
127-
std::vector<std::vector<const int8_t*>>{},
128-
std::vector<std::vector<int64_t>>{},
129-
std::vector<int64_t>{},
127+
nullptr,
128+
nullptr,
129+
nullptr,
130130
ExecutorDeviceType::CPU,
131131
-1,
132132
deinterleaved_query_mem_desc,

omniscidb/QueryEngine/QueryMemoryInitializer.cpp

+9-8
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,12 @@ QueryMemoryInitializer::QueryMemoryInitializer(
383383
group_by_buffers_.push_back(varlen_output_buffer);
384384
}
385385

386+
ColBuffersPtr res_set_col_buf = std::make_shared<const ColBuffers>(col_buffers);
387+
FragOffsetsPtr res_set_col_frag_offsets = std::make_shared<const FragOffsets>(
388+
get_col_frag_offsets(ra_exe_unit.target_exprs, frag_offsets));
389+
FragSizesPtr res_set_frag_sizes = std::make_shared<const FragSizes>(
390+
get_consistent_frags_sizes(ra_exe_unit.target_exprs, consistent_frag_sizes));
391+
386392
for (size_t i = 0; i < group_buffers_count; i += step) {
387393
auto group_by_buffer = alloc_group_by_buffer(
388394
actual_group_buffer_size, thread_idx_, row_set_mem_owner_.get());
@@ -419,19 +425,14 @@ QueryMemoryInitializer::QueryMemoryInitializer(
419425
group_by_buffers_.push_back(nullptr);
420426
}
421427

422-
const auto column_frag_offsets =
423-
get_col_frag_offsets(ra_exe_unit.target_exprs, frag_offsets);
424-
const auto column_frag_sizes =
425-
get_consistent_frags_sizes(ra_exe_unit.target_exprs, consistent_frag_sizes);
426-
427428
result_sets_.emplace_back(new ResultSet(
428429
target_exprs_to_infos(ra_exe_unit.target_exprs,
429430
query_mem_desc,
430431
executor->getConfig().exec.group_by.bigint_count),
431432
executor->getColLazyFetchInfo(ra_exe_unit.target_exprs),
432-
col_buffers,
433-
column_frag_offsets,
434-
column_frag_sizes,
433+
res_set_col_buf,
434+
res_set_col_frag_offsets,
435+
res_set_frag_sizes,
435436
device_type,
436437
device_id,
437438
ResultSet::fixupQueryMemoryDescriptor(query_mem_desc),

omniscidb/ResultSet/ResultSet.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -84,9 +84,9 @@ ResultSet::ResultSet(const std::vector<TargetInfo>& targets,
8484

8585
ResultSet::ResultSet(const std::vector<TargetInfo>& targets,
8686
const std::vector<ColumnLazyFetchInfo>& lazy_fetch_info,
87-
const std::vector<std::vector<const int8_t*>>& col_buffers,
88-
const std::vector<std::vector<int64_t>>& frag_offsets,
89-
const std::vector<int64_t>& consistent_frag_sizes,
87+
const ColBuffersPtr& col_buffers,
88+
const FragOffsetsPtr& frag_offsets,
89+
const FragSizesPtr& consistent_frag_sizes,
9090
const ExecutorDeviceType device_type,
9191
const int device_id,
9292
const QueryMemoryDescriptor& query_mem_desc,

omniscidb/ResultSet/ResultSet.h

+13-6
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,13 @@ using Permutation = std::vector<PermutationIdx>;
161161
using PermutationView = VectorView<PermutationIdx>;
162162
using ResultSetPtr = std::shared_ptr<ResultSet>;
163163

164+
using FragSizes = std::vector<int64_t>;
165+
using FragSizesPtr = std::shared_ptr<const FragSizes>;
166+
using ColBuffers = std::vector<std::vector<const int8_t*>>;
167+
using ColBuffersPtr = std::shared_ptr<const ColBuffers>;
168+
using FragOffsets = std::vector<std::vector<int64_t>>;
169+
using FragOffsetsPtr = std::shared_ptr<const FragOffsets>;
170+
164171
class ResultSet {
165172
public:
166173
friend ResultSetBuilder;
@@ -176,9 +183,9 @@ class ResultSet {
176183

177184
ResultSet(const std::vector<TargetInfo>& targets,
178185
const std::vector<ColumnLazyFetchInfo>& lazy_fetch_info,
179-
const std::vector<std::vector<const int8_t*>>& col_buffers,
180-
const std::vector<std::vector<int64_t>>& frag_offsets,
181-
const std::vector<int64_t>& consistent_frag_sizes,
186+
const ColBuffersPtr& col_buffers,
187+
const FragOffsetsPtr& frag_offsets,
188+
const FragSizesPtr& consistent_frag_sizes,
182189
const ExecutorDeviceType device_type,
183190
const int device_id,
184191
const QueryMemoryDescriptor& query_mem_desc,
@@ -802,9 +809,9 @@ class ResultSet {
802809
// setting offset instead of ptr in group by buffer.
803810
std::vector<std::vector<int8_t>> literal_buffers_;
804811
const std::vector<ColumnLazyFetchInfo> lazy_fetch_info_;
805-
std::vector<std::vector<std::vector<const int8_t*>>> col_buffers_;
806-
std::vector<std::vector<std::vector<int64_t>>> frag_offsets_;
807-
std::vector<std::vector<int64_t>> consistent_frag_sizes_;
812+
std::vector<ColBuffersPtr> col_buffers_;
813+
std::vector<FragOffsetsPtr> frag_offsets_;
814+
std::vector<FragSizesPtr> consistent_frag_sizes_;
808815

809816
const std::shared_ptr<const hdk::ir::Estimator> estimator_;
810817
Data_Namespace::AbstractBuffer* device_estimator_buffer_{nullptr};

omniscidb/ResultSet/ResultSetIteration.cpp

+10-9
Original file line numberDiff line numberDiff line change
@@ -930,24 +930,25 @@ const std::vector<const int8_t*>& ResultSet::getColumnFrag(const size_t storage_
930930
const size_t col_logical_idx,
931931
int64_t& global_idx) const {
932932
CHECK_LT(static_cast<size_t>(storage_idx), col_buffers_.size());
933-
if (col_buffers_[storage_idx].size() > 1) {
933+
if (col_buffers_[storage_idx]->size() > 1) {
934934
int64_t frag_id = 0;
935935
int64_t local_idx = global_idx;
936-
if (consistent_frag_sizes_[storage_idx][col_logical_idx] != -1) {
937-
frag_id = global_idx / consistent_frag_sizes_[storage_idx][col_logical_idx];
938-
local_idx = global_idx % consistent_frag_sizes_[storage_idx][col_logical_idx];
936+
const auto frag_size = (*(consistent_frag_sizes_[storage_idx]))[col_logical_idx];
937+
if (frag_size != -1) {
938+
frag_id = global_idx / frag_size;
939+
local_idx = global_idx % frag_size;
939940
} else {
940941
std::tie(frag_id, local_idx) = get_frag_id_and_local_idx(
941-
frag_offsets_[storage_idx], col_logical_idx, global_idx);
942+
*(frag_offsets_[storage_idx]), col_logical_idx, global_idx);
942943
CHECK_LE(local_idx, global_idx);
943944
}
944945
CHECK_GE(frag_id, int64_t(0));
945-
CHECK_LT(static_cast<size_t>(frag_id), col_buffers_[storage_idx].size());
946+
CHECK_LT(static_cast<size_t>(frag_id), col_buffers_[storage_idx]->size());
946947
global_idx = local_idx;
947-
return col_buffers_[storage_idx][frag_id];
948+
return (*(col_buffers_[storage_idx]))[frag_id];
948949
} else {
949-
CHECK_EQ(size_t(1), col_buffers_[storage_idx].size());
950-
return col_buffers_[storage_idx][0];
950+
CHECK_EQ(size_t(1), col_buffers_[storage_idx]->size());
951+
return (*(col_buffers_[storage_idx]))[0];
951952
}
952953
}
953954

0 commit comments

Comments
 (0)