[enhancement] optmize 2 cases in seg_iter: all/none rows passed predicate (#10259)

* [enhancement] optmize 2 cases: all/none rows passed predicate in seg_iter.

* format
This commit is contained in:
minghong
2022-06-20 17:47:52 +08:00
committed by GitHub
parent 8a8d24b4a6
commit c3743ec9aa

View File

@ -871,28 +871,45 @@ uint16_t SegmentIterator::_evaluate_vectorization_predicate(uint16_t* sel_rowid_
memset(ret_flags, 1, selected_size);
_pre_eval_block_predicate->evaluate_vec(_current_return_columns, selected_size, ret_flags);
uint32_t sel_pos = 0;
const uint32_t sel_end = sel_pos + selected_size;
static constexpr size_t SIMD_BYTES = 32;
const uint32_t sel_end_simd = sel_pos + selected_size / SIMD_BYTES * SIMD_BYTES;
uint16_t new_size = 0;
while (sel_pos < sel_end_simd) {
auto mask = simd::bytes32_mask_to_bits32_mask(ret_flags + sel_pos);
while (mask) {
const size_t bit_pos = __builtin_ctzll(mask);
sel_rowid_idx[new_size++] = sel_pos + bit_pos;
mask = mask & (mask - 1);
size_t num_zeros = simd::count_zero_num(reinterpret_cast<int8_t*>(ret_flags), original_size);
if (0 == num_zeros) {
for (uint16_t i = 0; i < original_size; i++) {
sel_rowid_idx[i] = i;
}
sel_pos += SIMD_BYTES;
}
new_size = original_size;
} else if (num_zeros == original_size) {
//no row pass, let new_size = 0
} else {
uint32_t sel_pos = 0;
const uint32_t sel_end = sel_pos + selected_size;
static constexpr size_t SIMD_BYTES = 32;
const uint32_t sel_end_simd = sel_pos + selected_size / SIMD_BYTES * SIMD_BYTES;
for (; sel_pos < sel_end; sel_pos++) {
if (ret_flags[sel_pos]) {
sel_rowid_idx[new_size++] = sel_pos;
while (sel_pos < sel_end_simd) {
auto mask = simd::bytes32_mask_to_bits32_mask(ret_flags + sel_pos);
if (0 == mask) {
//pass
} else if (0xffffffff == mask) {
for (uint32_t i = 0; i < SIMD_BYTES; i++) {
sel_rowid_idx[new_size++] = sel_pos + i;
}
} else {
while (mask) {
const size_t bit_pos = __builtin_ctzll(mask);
sel_rowid_idx[new_size++] = sel_pos + bit_pos;
mask = mask & (mask - 1);
}
}
sel_pos += SIMD_BYTES;
}
for (; sel_pos < sel_end; sel_pos++) {
if (ret_flags[sel_pos]) {
sel_rowid_idx[new_size++] = sel_pos;
}
}
}
_opts.stats->rows_vec_cond_filtered += original_size - new_size;
return new_size;
}