LIBINT  2.6.0
Classes
libint2::simd Namespace Reference

Contains data types that support SIMD-style computation on vectors of numbers. More...

Classes

struct  Vector
 Vector<N,T> is used by vectorized Libint library as fixed-length vectors amenable for SIMD-style parallelism Vectorization via this class should be the last-resort measure if no specialized implementation is available. More...
 
struct  VectorAVXDouble
 SIMD vector of 4 double-precision floating-point real numbers, operations on which use AVX instructions available on recent x86 hardware from Intel (starting with Sandy Bridge processors released in 2011) and AMD (starting with Bulldozer released in 2011). More...
 
struct  VectorAVXFloat
 SIMD vector of 8 single-precision floating-point real numbers, operations on which use AVX instructions available on recent x86 hardware from Intel (starting with Sandy Bridge processors released in 2011) and AMD (starting with Bulldozer released in 2011). More...
 
struct  VectorFP2Double
 SIMD vector of 2 double-precision floating-point real numbers, operations on which use FP2 (Double Hummer) instructions available on some PowerPC hardware, e.g. More...
 
struct  VectorQPXDouble
 SIMD vector of 4 double-precision floating-point real numbers, operations on which use QPX instructions available on some recent PowerPC hardware, e.g. More...
 
struct  VectorSSEDouble
 SIMD vector of 2 double-precision floating-point real numbers, operations on which use SSE2 instructions available on all recent x86 hardware. More...
 
struct  VectorSSEFloat
 SIMD vector of 4 single-precision floating-point real numbers, operations on which use SSE instructions available on all recent x86 hardware. More...
 

Functions

template<size_t N, typename T >
Vector< N, T > operator* (T a, Vector< N, T > b)
 
template<size_t N, typename T >
Vector< N, T > operator* (Vector< N, T > a, T b)
 
template<size_t N, typename T >
Vector< N, T > operator* (int a, Vector< N, T > b)
 
template<size_t N, typename T >
Vector< N, T > operator* (Vector< N, T > a, int b)
 
template<size_t N, typename T >
Vector< N, T > operator* (Vector< N, T > a, Vector< N, T > b)
 
template<size_t N, typename T >
Vector< N, T > operator+ (Vector< N, T > a, Vector< N, T > b)
 
template<size_t N, typename T >
Vector< N, T > operator- (Vector< N, T > a, Vector< N, T > b)
 
template<size_t N, typename T >
Vector< N, T > operator/ (Vector< N, T > a, Vector< N, T > b)
 
VectorQPXDouble operator* (double a, VectorQPXDouble b)
 
VectorQPXDouble operator* (VectorQPXDouble a, double b)
 
VectorQPXDouble operator* (int a, VectorQPXDouble b)
 
VectorQPXDouble operator* (VectorQPXDouble a, int b)
 
VectorQPXDouble operator* (VectorQPXDouble a, VectorQPXDouble b)
 
VectorQPXDouble operator+ (VectorQPXDouble a, VectorQPXDouble b)
 
VectorQPXDouble operator- (VectorQPXDouble a, VectorQPXDouble b)
 
VectorQPXDouble operator/ (VectorQPXDouble a, VectorQPXDouble b)
 
VectorQPXDouble fma_plus (VectorQPXDouble a, VectorQPXDouble b, VectorQPXDouble c)
 
VectorQPXDouble fma_minus (VectorQPXDouble a, VectorQPXDouble b, VectorQPXDouble c)
 
VectorFP2Double operator* (double a, VectorFP2Double b)
 
VectorFP2Double operator* (VectorFP2Double a, double b)
 
VectorFP2Double operator* (int a, VectorFP2Double b)
 
VectorFP2Double operator* (VectorFP2Double a, int b)
 
VectorFP2Double operator* (VectorFP2Double a, VectorFP2Double b)
 
VectorFP2Double operator+ (VectorFP2Double a, VectorFP2Double b)
 
VectorFP2Double operator- (VectorFP2Double a, VectorFP2Double b)
 
VectorFP2Double fma_plus (VectorFP2Double a, VectorFP2Double b, VectorFP2Double c)
 
VectorFP2Double fma_minus (VectorFP2Double a, VectorFP2Double b, VectorFP2Double c)
 
VectorSSEDouble operator* (double a, VectorSSEDouble b)
 
VectorSSEDouble operator* (VectorSSEDouble a, double b)
 
VectorSSEDouble operator* (int a, VectorSSEDouble b)
 
VectorSSEDouble operator* (VectorSSEDouble a, int b)
 
VectorSSEDouble operator* (VectorSSEDouble a, VectorSSEDouble b)
 
VectorSSEDouble operator+ (VectorSSEDouble a, VectorSSEDouble b)
 
VectorSSEDouble operator- (VectorSSEDouble a, VectorSSEDouble b)
 
VectorSSEDouble operator/ (VectorSSEDouble a, VectorSSEDouble b)
 
VectorSSEDouble fma_plus (VectorSSEDouble a, VectorSSEDouble b, VectorSSEDouble c)
 
VectorSSEDouble fma_minus (VectorSSEDouble a, VectorSSEDouble b, VectorSSEDouble c)
 
double horizontal_add (VectorSSEDouble const &a)
 Horizontal add. More...
 
VectorSSEDouble horizontal_add (VectorSSEDouble const &a, VectorSSEDouble const &b)
 Horizontal add of a pair of vectors. More...
 
VectorSSEDouble exp (VectorSSEDouble a)
 
VectorSSEDouble sqrt (VectorSSEDouble a)
 
VectorSSEDouble erf (VectorSSEDouble a)
 
VectorSSEDouble erfc (VectorSSEDouble a)
 
VectorSSEFloat operator* (float a, VectorSSEFloat b)
 
VectorSSEFloat operator* (VectorSSEFloat a, float b)
 
VectorSSEFloat operator* (double a, VectorSSEFloat b)
 
VectorSSEFloat operator* (VectorSSEFloat a, double b)
 
VectorSSEFloat operator* (int a, VectorSSEFloat b)
 
VectorSSEFloat operator* (VectorSSEFloat a, int b)
 
VectorSSEFloat operator* (VectorSSEFloat a, VectorSSEFloat b)
 
VectorSSEFloat operator+ (VectorSSEFloat a, VectorSSEFloat b)
 
VectorSSEFloat operator- (VectorSSEFloat a, VectorSSEFloat b)
 
VectorSSEFloat operator/ (VectorSSEFloat a, VectorSSEFloat b)
 
VectorSSEFloat fma_plus (VectorSSEFloat a, VectorSSEFloat b, VectorSSEFloat c)
 
VectorSSEFloat fma_minus (VectorSSEFloat a, VectorSSEFloat b, VectorSSEFloat c)
 
VectorSSEFloat exp (VectorSSEFloat a)
 
VectorSSEFloat sqrt (VectorSSEFloat a)
 
VectorSSEFloat erf (VectorSSEFloat a)
 
VectorSSEFloat erfc (VectorSSEFloat a)
 
VectorAVXDouble operator* (double a, VectorAVXDouble b)
 
VectorAVXDouble operator* (VectorAVXDouble a, double b)
 
VectorAVXDouble operator* (int a, VectorAVXDouble b)
 
VectorAVXDouble operator* (VectorAVXDouble a, int b)
 
VectorAVXDouble operator* (VectorAVXDouble a, VectorAVXDouble b)
 
VectorAVXDouble operator+ (VectorAVXDouble a, VectorAVXDouble b)
 
VectorAVXDouble operator+ (int a, VectorAVXDouble b)
 
VectorAVXDouble operator+ (VectorAVXDouble a, int b)
 
VectorAVXDouble operator- (VectorAVXDouble a, VectorAVXDouble b)
 
VectorAVXDouble operator/ (VectorAVXDouble a, VectorAVXDouble b)
 
VectorAVXDouble fma_plus (VectorAVXDouble a, VectorAVXDouble b, VectorAVXDouble c)
 
VectorAVXDouble fma_minus (VectorAVXDouble a, VectorAVXDouble b, VectorAVXDouble c)
 
double horizontal_add (VectorAVXDouble const &a)
 Horizontal add. More...
 
VectorSSEDouble horizontal_add (VectorAVXDouble const &a, VectorAVXDouble const &b)
 Horizontal add of a pair of vectors. More...
 
VectorAVXDouble horizontal_add (VectorAVXDouble const &a, VectorAVXDouble const &b, VectorAVXDouble const &c, VectorAVXDouble const &d)
 Horizontal add of a set of 4 vectors. More...
 
VectorAVXDouble exp (VectorAVXDouble a)
 
VectorAVXDouble sqrt (VectorAVXDouble a)
 
VectorAVXDouble erf (VectorAVXDouble a)
 
VectorAVXDouble erfc (VectorAVXDouble a)
 
VectorAVXFloat operator* (double a, VectorAVXFloat b)
 
VectorAVXFloat operator* (VectorAVXFloat a, double b)
 
VectorAVXFloat operator* (int a, VectorAVXFloat b)
 
VectorAVXFloat operator* (VectorAVXFloat a, int b)
 
VectorAVXFloat operator* (VectorAVXFloat a, VectorAVXFloat b)
 
VectorAVXFloat operator+ (VectorAVXFloat a, VectorAVXFloat b)
 
VectorAVXFloat operator- (VectorAVXFloat a, VectorAVXFloat b)
 
VectorAVXFloat operator/ (VectorAVXFloat a, VectorAVXFloat b)
 
VectorAVXFloat fma_plus (VectorAVXFloat a, VectorAVXFloat b, VectorAVXFloat c)
 
VectorAVXFloat fma_minus (VectorAVXFloat a, VectorAVXFloat b, VectorAVXFloat c)
 
VectorAVXFloat exp (VectorAVXFloat a)
 
VectorAVXFloat sqrt (VectorAVXFloat a)
 
VectorAVXFloat erf (VectorAVXFloat a)
 
VectorAVXFloat erfc (VectorAVXFloat a)
 

Detailed Description

Contains data types that support SIMD-style computation on vectors of numbers.

Function Documentation

◆ horizontal_add() [1/5]

double libint2::simd::horizontal_add ( VectorSSEDouble const &  a)
inline

Horizontal add.

Parameters
ainput vector = {a[0], a[1]}
Returns
a[0] + a[1]

Referenced by horizontal_add().

◆ horizontal_add() [2/5]

VectorSSEDouble libint2::simd::horizontal_add ( VectorSSEDouble const &  a,
VectorSSEDouble const &  b 
)
inline

Horizontal add of a pair of vectors.

Parameters
ainput vector = {a[0], a[1]}
binput vector = {b[0], b[1]}
Returns
{a[0] + a[1], b[0] + b[1]}

References horizontal_add().

◆ horizontal_add() [3/5]

double libint2::simd::horizontal_add ( VectorAVXDouble const &  a)
inline

Horizontal add.

Parameters
ainput vector = {a[0], a[1], a[2], a[3]}
Returns
a[0] + a[1] + a[2] + a[3]

◆ horizontal_add() [4/5]

VectorSSEDouble libint2::simd::horizontal_add ( VectorAVXDouble const &  a,
VectorAVXDouble const &  b 
)
inline

Horizontal add of a pair of vectors.

Parameters
ainput vector = {a[0], a[1], a[2], a[3]}
binput vector = {b[0], b[1], b[2], b[3]}
Returns
{a[0] + a[1] + a[2] + a[3], b[0] + b[1] + b[2] + b[3]}

◆ horizontal_add() [5/5]

VectorAVXDouble libint2::simd::horizontal_add ( VectorAVXDouble const &  a,
VectorAVXDouble const &  b,
VectorAVXDouble const &  c,
VectorAVXDouble const &  d 
)
inline

Horizontal add of a set of 4 vectors.

Parameters
ainput vector = {a[0], a[1], a[2], a[3]}
binput vector = {b[0], b[1], b[2], b[3]}
cinput vector = {c[0], c[1], c[2], c[3]}
dinput vector = {d[0], d[1], d[2], d[3]}
Returns
{a[0] + a[1] + a[2] + a[3], b[0] + b[1] + b[2] + b[3], c[0] + c[1] + c[2] + c[3], d[0] + d[1] + d[2] + d[3]}