Skip to content

Commit 8fcdf0a

Browse files
committed
perf: Manually unroll loops for no mix no null case in OptimizedVectorHasher
This improved real and double performance for 2x.
1 parent b38390f commit 8fcdf0a

1 file changed

Lines changed: 14 additions & 4 deletions

File tree

velox/exec/OptimizedVectorHasher.cpp

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,18 @@ template <bool Mix, typename ComputeHash>
6464
inline void
6565
hashLoopNoNulls(vector_size_t size, uint64_t* result, ComputeHash computeHash) {
6666
if constexpr (Mix) {
67-
for (vector_size_t i = 0; i < size; ++i) {
67+
vector_size_t i{0};
68+
for (; i + 8 <= size; i += 8) {
69+
result[i] = bits::hashMix(result[i], computeHash(i));
70+
result[i + 1] = bits::hashMix(result[i + 1], computeHash(i + 1));
71+
result[i + 2] = bits::hashMix(result[i + 2], computeHash(i + 2));
72+
result[i + 3] = bits::hashMix(result[i + 3], computeHash(i + 3));
73+
result[i + 4] = bits::hashMix(result[i + 4], computeHash(i + 4));
74+
result[i + 5] = bits::hashMix(result[i + 5], computeHash(i + 5));
75+
result[i + 6] = bits::hashMix(result[i + 6], computeHash(i + 6));
76+
result[i + 7] = bits::hashMix(result[i + 7], computeHash(i + 7));
77+
}
78+
for (; i < size; ++i) {
6879
result[i] = bits::hashMix(result[i], computeHash(i));
6980
}
7081
} else {
@@ -131,9 +142,8 @@ inline void scatterDictionaryHashesWithExtraNulls(
131142
}
132143
}
133144

134-
/// converts Velox’s packed boolean storage into one hash per row.
135-
/// @param values: a bitmap: one bit per row, where set means true and unset
136-
/// means false
145+
// Converts Velox's packed boolean storage into one hash per row. A set bit in
146+
// 'values' means true and an unset bit means false.
137147
template <bool Mix>
138148
inline void scatterBoolHashes(
139149
vector_size_t size,

0 commit comments

Comments
 (0)