Skip to main content

RadersAvx2

Struct RadersAvx2 

Source
pub struct RadersAvx2<A: AvxNum, T> {
    input_index_multiplier: VectorizedMultiplyMod,
    input_index_init: __m256i,
    output_index_mapping: Box<[__m128i]>,
    twiddles: Box<[A::VectorType]>,
    inner_fft: Arc<dyn Fft<T>>,
    len: usize,
    inplace_scratch_len: usize,
    outofplace_scratch_len: usize,
    immut_scratch_len: usize,
    direction: FftDirection,
    _phantom: PhantomData<T>,
}
Expand description

Implementation of Rader’s Algorithm, using AVX2 instructions.

This algorithm computes a prime-sized FFT in O(nlogn) time. It does this by converting this size n FFT into a size (n - 1) which is guaranteed to be composite.

The worst case for this algorithm is when (n - 1) is 2 * prime, resulting in a Cunningham Chain

Rader’s Algorithm is relatively expensive compared to other FFT algorithms. Benchmarking shows that it is up to an order of magnitude slower than similar composite sizes.

Fields§

§input_index_multiplier: VectorizedMultiplyMod§input_index_init: __m256i§output_index_mapping: Box<[__m128i]>§twiddles: Box<[A::VectorType]>§inner_fft: Arc<dyn Fft<T>>§len: usize§inplace_scratch_len: usize§outofplace_scratch_len: usize§immut_scratch_len: usize§direction: FftDirection§_phantom: PhantomData<T>

Implementations§

Source§

impl<A: AvxNum, T: FftNum> RadersAvx2<A, T>

Source

pub fn new(inner_fft: Arc<dyn Fft<T>>) -> Result<Self, ()>

Preallocates necessary arrays and precomputes necessary data to efficiently compute the FFT Returns Ok(instance) if this machine has the required instruction sets (“avx”, “fma”, and “avx2”), Err() if some instruction sets are missing

§Panics

Panics if inner_fft_len() + 1 is not a prime number.

Source

unsafe fn new_with_avx(inner_fft: Arc<dyn Fft<T>>) -> Self

Source

unsafe fn prepare_raders(&self, input: &[Complex<A>], output: &mut [Complex<A>])

Source

unsafe fn finalize_raders( &self, input: &[Complex<A>], output: &mut [Complex<A>], )

Source

fn perform_fft_immut( &self, input: &[Complex<T>], output: &mut [Complex<T>], scratch: &mut [Complex<T>], )

Source

fn perform_fft_out_of_place( &self, input: &mut [Complex<T>], output: &mut [Complex<T>], scratch: &mut [Complex<T>], )

Source

fn perform_fft_inplace( &self, buffer: &mut [Complex<T>], scratch: &mut [Complex<T>], )

Trait Implementations§

Source§

impl<A: AvxNum, T> Direction for RadersAvx2<A, T>

Source§

fn fft_direction(&self) -> FftDirection

Returns FftDirection::Forward if this instance computes forward FFTs, or FftDirection::Inverse for inverse FFTs
Source§

impl<A: AvxNum, T: FftNum> Fft<T> for RadersAvx2<A, T>

Source§

fn process_immutable_with_scratch( &self, input: &[Complex<T>], output: &mut [Complex<T>], scratch: &mut [Complex<T>], )

Divides input and output into chunks of self.len(), and computes a FFT on each chunk while keeping input untouched. Read more
Source§

fn process_outofplace_with_scratch( &self, input: &mut [Complex<T>], output: &mut [Complex<T>], scratch: &mut [Complex<T>], )

Divides input and output into chunks of size self.len(), and computes a FFT on each chunk. Read more
Source§

fn process_with_scratch( &self, buffer: &mut [Complex<T>], scratch: &mut [Complex<T>], )

Divides buffer into chunks of size self.len(), and computes a FFT on each chunk. Read more
Source§

fn get_inplace_scratch_len(&self) -> usize

Returns the size of the scratch buffer required by process_with_scratch Read more
Source§

fn get_outofplace_scratch_len(&self) -> usize

Returns the size of the scratch buffer required by process_outofplace_with_scratch Read more
Source§

fn get_immutable_scratch_len(&self) -> usize

Returns the size of the scratch buffer required by process_immutable_with_scratch Read more
Source§

fn process(&self, buffer: &mut [Complex<T>])

Computes a FFT in-place. Read more
Source§

impl<A: AvxNum, T> Length for RadersAvx2<A, T>

Source§

fn len(&self) -> usize

The FFT size that this algorithm can process

Auto Trait Implementations§

§

impl<A, T> !RefUnwindSafe for RadersAvx2<A, T>

§

impl<A, T> !UnwindSafe for RadersAvx2<A, T>

§

impl<A, T> Freeze for RadersAvx2<A, T>

§

impl<A, T> Send for RadersAvx2<A, T>
where T: Send,

§

impl<A, T> Sync for RadersAvx2<A, T>
where T: Sync,

§

impl<A, T> Unpin for RadersAvx2<A, T>
where T: Unpin,

§

impl<A, T> UnsafeUnpin for RadersAvx2<A, T>

Blanket Implementations§

Source§

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

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

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

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

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

Source§

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

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

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

Source§

fn into(self) -> U

Calls U::from(self).

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

Source§

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

Source§

type Error = Infallible

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

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

Performs the conversion.
Source§

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

Source§

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

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

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

Performs the conversion.