apytypes_simd.h

namespace simd

This file contains declarations of vectorized arithmetic function that make a best-effort attempt in parallelizing operations using SIMD intrinsics.

Functions

std::string get_simd_version_str()

Return a string with active runtime SIMD information. Example: “APyTypes SIMD: { ‘SIMD Runtime Target’: ‘AVX2’, ‘Runtime Parallel-Limb Support’: “ “4 x 64-bit’ }”

void vector_shift_add(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, APyBuffer<apy_limb_t>::vector_type::const_iterator src2_begin, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, unsigned src1_shift_amount, unsigned src2_shift_amount, std::size_t size)

For each element in the iterator regions [ *_begin, *_begin + size ):

  • Shift element in src1_begin left by src1_shift_amount

  • Shift element in src2_begin left by src2_shift_amount

  • Add shifted values and store in dst_begin

void vector_shift_add_const(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, apy_limb_t constant, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, unsigned src1_shift_amount, std::size_t size)

For each element in the iterator regions [ *_begin, *_begin + size ):

  • Shift element in src1_begin left by src1_shift_amount

  • Add shifted element to constant and store the result in dst_begin

void vector_shift_add_const_even_odd(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, apy_limb_t even_constant, apy_limb_t odd_constant, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, unsigned src1_shift_amount, unsigned src2_shift_amount, std::size_t size)

For each element in the iterator regions [ *_begin, *_begin + size ):

  • Shift element in src1_begin left by src1_shift_amount

  • Shift even_constant / odd_constant left by src2_shift_amount

  • Add shifted element to alternating constants: even_constant for even lanes, odd_constant for odd lanes

  • Store the result in dst_begin

void vector_shift_sub(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, APyBuffer<apy_limb_t>::vector_type::const_iterator src2_begin, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, unsigned src1_shift_amount, unsigned src2_shift_amount, std::size_t size)

For each element in the iterator regions [ *_begin, *_begin + size ):

  • Shift element in src1_begin left by src1_shift_amount

  • Shift element in src2_begin left by src2_shift_amount

  • Subtract shifted values and store in dst_begin

void vector_shift_sub_const(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, apy_limb_t constant, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, unsigned src1_shift_amount, std::size_t size)

For each element in the iterator regions [ *_begin, *_begin + size ):

  • Shift element in src1_begin left by src1_shift_amount

  • Subtract constant from shifted element and store the result in dst_begin

void vector_shift_sub_const_even_odd(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, apy_limb_t even_constant, apy_limb_t odd_constant, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, unsigned src1_shift_amount, unsigned src2_shift_amount, std::size_t size)

For each element in the iterator regions [ *_begin, *_begin + size ):

  • Shift element in src1_begin left by src1_shift_amount

  • Shift even_constant / odd_constant left by src2_shift_amount

  • Subtract alternating constants from shifted element: even_constant for even lanes, odd_constant for odd lanes

  • Store the result in dst_begin

void vector_shift_div_signed(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, APyBuffer<apy_limb_t>::vector_type::const_iterator src2_begin, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, unsigned src1_shift_amount, std::size_t size)

For each element in the iterator regions [ *_begin, *_begin + size ):

  • Shift element in src1_begin left by src1_shift_amount

  • Divide shifted element (numerator) by src2_begin (denominator) and store the result in dst_begin

void vector_shift_div_const_signed(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, apy_limb_t constant, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, unsigned src1_shift_amount, std::size_t size)

For each element in the iterator regions [ *_begin, *_begin + size ):

  • Shift element in src1_begin left by src1_shift_amount

  • Divide shifted element (numerator) by constant (denominator) and store the result in dst_begin

void vector_mul(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, APyBuffer<apy_limb_t>::vector_type::const_iterator src2_begin, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, std::size_t size)

Perform signed multiplication of the elements in src1_begin with src2_begin and store the result in dst_begin, for size number of elements.

void vector_mul_complex(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, APyBuffer<apy_limb_t>::vector_type::const_iterator src2_begin, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, std::size_t size)

Perform element-wise complex multiplication of interleaved real and imaginary elements in src1_begin and src2_begin, storing the result in dst_begin.

void vector_mul_complex_const(APyBuffer<apy_limb_t>::vector_type::const_iterator src_begin, apy_limb_t real_constant, apy_limb_t imag_constant, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, std::size_t size)

Perform element-wise complex multiplication of interleaved real and imaginary elements in src_begin with an interleaved complex constant, storing the result in dst_begin.

void vector_mul_complex_real(APyBuffer<apy_limb_t>::vector_type::const_iterator src_begin, APyBuffer<apy_limb_t>::vector_type::const_iterator real_src_begin, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, std::size_t size)

Perform element-wise multiplication of interleaved complex elements in src_begin with real elements in real_src_begin, storing the result in dst_begin.

void vector_shift_div_complex_real(APyBuffer<apy_limb_t>::vector_type::const_iterator src_begin, APyBuffer<apy_limb_t>::vector_type::const_iterator real_src_begin, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, unsigned src_shift_amount, std::size_t size)

Divide interleaved complex elements in src_begin by real elements in real_src_begin after shifting the numerator, storing the result in dst_begin.

void vector_shift_div_complex_const(APyBuffer<apy_limb_t>::vector_type::const_iterator src_begin, apy_limb_t real_constant, apy_limb_t imag_constant, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, unsigned src_shift_amount, std::size_t size)

Divide interleaved complex elements in src_begin by a complex constant after multiplying by its conjugate and shifting the numerator.

void vector_shift_div_complex(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, APyBuffer<apy_limb_t>::vector_type::const_iterator src2_begin, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, unsigned src_shift_amount, std::size_t size)

Divide interleaved complex elements in src1_begin by interleaved complex elements in src2_begin after conjugate multiplication and numerator shifting.

void vector_shift_rdiv_complex(apy_limb_t real_constant, apy_limb_t imag_constant, APyBuffer<apy_limb_t>::vector_type::const_iterator src_begin, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, unsigned src_shift_amount, std::size_t size)

Divide a real constant by interleaved complex elements after multiplying by their conjugates and shifting the numerator.

void vector_add(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, APyBuffer<apy_limb_t>::vector_type::const_iterator src2_begin, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, std::size_t size)

Perform addition of the elements in src1_begin with src2_begin and store the result in dst_begin, for size number of elements.

void vector_sub(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, APyBuffer<apy_limb_t>::vector_type::const_iterator src2_begin, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, std::size_t size)

Perform subtraction of the elements in src1_begin with src2_begin and store the result in dst_begin, for size number of elements.

void vector_add_const(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, apy_limb_t constant, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, std::size_t size)

Perform addition of the elements in src1_begin with a constant constant and store the result in dst_begin, for size number of elements.

void vector_add_const_even_odd(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, apy_limb_t even_constant, apy_limb_t odd_constant, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, std::size_t size)

Perform addition of the elements in src1_begin with alternating constants, using even_constant for even lanes and odd_constant for odd lanes, and store the result in dst_begin, for size number of elements.

void vector_sub_const(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, apy_limb_t constant, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, std::size_t size)

Perform subtraction of the elements in src1_begin with a constant constant and store the result in dst_begin, for size number of elements.

void vector_sub_const_even_odd(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, apy_limb_t even_constant, apy_limb_t odd_constant, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, std::size_t size)

Perform subtraction of the elements in src1_begin with alternating constants, using even_constant for even lanes and odd_constant for odd lanes, and store the result in dst_begin, for size number of elements.

void vector_neg(APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, APyBuffer<apy_limb_t>::vector_type::const_iterator src_begin, std::size_t size)

Perform negation of the elements in src_begin, for size number of elements.

void vector_conj(APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, APyBuffer<apy_limb_t>::vector_type::const_iterator src_begin, std::size_t size)

Perform conjugate of the elements in src_begin, for size number of elements.

void vector_not(APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, APyBuffer<apy_limb_t>::vector_type::const_iterator src_begin, std::size_t size)

Perform logic not of the elements in src_begin, for size number of elements.

void vector_abs(APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, APyBuffer<apy_limb_t>::vector_type::const_iterator src_begin, std::size_t size)

Perform absolute computation of the elements in src_begin, for size number of elements.

void vector_mul_const(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, apy_limb_t constant, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, std::size_t size)

Perform signed multiplication of the elements in src1_begin with a constant constant and store the result in dst_begin, for size number of elements.

void vector_rsub_const(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, apy_limb_t constant, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, std::size_t size)

Perform subtraction of the constant in constant with the elements in src1_begin and store the result in dst_begin, for size number of elements.

void vector_rsub_const_even_odd(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, apy_limb_t even_constant, apy_limb_t odd_constant, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, std::size_t size)

Perform reverse subtraction of alternating constants with the elements in src1_begin and store the result in dst_begin, for size number of elements.

void vector_rdiv_const_signed(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, apy_limb_t constant, APyBuffer<apy_limb_t>::vector_type::iterator dst_begin, std::size_t size)

For each element in the iterator regions [ *_begin, *_begin + size ):

  • Divide constant (numerator) by the element in src1_begin (signed)

  • Store the result in dst_begin

apy_limb_t vector_multiply_accumulate(APyBuffer<apy_limb_t>::vector_type::const_iterator src1_begin, APyBuffer<apy_limb_t>::vector_type::const_iterator src2_begin, std::size_t size)

Multiply (signed) and accumulate all elements from src1_begin with src2_begin for size number of elements. Return accumulated value.

bool vector_any_zero(APyBuffer<apy_limb_t>::vector_type::const_iterator src_begin, std::size_t size)

Return true if any element in [ src_begin, src_begin + size ) is zero.

bool vector_any_zero_pairwise(APyBuffer<apy_limb_t>::vector_type::const_iterator src_begin, std::size_t size)

Return true if any complex pair in [ src_begin, src_begin + size ) is zero in both its real and imaginary components.

CREATE_FUNCTOR_FROM_FUNC(add_functor, vector_add)
CREATE_FUNCTOR_FROM_FUNC(sub_functor, vector_sub)
CREATE_FUNCTOR_FROM_FUNC(add_const_functor, vector_add_const)
CREATE_FUNCTOR_FROM_FUNC(add_const_even_odd_functor, vector_add_const_even_odd)
CREATE_FUNCTOR_FROM_FUNC(sub_const_functor, vector_sub_const)
CREATE_FUNCTOR_FROM_FUNC(sub_const_even_odd_functor, vector_sub_const_even_odd)
CREATE_FUNCTOR_FROM_FUNC(rsub_const_even_odd_functor, vector_rsub_const_even_odd)
CREATE_FUNCTOR_FROM_FUNC(shift_add_functor, vector_shift_add)
CREATE_FUNCTOR_FROM_FUNC(shift_sub_functor, vector_shift_sub)
CREATE_FUNCTOR_FROM_FUNC(shift_add_const_functor, vector_shift_add_const)
CREATE_FUNCTOR_FROM_FUNC(shift_add_const_even_odd_functor, vector_shift_add_const_even_odd)
CREATE_FUNCTOR_FROM_FUNC(shift_sub_const_functor, vector_shift_sub_const)
CREATE_FUNCTOR_FROM_FUNC(shift_sub_const_even_odd_functor, vector_shift_sub_const_even_odd)