This is an automated email from the ASF dual-hosted git repository.
agrove pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow.git
The following commit(s) were added to refs/heads/master by this push:
new fec7143 ARROW-6303: [Rust] Add a feature to disable SIMD
fec7143 is described below
commit fec714341017c6c0264be5548644256b01d2a5db
Author: Paddy Horan <[email protected]>
AuthorDate: Sun Sep 22 09:38:52 2019 -0600
ARROW-6303: [Rust] Add a feature to disable SIMD
Closes #5269 from paddyhoran/simd-feature and squashes the following
commits:
5ab31250c <Paddy Horan> Reverts ARROW-6408
4e4c08da4 <Paddy Horan> Fixes issue where `--no-default-features` is not
tested
c717dc8f7 <Paddy Horan> Triggering CI.
87cbb3e09 <Paddy Horan> Triggering CI.
2b6553bd2 <Paddy Horan> Adds comments to AppVeyor log.
0f0f92441 <Paddy Horan> Fixed lint issues.
8183752c8 <Paddy Horan> Changes the 'no-simd' build to debug
22c4d0b1d <Paddy Horan> Fixed lint.
cd03dad01 <Paddy Horan> Re-organizes README
7f1e4610a <Paddy Horan> Add building with no SIMD to CI
27a3cc6ba <Paddy Horan> Updates README with info on `simd` feature
2d617e735 <Paddy Horan> Adds "simd" feature flag.
Authored-by: Paddy Horan <[email protected]>
Signed-off-by: Andy Grove <[email protected]>
---
ci/rust-build-main.bat | 6 ++
ci/travis_script_rust.sh | 3 +
rust/arrow/Cargo.toml | 6 +-
rust/arrow/README.md | 10 +++
rust/arrow/src/buffer.rs | 48 +++++++-----
rust/arrow/src/compute/kernels/arithmetic.rs | 62 ++++++++-------
rust/arrow/src/compute/kernels/comparison.rs | 108 ++++++++++++++-------------
rust/arrow/src/compute/util.rs | 7 ++
rust/arrow/src/datatypes.rs | 16 +++-
rust/arrow/src/util/bit_util.rs | 7 +-
10 files changed, 168 insertions(+), 105 deletions(-)
diff --git a/ci/rust-build-main.bat b/ci/rust-build-main.bat
index e7f3c32..97ed1d5 100644
--- a/ci/rust-build-main.bat
+++ b/ci/rust-build-main.bat
@@ -31,6 +31,12 @@ rustup default nightly
rustup show
cargo build --target %TARGET% --all-targets --release || exit /B
@echo
+@echo Build with no default features
+@echo ------------------------------
+pushd arrow
+cargo build --target %TARGET% --all-targets --no-default-features || exit /B
+popd
+@echo
@echo Test (release)
@echo --------------
cargo test --target %TARGET% --release || exit /B
diff --git a/ci/travis_script_rust.sh b/ci/travis_script_rust.sh
index 704cb37..20656b6 100755
--- a/ci/travis_script_rust.sh
+++ b/ci/travis_script_rust.sh
@@ -32,6 +32,9 @@ rustup show
cargo +stable fmt --all -- --check
RUSTFLAGS="-D warnings" cargo build --all-targets
+pushd arrow
+cargo build --no-default-features
+popd
cargo test
# run examples
diff --git a/rust/arrow/Cargo.toml b/rust/arrow/Cargo.toml
index 1f6c911..d97e1af 100644
--- a/rust/arrow/Cargo.toml
+++ b/rust/arrow/Cargo.toml
@@ -45,10 +45,14 @@ csv = "1.0"
num = "0.2"
regex = "1.1"
lazy_static = "1.2"
-packed_simd = "0.3.1"
+packed_simd = { version = "0.3.1", optional = true }
chrono = "0.4"
flatbuffers = "0.5.0"
+[features]
+simd = ["packed_simd"]
+default = ["simd"]
+
[dev-dependencies]
criterion = "0.2"
lazy_static = "1"
diff --git a/rust/arrow/README.md b/rust/arrow/README.md
index f3d6184..4bc6b06 100644
--- a/rust/arrow/README.md
+++ b/rust/arrow/README.md
@@ -64,6 +64,16 @@ Some manual steps were then performed:
- Remove `org::apache::arrow::flatbuffers` namespace
- Add includes to each generated file
+## SIMD (Single Instruction Multiple Data)
+
+Arrow uses the [packed_simd](https://crates.io/crates/packed_simd) crate to
optimize many of the implementations in the
+[compute](https://github.com/apache/arrow/tree/master/rust/arrow/src/compute)
module using SIMD intrinsics. These
+optimizations are enabled by the `simd` feature flag and are turned on by
default, but can be disabled, for example:
+
+```bash
+cargo build --no-default-features
+```
+
# Publishing to crates.io
An Arrow committer can publish this crate after an official project release has
diff --git a/rust/arrow/src/buffer.rs b/rust/arrow/src/buffer.rs
index 7ede039..dbcdd95 100644
--- a/rust/arrow/src/buffer.rs
+++ b/rust/arrow/src/buffer.rs
@@ -18,6 +18,7 @@
//! The main type in the module is `Buffer`, a contiguous immutable memory
region of
//! fixed size aligned at a 64-byte boundary. `MutableBuffer` is like
`Buffer`, but it can
//! be mutated and grown.
+#[cfg(feature = "simd")]
use packed_simd::u8x64;
use std::cmp;
@@ -26,7 +27,9 @@ use std::fmt::{Debug, Formatter};
use std::io::{Error as IoError, ErrorKind, Result as IoResult, Write};
use std::mem;
use std::ops::{BitAnd, BitOr, Not};
-use std::slice::{from_raw_parts, from_raw_parts_mut};
+use std::slice::from_raw_parts;
+#[cfg(feature = "simd")]
+use std::slice::from_raw_parts_mut;
use std::sync::Arc;
use crate::array::{BufferBuilderTrait, UInt8BufferBuilder};
@@ -183,7 +186,7 @@ impl<T: AsRef<[u8]>> From<T> for Buffer {
}
/// Helper function for SIMD `BitAnd` and `BitOr` implementations
-#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature = "simd"))]
fn bitwise_bin_op_simd_helper<F>(left: &Buffer, right: &Buffer, op: F) ->
Buffer
where
F: Fn(u8x64, u8x64) -> u8x64,
@@ -218,11 +221,15 @@ impl<'a, 'b> BitAnd<&'b Buffer> for &'a Buffer {
));
}
- if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
- // SIMD implementation if available
- Ok(bitwise_bin_op_simd_helper(&self, &rhs, |a, b| a & b))
- } else {
- // Default implementation
+ // SIMD implementation if available
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
+ {
+ return Ok(bitwise_bin_op_simd_helper(&self, &rhs, |a, b| a & b));
+ }
+
+ // Default implementation
+ #[allow(unreachable_code)]
+ {
let mut builder = UInt8BufferBuilder::new(self.len());
for i in 0..self.len() {
unsafe {
@@ -248,12 +255,15 @@ impl<'a, 'b> BitOr<&'b Buffer> for &'a Buffer {
));
}
- if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
- // SIMD implementation if available
- Ok(bitwise_bin_op_simd_helper(&self, &rhs, |a, b| a | b))
- } else {
- // Default implementation
+ // SIMD implementation if available
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
+ {
+ return Ok(bitwise_bin_op_simd_helper(&self, &rhs, |a, b| a | b));
+ }
+ // Default implementation
+ #[allow(unreachable_code)]
+ {
let mut builder = UInt8BufferBuilder::new(self.len());
for i in 0..self.len() {
unsafe {
@@ -273,8 +283,9 @@ impl Not for &Buffer {
type Output = Buffer;
fn not(self) -> Buffer {
- if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
- // SIMD implementation if available
+ // SIMD implementation if available
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
+ {
let mut result =
MutableBuffer::new(self.len()).with_bitset(self.len(), false);
let lanes = u8x64::lanes();
@@ -290,9 +301,12 @@ impl Not for &Buffer {
simd_result.write_to_slice_unaligned_unchecked(result_slice);
}
}
- result.freeze()
- } else {
- // Default implementation
+ return result.freeze();
+ }
+
+ // Default implementation
+ #[allow(unreachable_code)]
+ {
let mut builder = UInt8BufferBuilder::new(self.len());
for i in 0..self.len() {
unsafe {
diff --git a/rust/arrow/src/compute/kernels/arithmetic.rs
b/rust/arrow/src/compute/kernels/arithmetic.rs
index 6a05a3d..a08979c 100644
--- a/rust/arrow/src/compute/kernels/arithmetic.rs
+++ b/rust/arrow/src/compute/kernels/arithmetic.rs
@@ -22,16 +22,22 @@
//! `RUSTFLAGS="-C target-feature=+avx2"` for example. See the documentation
//! [here](https://doc.rust-lang.org/stable/core/arch/) for more information.
+#[cfg(feature = "simd")]
use std::mem;
use std::ops::{Add, Div, Mul, Sub};
+#[cfg(feature = "simd")]
use std::slice::from_raw_parts_mut;
+#[cfg(feature = "simd")]
use std::sync::Arc;
use num::{One, Zero};
use crate::array::*;
+#[cfg(feature = "simd")]
use crate::bitmap::Bitmap;
+#[cfg(feature = "simd")]
use crate::buffer::MutableBuffer;
+#[cfg(feature = "simd")]
use crate::compute::util::{apply_bin_op_to_option_bitmap,
simd_load_set_invalid};
use crate::datatypes;
use crate::error::{ArrowError, Result};
@@ -66,7 +72,7 @@ where
}
/// SIMD vectorized version of `math_op` above.
-#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature = "simd"))]
fn simd_math_op<T, F>(
left: &PrimitiveArray<T>,
right: &PrimitiveArray<T>,
@@ -125,7 +131,7 @@ where
/// SIMD vectorized version of `divide`, the divide kernel needs it's own
implementation as there
/// is a need to handle situations where a divide by `0` occurs. This is
complicated by `NULL`
/// slots and padding.
-#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature = "simd"))]
fn simd_divide<T>(
left: &PrimitiveArray<T>,
right: &PrimitiveArray<T>,
@@ -201,11 +207,11 @@ where
+ Div<Output = T::Native>
+ Zero,
{
- if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
- simd_math_op(&left, &right, |a, b| a + b)
- } else {
- math_op(left, right, |a, b| Ok(a + b))
- }
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
+ return simd_math_op(&left, &right, |a, b| a + b);
+
+ #[allow(unreachable_code)]
+ math_op(left, right, |a, b| Ok(a + b))
}
/// Perform `left - right` operation on two arrays. If either left or right
value is null
@@ -222,11 +228,11 @@ where
+ Div<Output = T::Native>
+ Zero,
{
- if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
- simd_math_op(&left, &right, |a, b| a - b)
- } else {
- math_op(left, right, |a, b| Ok(a - b))
- }
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
+ return simd_math_op(&left, &right, |a, b| a - b);
+
+ #[allow(unreachable_code)]
+ math_op(left, right, |a, b| Ok(a - b))
}
/// Perform `left * right` operation on two arrays. If either left or right
value is null
@@ -243,11 +249,11 @@ where
+ Div<Output = T::Native>
+ Zero,
{
- if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
- simd_math_op(&left, &right, |a, b| a * b)
- } else {
- math_op(left, right, |a, b| Ok(a * b))
- }
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
+ return simd_math_op(&left, &right, |a, b| a * b);
+
+ #[allow(unreachable_code)]
+ math_op(left, right, |a, b| Ok(a * b))
}
/// Perform `left / right` operation on two arrays. If either left or right
value is null
@@ -266,17 +272,17 @@ where
+ Zero
+ One,
{
- if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
- simd_divide(&left, &right)
- } else {
- math_op(left, right, |a, b| {
- if b.is_zero() {
- Err(ArrowError::DivideByZero)
- } else {
- Ok(a / b)
- }
- })
- }
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
+ return simd_divide(&left, &right);
+
+ #[allow(unreachable_code)]
+ math_op(left, right, |a, b| {
+ if b.is_zero() {
+ Err(ArrowError::DivideByZero)
+ } else {
+ Ok(a / b)
+ }
+ })
}
#[cfg(test)]
diff --git a/rust/arrow/src/compute/kernels/comparison.rs
b/rust/arrow/src/compute/kernels/comparison.rs
index a0a6443..d639811 100644
--- a/rust/arrow/src/compute/kernels/comparison.rs
+++ b/rust/arrow/src/compute/kernels/comparison.rs
@@ -22,11 +22,15 @@
//! `RUSTFLAGS="-C target-feature=+avx2"` for example. See the documentation
//! [here](https://doc.rust-lang.org/stable/core/arch/) for more information.
+#[cfg(feature = "simd")]
use std::sync::Arc;
use crate::array::*;
+#[cfg(feature = "simd")]
use crate::compute::util::apply_bin_op_to_option_bitmap;
-use crate::datatypes::{ArrowNumericType, BooleanType, DataType};
+use crate::datatypes::ArrowNumericType;
+#[cfg(feature = "simd")]
+use crate::datatypes::{BooleanType, DataType};
use crate::error::{ArrowError, Result};
/// Helper function to perform boolean lambda function on values from two
arrays, this
@@ -65,7 +69,7 @@ where
/// Helper function to perform boolean lambda function on values from two
arrays using
/// SIMD.
-#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature = "simd"))]
fn simd_compare_op<T, F>(
left: &PrimitiveArray<T>,
right: &PrimitiveArray<T>,
@@ -116,11 +120,11 @@ pub fn eq<T>(left: &PrimitiveArray<T>, right:
&PrimitiveArray<T>) -> Result<Bool
where
T: ArrowNumericType,
{
- if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
- simd_compare_op(left, right, |a, b| T::eq(a, b))
- } else {
- compare_op(left, right, |a, b| a == b)
- }
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
+ return simd_compare_op(left, right, |a, b| T::eq(a, b));
+
+ #[allow(unreachable_code)]
+ compare_op(left, right, |a, b| a == b)
}
/// Perform `left != right` operation on two arrays.
@@ -128,11 +132,11 @@ pub fn neq<T>(left: &PrimitiveArray<T>, right:
&PrimitiveArray<T>) -> Result<Boo
where
T: ArrowNumericType,
{
- if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
- simd_compare_op(left, right, |a, b| T::ne(a, b))
- } else {
- compare_op(left, right, |a, b| a != b)
- }
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
+ return simd_compare_op(left, right, |a, b| T::ne(a, b));
+
+ #[allow(unreachable_code)]
+ compare_op(left, right, |a, b| a != b)
}
/// Perform `left < right` operation on two arrays. Null values are less than
non-null
@@ -141,16 +145,16 @@ pub fn lt<T>(left: &PrimitiveArray<T>, right:
&PrimitiveArray<T>) -> Result<Bool
where
T: ArrowNumericType,
{
- if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
- simd_compare_op(left, right, |a, b| T::lt(a, b))
- } else {
- compare_op(left, right, |a, b| match (a, b) {
- (None, None) => false,
- (None, _) => true,
- (_, None) => false,
- (Some(aa), Some(bb)) => aa < bb,
- })
- }
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
+ return simd_compare_op(left, right, |a, b| T::lt(a, b));
+
+ #[allow(unreachable_code)]
+ compare_op(left, right, |a, b| match (a, b) {
+ (None, None) => false,
+ (None, _) => true,
+ (_, None) => false,
+ (Some(aa), Some(bb)) => aa < bb,
+ })
}
/// Perform `left <= right` operation on two arrays. Null values are less than
non-null
@@ -162,16 +166,16 @@ pub fn lt_eq<T>(
where
T: ArrowNumericType,
{
- if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
- simd_compare_op(left, right, |a, b| T::le(a, b))
- } else {
- compare_op(left, right, |a, b| match (a, b) {
- (None, None) => true,
- (None, _) => true,
- (_, None) => false,
- (Some(aa), Some(bb)) => aa <= bb,
- })
- }
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
+ return simd_compare_op(left, right, |a, b| T::le(a, b));
+
+ #[allow(unreachable_code)]
+ compare_op(left, right, |a, b| match (a, b) {
+ (None, None) => true,
+ (None, _) => true,
+ (_, None) => false,
+ (Some(aa), Some(bb)) => aa <= bb,
+ })
}
/// Perform `left > right` operation on two arrays. Non-null values are
greater than null
@@ -180,16 +184,16 @@ pub fn gt<T>(left: &PrimitiveArray<T>, right:
&PrimitiveArray<T>) -> Result<Bool
where
T: ArrowNumericType,
{
- if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
- simd_compare_op(left, right, |a, b| T::gt(a, b))
- } else {
- compare_op(left, right, |a, b| match (a, b) {
- (None, None) => false,
- (None, _) => false,
- (_, None) => true,
- (Some(aa), Some(bb)) => aa > bb,
- })
- }
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
+ return simd_compare_op(left, right, |a, b| T::gt(a, b));
+
+ #[allow(unreachable_code)]
+ compare_op(left, right, |a, b| match (a, b) {
+ (None, None) => false,
+ (None, _) => false,
+ (_, None) => true,
+ (Some(aa), Some(bb)) => aa > bb,
+ })
}
/// Perform `left >= right` operation on two arrays. Non-null values are
greater than null
@@ -201,16 +205,16 @@ pub fn gt_eq<T>(
where
T: ArrowNumericType,
{
- if cfg!(any(target_arch = "x86", target_arch = "x86_64")) {
- simd_compare_op(left, right, |a, b| T::ge(a, b))
- } else {
- compare_op(left, right, |a, b| match (a, b) {
- (None, None) => true,
- (None, _) => false,
- (_, None) => true,
- (Some(aa), Some(bb)) => aa >= bb,
- })
- }
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
+ return simd_compare_op(left, right, |a, b| T::ge(a, b));
+
+ #[allow(unreachable_code)]
+ compare_op(left, right, |a, b| match (a, b) {
+ (None, None) => true,
+ (None, _) => false,
+ (_, None) => true,
+ (Some(aa), Some(bb)) => aa >= bb,
+ })
}
#[cfg(test)]
diff --git a/rust/arrow/src/compute/util.rs b/rust/arrow/src/compute/util.rs
index 8cd5a11..a6ddf06 100644
--- a/rust/arrow/src/compute/util.rs
+++ b/rust/arrow/src/compute/util.rs
@@ -20,9 +20,12 @@
use crate::array::*;
use crate::bitmap::Bitmap;
use crate::buffer::Buffer;
+#[cfg(feature = "simd")]
use crate::datatypes::*;
use crate::error::Result;
+#[cfg(feature = "simd")]
use num::One;
+#[cfg(feature = "simd")]
use std::cmp::min;
/// Applies a given binary operation, `op`, to two references to
`Option<Bitmap>`'s.
@@ -96,6 +99,7 @@ pub(super) fn take_value_indices_from_list(
/// Lanes of the SIMD mask can be set to 'valid' (`true`) if the corresponding
array slot is not
/// `NULL`, as indicated by it's `Bitmap`, and is within the length of the
array. Lanes outside the
/// length represent padding and are set to 'invalid' (`false`).
+#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature = "simd"))]
unsafe fn is_valid<T>(
bitmap: &Option<Bitmap>,
i: usize,
@@ -133,6 +137,7 @@ where
/// Note that `array` below has it's own `Bitmap` separate from the `bitmap`
argument. This
/// function is used to prepare `array`'s for binary operations. The `bitmap`
argument is the
/// `Bitmap` after the binary operation.
+#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature = "simd"))]
pub(super) unsafe fn simd_load_set_invalid<T>(
array: &PrimitiveArray<T>,
bitmap: &Option<Bitmap>,
@@ -221,6 +226,7 @@ mod tests {
}
#[test]
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
fn test_is_valid() {
let a = Int32Array::from(vec![
Some(15),
@@ -248,6 +254,7 @@ mod tests {
}
#[test]
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
fn test_simd_load_set_invalid() {
let a = Int64Array::from(vec![None, Some(15), Some(5), Some(0)]);
let new_bitmap = &Some(Bitmap::from(Buffer::from([0b00001010])));
diff --git a/rust/arrow/src/datatypes.rs b/rust/arrow/src/datatypes.rs
index 822b953..5698ccb 100644
--- a/rust/arrow/src/datatypes.rs
+++ b/rust/arrow/src/datatypes.rs
@@ -23,10 +23,12 @@
use std::fmt;
use std::mem::size_of;
+#[cfg(feature = "simd")]
use std::ops::{Add, Div, Mul, Sub};
use std::slice::from_raw_parts;
use std::str::FromStr;
+#[cfg(feature = "simd")]
use packed_simd::*;
use serde_derive::{Deserialize, Serialize};
use serde_json::{json, Number, Value, Value::Number as VNumber};
@@ -303,7 +305,7 @@ make_type!(
/// A subtype of primitive type that represents numeric values.
///
/// SIMD operations are defined in this trait if available on the target
system.
-#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature = "simd"))]
pub trait ArrowNumericType: ArrowPrimitiveType
where
Self::Simd: Add<Output = Self::Simd>
@@ -370,12 +372,15 @@ where
fn write(simd_result: Self::Simd, slice: &mut [Self::Native]);
}
-#[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
+#[cfg(any(
+ not(any(target_arch = "x86", target_arch = "x86_64")),
+ not(feature = "simd")
+))]
pub trait ArrowNumericType: ArrowPrimitiveType {}
macro_rules! make_numeric_type {
($impl_ty:ty, $native_ty:ty, $simd_ty:ident, $simd_mask_ty:ident) => {
- #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
impl ArrowNumericType for $impl_ty {
type Simd = $simd_ty;
@@ -454,7 +459,10 @@ macro_rules! make_numeric_type {
unsafe { simd_result.write_to_slice_unaligned_unchecked(slice)
};
}
}
- #[cfg(not(any(target_arch = "x86", target_arch = "x86_64")))]
+ #[cfg(any(
+ not(any(target_arch = "x86", target_arch = "x86_64")),
+ not(feature = "simd")
+ ))]
impl ArrowNumericType for $impl_ty {}
};
}
diff --git a/rust/arrow/src/util/bit_util.rs b/rust/arrow/src/util/bit_util.rs
index 7924f5f..21c2836 100644
--- a/rust/arrow/src/util/bit_util.rs
+++ b/rust/arrow/src/util/bit_util.rs
@@ -17,6 +17,7 @@
//! Utils for working with bits
+#[cfg(feature = "simd")]
use packed_simd::u8x64;
static BIT_MASK: [u8; 8] = [1, 2, 4, 8, 16, 32, 64, 128];
@@ -131,7 +132,7 @@ pub fn ceil(value: usize, divisor: usize) -> usize {
/// Note that each slice should be 64 bytes and it is the callers
responsibility to ensure
/// that this is the case. If passed slices larger than 64 bytes the
operation will only
/// be performed on the first 64 bytes. Slices less than 64 bytes will panic.
-#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
+#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature = "simd"))]
pub unsafe fn bitwise_bin_op_simd<F>(left: &[u8], right: &[u8], result: &mut
[u8], op: F)
where
F: Fn(u8x64, u8x64) -> u8x64,
@@ -302,8 +303,8 @@ mod tests {
assert_eq!(ceil(10000000000, 1000000000), 10);
}
- #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
#[test]
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
fn test_bitwise_and_simd() {
let buf1 = [0b00110011u8; 64];
let buf2 = [0b11110000u8; 64];
@@ -314,8 +315,8 @@ mod tests {
}
}
- #[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
#[test]
+ #[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature =
"simd"))]
fn test_bitwise_or_simd() {
let buf1 = [0b00110011u8; 64];
let buf2 = [0b11110000u8; 64];