SimdDualTableU32U8LookupV2

Struct SimdDualTableU32U8LookupV2 

Source
pub struct SimdDualTableU32U8LookupV2<'a> { /* private fields */ }
Expand description

Dual table lookup kernel - u32 to u8 lookup table kernel with custom SIMD function for combining the results. It tries to eliminate thrashing by using internally the single table kernel to write results out first to a local temporary buffer, which is saved, then it looks up the second table, only if the first table returns nonzero results - thus minimizing the number of reads from the second table. By sequencing in this order, we hope to minimize the cache thrashing.

The user is responsible for generating the lookup tables - so this can be used for different use cases, including CASE..WHEN and bitmasking/filtering. NOTE: this is not as efficient as the newer CascadingTableU32U8Lookup kernel. TODO: deprecate and remove this kernel. It doesn’t really have advantages over the others.

Implementations§

Source§

impl<'a> SimdDualTableU32U8LookupV2<'a>

Source

pub fn new(lookup_table1: &'a [u8], lookup_table2: &'a [u8]) -> Self

Source

pub fn lookup_func<F>(&mut self, values1: &[u32], values2: &[u32], f: &mut F)
where F: FnMut(u8x16, u8x16, usize),

Given two slices of equal length &u32 indices, looks up each one and calls the user given function on assembled u8x16 results.

  • lookup_table1 is used for the first slice, lookup_table2 is used for the second slice.
  • Only if the u8 from the first lookup table is nonzero, will the second lookup table be read.
  • The user function is passed (lookedup_values1: u8x16, lookedup_values2: u8x16, start_idx: usize), where start_idx is 0 for the first chunk call, 16 for the next one, etc.
  • If the slices do not divide evenly into 16-item chunks, the rest is handled by filling missing values in the u8x16 with zeroes. Thus, the lookup assumes the zero is basically a NOP.

The lookup function is passed these arguments: (lookedup_values1: u8x16, lookedup_values2: u8x16, num_bytes)

  • num_bytes: usually 16, but may be less for the last/remainder chunk.

Trait Implementations§

Source§

impl<'a> Clone for SimdDualTableU32U8LookupV2<'a>

Source§

fn clone(&self) -> SimdDualTableU32U8LookupV2<'a>

Returns a duplicate of the value. Read more
1.0.0§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<'a> Debug for SimdDualTableU32U8LookupV2<'a>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

§

impl<T> Any for T
where T: 'static + ?Sized,

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

impl<T> Borrow<T> for T
where T: ?Sized,

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

impl<T> BorrowMut<T> for T
where T: ?Sized,

§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CloneToUninit for T
where T: Clone,

§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T, U> Into<U> for T
where U: From<T>,

§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.