Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cpp/src/arrow/util/bpacking.cc
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ void unpack(const uint8_t* in, Uint* out, const UnpackOptions& opts) {
return bpacking::unpack_neon(in, out, opts);
#else
static DynamicDispatch<UnpackDynamicFunction<Uint> > dispatch;
return dispatch.func(in, out, opts);
return dispatch(in, out, opts);
#endif
}

Expand Down
53 changes: 16 additions & 37 deletions cpp/src/arrow/util/byte_stream_split_internal.cc
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ namespace arrow::util::internal {

using ::arrow::internal::DispatchLevel;
using ::arrow::internal::DynamicDispatch;
using ::arrow::internal::DynamicDispatchTarget;

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

constexpr static auto implementations() {
return std::array{
Implementation{
DispatchLevel::NONE,
#if defined(ARROW_HAVE_NEON)
// We always expect Neon to be available on Arm64
&ByteStreamSplitDecodeSimd<xsimd::neon64, kNumStreams>,
#elif defined(ARROW_HAVE_SSE4_2)
// We always expect SSE4.2 to be available on x86_64
&ByteStreamSplitDecodeSimd<xsimd::sse4_2, kNumStreams>,
#else
&ByteStreamSplitDecodeScalar<kNumStreams>,
#endif
},
#if defined(ARROW_HAVE_RUNTIME_AVX2)
Implementation{
DispatchLevel::AVX2,
&ByteStreamSplitDecodeSimd<xsimd::avx2, kNumStreams>,
},
#endif
ARROW_DISPATCH_TARGET_NONE(&ByteStreamSplitDecodeScalar<kNumStreams>) //
ARROW_DISPATCH_TARGET_NEON(
(&ByteStreamSplitDecodeSimd<xsimd::neon64, kNumStreams>)) //
ARROW_DISPATCH_TARGET_SSE4_2(
(&ByteStreamSplitDecodeSimd<xsimd::sse4_2, kNumStreams>)) //
ARROW_DISPATCH_TARGET_AVX2(
(&ByteStreamSplitDecodeSimd<xsimd::avx2, kNumStreams>)) //
};
}
};
Expand All @@ -62,7 +51,7 @@ template <int kNumStreams>
void ByteStreamSplitDecodeSimdDispatch(const uint8_t* data, int width, int64_t num_values,
int64_t stride, uint8_t* out) {
static const DynamicDispatch<ByteStreamSplitDecodeDynamic<kNumStreams>> dispatch;
return dispatch.func(data, width, num_values, stride, out);
return dispatch(data, width, num_values, stride, out);
}

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

constexpr static auto implementations() {
return std::array{
Implementation{
DispatchLevel::NONE,
#if defined(ARROW_HAVE_NEON)
// We always expect Neon to be available on Arm64
&ByteStreamSplitEncodeSimd<xsimd::neon64, kNumStreams>,
#elif defined(ARROW_HAVE_SSE4_2)
// We always expect SSE4.2 to be available on x86_64
&ByteStreamSplitEncodeSimd<xsimd::sse4_2, kNumStreams>,
#else
&ByteStreamSplitEncodeScalar<kNumStreams>,
#endif
},
#if defined(ARROW_HAVE_RUNTIME_AVX2)
Implementation{DispatchLevel::AVX2, &ByteStreamSplitEncodeAvx2<kNumStreams>},
#endif
ARROW_DISPATCH_TARGET_NONE(&ByteStreamSplitEncodeScalar<kNumStreams>) //
ARROW_DISPATCH_TARGET_NEON( //
(&ByteStreamSplitEncodeSimd<xsimd::neon64, kNumStreams>)) //
ARROW_DISPATCH_TARGET_SSE4_2( //
(&ByteStreamSplitEncodeSimd<xsimd::sse4_2, kNumStreams>)) //
ARROW_DISPATCH_TARGET_AVX2((&ByteStreamSplitEncodeAvx2<kNumStreams>)) //
};
}
};
Expand All @@ -107,7 +86,7 @@ void ByteStreamSplitEncodeSimdDispatch(const uint8_t* raw_values, int width,
const int64_t num_values,
uint8_t* output_buffer_raw) {
static const DynamicDispatch<ByteStreamSplitEncodeDynamic<kNumStreams>> dispatch;
return dispatch.func(raw_values, width, num_values, output_buffer_raw);
return dispatch(raw_values, width, num_values, output_buffer_raw);
}

template void ByteStreamSplitEncodeSimdDispatch<2>(const uint8_t*, int, const int64_t,
Expand Down
Loading
Loading