Skip to content

Commit 1b04a87

Browse files
committed
Refactor DynamicDispatch for auto static dispatch
1 parent fbaeac0 commit 1b04a87

4 files changed

Lines changed: 253 additions & 79 deletions

File tree

cpp/src/arrow/util/bpacking.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ void unpack(const uint8_t* in, Uint* out, const UnpackOptions& opts) {
5656
return bpacking::unpack_neon(in, out, opts);
5757
#else
5858
static DynamicDispatch<UnpackDynamicFunction<Uint> > dispatch;
59-
return dispatch.func(in, out, opts);
59+
return dispatch(in, out, opts);
6060
#endif
6161
}
6262

cpp/src/arrow/util/byte_stream_split_internal.cc

Lines changed: 16 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ namespace arrow::util::internal {
2424

2525
using ::arrow::internal::DispatchLevel;
2626
using ::arrow::internal::DynamicDispatch;
27+
using ::arrow::internal::DynamicDispatchTarget;
2728

2829
/************************
2930
* Decode dispatching *
@@ -32,28 +33,16 @@ using ::arrow::internal::DynamicDispatch;
3233
template <int kNumStreams>
3334
struct ByteStreamSplitDecodeDynamic {
3435
using FunctionType = decltype(&ByteStreamSplitDecodeScalar<kNumStreams>);
35-
using Implementation = std::pair<DispatchLevel, FunctionType>;
3636

3737
constexpr static auto implementations() {
3838
return std::array{
39-
Implementation{
40-
DispatchLevel::NONE,
41-
#if defined(ARROW_HAVE_NEON)
42-
// We always expect Neon to be available on Arm64
43-
&ByteStreamSplitDecodeSimd<xsimd::neon64, kNumStreams>,
44-
#elif defined(ARROW_HAVE_SSE4_2)
45-
// We always expect SSE4.2 to be available on x86_64
46-
&ByteStreamSplitDecodeSimd<xsimd::sse4_2, kNumStreams>,
47-
#else
48-
&ByteStreamSplitDecodeScalar<kNumStreams>,
49-
#endif
50-
},
51-
#if defined(ARROW_HAVE_RUNTIME_AVX2)
52-
Implementation{
53-
DispatchLevel::AVX2,
54-
&ByteStreamSplitDecodeSimd<xsimd::avx2, kNumStreams>,
55-
},
56-
#endif
39+
ARROW_DISPATCH_TARGET_NONE(&ByteStreamSplitDecodeScalar<kNumStreams>) //
40+
ARROW_DISPATCH_TARGET_NEON(
41+
(&ByteStreamSplitDecodeSimd<xsimd::neon64, kNumStreams>)) //
42+
ARROW_DISPATCH_TARGET_SSE4_2(
43+
(&ByteStreamSplitDecodeSimd<xsimd::sse4_2, kNumStreams>)) //
44+
ARROW_DISPATCH_TARGET_AVX2(
45+
(&ByteStreamSplitDecodeSimd<xsimd::avx2, kNumStreams>)) //
5746
};
5847
}
5948
};
@@ -62,7 +51,7 @@ template <int kNumStreams>
6251
void ByteStreamSplitDecodeSimdDispatch(const uint8_t* data, int width, int64_t num_values,
6352
int64_t stride, uint8_t* out) {
6453
static const DynamicDispatch<ByteStreamSplitDecodeDynamic<kNumStreams>> dispatch;
65-
return dispatch.func(data, width, num_values, stride, out);
54+
return dispatch(data, width, num_values, stride, out);
6655
}
6756

6857
template void ByteStreamSplitDecodeSimdDispatch<2>(const uint8_t*, int, int64_t, int64_t,
@@ -79,25 +68,15 @@ template void ByteStreamSplitDecodeSimdDispatch<8>(const uint8_t*, int, int64_t,
7968
template <int kNumStreams>
8069
struct ByteStreamSplitEncodeDynamic {
8170
using FunctionType = decltype(&ByteStreamSplitEncodeScalar<kNumStreams>);
82-
using Implementation = std::pair<DispatchLevel, FunctionType>;
8371

8472
constexpr static auto implementations() {
8573
return std::array{
86-
Implementation{
87-
DispatchLevel::NONE,
88-
#if defined(ARROW_HAVE_NEON)
89-
// We always expect Neon to be available on Arm64
90-
&ByteStreamSplitEncodeSimd<xsimd::neon64, kNumStreams>,
91-
#elif defined(ARROW_HAVE_SSE4_2)
92-
// We always expect SSE4.2 to be available on x86_64
93-
&ByteStreamSplitEncodeSimd<xsimd::sse4_2, kNumStreams>,
94-
#else
95-
&ByteStreamSplitEncodeScalar<kNumStreams>,
96-
#endif
97-
},
98-
#if defined(ARROW_HAVE_RUNTIME_AVX2)
99-
Implementation{DispatchLevel::AVX2, &ByteStreamSplitEncodeAvx2<kNumStreams>},
100-
#endif
74+
ARROW_DISPATCH_TARGET_NONE(&ByteStreamSplitEncodeScalar<kNumStreams>) //
75+
ARROW_DISPATCH_TARGET_NEON( //
76+
(&ByteStreamSplitEncodeSimd<xsimd::neon64, kNumStreams>)) //
77+
ARROW_DISPATCH_TARGET_SSE4_2( //
78+
(&ByteStreamSplitEncodeSimd<xsimd::sse4_2, kNumStreams>)) //
79+
ARROW_DISPATCH_TARGET_AVX2((&ByteStreamSplitEncodeAvx2<kNumStreams>)) //
10180
};
10281
}
10382
};
@@ -107,7 +86,7 @@ void ByteStreamSplitEncodeSimdDispatch(const uint8_t* raw_values, int width,
10786
const int64_t num_values,
10887
uint8_t* output_buffer_raw) {
10988
static const DynamicDispatch<ByteStreamSplitEncodeDynamic<kNumStreams>> dispatch;
110-
return dispatch.func(raw_values, width, num_values, output_buffer_raw);
89+
return dispatch(raw_values, width, num_values, output_buffer_raw);
11190
}
11291

11392
template void ByteStreamSplitEncodeSimdDispatch<2>(const uint8_t*, int, const int64_t,

0 commit comments

Comments
 (0)