|
template<typename D , std::size_t N> |
bool | any_of (const mchunk_t< D, N > &arg) |
|
template<typename D , std::size_t N> |
bool | all_of (const mchunk_t< D, N > &arg) |
|
template<typename D , std::size_t N> |
bool | none_of (const mchunk_t< D, N > &arg) |
|
template<typename src_t , typename trg_t , std::size_t vsize> |
void | convert (const hwy_simd_type< src_t, vsize > &src, hwy_simd_type< trg_t, vsize > &trg) |
|
template<typename T , std::size_t vsize> |
void | convert (const hwy_simd_type< double, vsize > &src, hwy_simd_type< T, vsize > &trg) |
|
template<typename T , std::size_t vsize> |
void | convert (const hwy_simd_type< T, vsize > &src, hwy_simd_type< double, vsize > &trg) |
|
template<typename T , std::size_t vsize> |
void | convert (const vspline::simd_type< T, vsize > &src, hwy_simd_type< T, vsize > &trg) |
|
template<typename T , std::size_t vsize> |
void | convert (const hwy_simd_type< T, vsize > &src, vspline::simd_type< T, vsize > &trg) |
|
template<typename src_t , typename trg_t , std::size_t vsize> |
void | convert (const vspline::simd_type< src_t, vsize > &src, hwy_simd_type< trg_t, vsize > &trg) |
|
template<typename src_t , typename trg_t , std::size_t vsize> |
void | convert (const hwy_simd_type< src_t, vsize > &src, vspline::simd_type< trg_t, vsize > &trg) |
|
|
template<typename _value_type , std::size_t _vsize> |
struct HWY_ALIGN | hwy_simd_type |
| class template hwy_simd_type provides a fixed-size container type for small-ish sets of fundamentals which are stored in a POD C vector. This implementation uses highway to code the loops more efficiently. It mimicks Vc::SimdArray, just like vspline::simd_type does, and The code is derived from vspline::simd_array, changing the workhorse code from simple loops to the use of highway functions. The resulting type, with it's 'container-typical' interface, slots in well with the higher-level constructs used in vspline/lux and, at the same time, 'contains' the SIMD implementation in this class, so that it's use doesn't need to be known outside. As an arithmetic type, hwy_simd_type provides many mathematical operators and some functions - most of them are realized by calling corresponding highway functions, but some (still) rely on loops, either because they aren't performance-critical or because there is no highway code to be had for the purpose. Some methods are (currently) exclusive to this class, but may be ported to other SIMD interface classes; apart from the original 'goading' class vspline::simd_type, there is also an implementation using std::simd in pv/vspline/std_simd_type.h The lane count for a hwy_simd_type in this body of code should be a power of two, and it should be at least as large as the hardware lane count of the smallest fundamental used in vectorized form. To cover all eventualities, the hardware lane count of a vector of unsigned char (uint8_t) is a good choice. This choice is to avoid that hwy_simd_type objects of small T remain partly empty when a given small vsize is chosen to cater for vectors with larger T. At times, this will lead to overly high register pressure, and the overall performance may benefit from allowing partially filled hwy_simd_type via a smaller vsize, which is feasible because hwy_simd_type uses highway vectors with CappedTag. More...
|
|
template<typename _value_type , std::size_t _vsize>
class template hwy_simd_type provides a fixed-size container type for small-ish sets of fundamentals which are stored in a POD C vector. This implementation uses highway to code the loops more efficiently. It mimicks Vc::SimdArray, just like vspline::simd_type does, and The code is derived from vspline::simd_array, changing the workhorse code from simple loops to the use of highway functions. The resulting type, with it's 'container-typical' interface, slots in well with the higher-level constructs used in vspline/lux and, at the same time, 'contains' the SIMD implementation in this class, so that it's use doesn't need to be known outside. As an arithmetic type, hwy_simd_type provides many mathematical operators and some functions - most of them are realized by calling corresponding highway functions, but some (still) rely on loops, either because they aren't performance-critical or because there is no highway code to be had for the purpose. Some methods are (currently) exclusive to this class, but may be ported to other SIMD interface classes; apart from the original 'goading' class vspline::simd_type, there is also an implementation using std::simd in pv/vspline/std_simd_type.h The lane count for a hwy_simd_type in this body of code should be a power of two, and it should be at least as large as the hardware lane count of the smallest fundamental used in vectorized form. To cover all eventualities, the hardware lane count of a vector of unsigned char (uint8_t) is a good choice. This choice is to avoid that hwy_simd_type objects of small T remain partly empty when a given small vsize is chosen to cater for vectors with larger T. At times, this will lead to overly high register pressure, and the overall performance may benefit from allowing partially filled hwy_simd_type via a smaller vsize, which is feasible because hwy_simd_type uses highway vectors with CappedTag.
Definition at line 584 of file hwy_simd_type.h.