Commit 01ed0e7d authored by Giuseppe Ottaviano's avatar Giuseppe Ottaviano Committed by Facebook Github Bot

Implement inverted layout in EliasFanoCoding

Summary: In some cases we want to prefetch the upper bits first.

Reviewed By: philippv, luciang

Differential Revision: D13663518

fbshipit-source-id: c69fe4740fb96f3e9d448410cdf9c4a6edbb6c30
parent 6890c57a
...@@ -93,7 +93,8 @@ template < ...@@ -93,7 +93,8 @@ template <
class Value, class Value,
class SkipValue = size_t, class SkipValue = size_t,
size_t kSkipQuantum = 0, // 0 = disabled size_t kSkipQuantum = 0, // 0 = disabled
size_t kForwardQuantum = 0> // 0 = disabled size_t kForwardQuantum = 0, // 0 = disabled
bool kUpperFirst = false>
struct EliasFanoEncoderV2 { struct EliasFanoEncoderV2 {
static_assert( static_assert(
std::is_integral<Value>::value && std::is_unsigned<Value>::value, std::is_integral<Value>::value && std::is_unsigned<Value>::value,
...@@ -224,9 +225,14 @@ template < ...@@ -224,9 +225,14 @@ template <
class Value, class Value,
class SkipValue, class SkipValue,
size_t kSkipQuantum, size_t kSkipQuantum,
size_t kForwardQuantum> size_t kForwardQuantum,
struct EliasFanoEncoderV2<Value, SkipValue, kSkipQuantum, kForwardQuantum>:: bool kUpperFirst>
Layout { struct EliasFanoEncoderV2<
Value,
SkipValue,
kSkipQuantum,
kForwardQuantum,
kUpperFirst>::Layout {
static Layout fromUpperBoundAndSize(size_t upperBound, size_t size) { static Layout fromUpperBoundAndSize(size_t upperBound, size_t size) {
// numLowerBits can be at most 56 because of detail::writeBits56. // numLowerBits can be at most 56 because of detail::writeBits56.
const uint8_t numLowerBits = const uint8_t numLowerBits =
...@@ -301,8 +307,13 @@ struct EliasFanoEncoderV2<Value, SkipValue, kSkipQuantum, kForwardQuantum>:: ...@@ -301,8 +307,13 @@ struct EliasFanoEncoderV2<Value, SkipValue, kSkipQuantum, kForwardQuantum>::
result.skipPointers = advance(skipPointers); result.skipPointers = advance(skipPointers);
result.forwardPointers = advance(forwardPointers); result.forwardPointers = advance(forwardPointers);
result.lower = advance(lower); if /* constexpr */ (kUpperFirst) {
result.upper = advance(upper); result.upper = advance(upper);
result.lower = advance(lower);
} else {
result.lower = advance(lower);
result.upper = advance(upper);
}
return result; return result;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment