PipelinedSingleTableU32U8Lookup

Struct PipelinedSingleTableU32U8Lookup 

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

Pipelined single table lookup kernel - u32 to u8 lookup table kernel with prefetch pipelining

This version pipelines prefetch operations with the actual lookup work to hide memory latency. The algorithm works as follows:

  1. Read values from current chunk addresses
  2. Prefetch next chunk addresses while processing current values
  3. Call SIMD lookup function on current values
  4. Loop to next chunk

This pipelining allows memory prefetch latency to be hidden behind computation work.

Results: End Nov 2025: On Intel boxes this gives slight advantage - maybe up to 5%. Regular scalar reads though, even with large random Lookup tables, are done well enough that this doesn’t help much.

Implementations§

Source§

impl<'a> PipelinedSingleTableU32U8Lookup<'a>

Source

pub fn new(lookup_table: &'a [u8]) -> Self

Source

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

Pipelined lookup function that prefetches the next chunk while processing the current one

The pipelining strategy:

  • Process chunks of 16 u32 values at a time
  • For each chunk: prefetch next chunk addresses, then process current chunk
  • This hides prefetch latency behind the lookup computation work
Source

pub fn lookup_into_vec(&self, values: &[u32], buffer: &mut Vec<u8>)

Convenience function which does lookup and writes the results into a Vec

Trait Implementations§

Source§

impl<'a> Clone for PipelinedSingleTableU32U8Lookup<'a>

Source§

fn clone(&self) -> PipelinedSingleTableU32U8Lookup<'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 PipelinedSingleTableU32U8Lookup<'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.