23namespace vctr::platform_vec_ops
34class AppleAccelerate<float>
41 static void abs (
const float* src,
float* dst,
int len) { vvfabsf (dst, src, &len); }
42 static void ln (
const float* src,
float* dst,
int len) { vvlogf (dst, src, &len); }
43 static void log10 (
const float* src,
float* dst,
int len) { vvlog10f (dst, src, &len); }
44 static void log2 (
const float* src,
float* dst,
int len) { vvlog2f (dst, src, &len); }
45 static void exp (
const float* src,
float* dst,
int len) { vvexpf (dst, src, &len); }
46 static void exp2 (
const float* src,
float* dst,
int len) { vvexp2f (dst, src, &len); }
47 static void pow (
const float* base,
const float*
exp,
float* dst,
int len) { vvpowf (dst,
exp, base, &len); }
48 static void sqrt (
const float* src,
float* dst,
int len) { vvsqrtf (dst, src, &len); }
49 static void sin (
const float* src,
float* dst,
int len) { vvsinf (dst, src, &len); }
50 static void cos (
const float* src,
float* dst,
int len) { vvcosf (dst, src, &len); }
51 static void tan (
const float* src,
float* dst,
int len) { vvtanf (dst, src, &len); }
52 static void asin (
const float* src,
float* dst,
int len) { vvasinf (dst, src, &len); }
53 static void acos (
const float* src,
float* dst,
int len) { vvacosf (dst, src, &len); }
54 static void atan (
const float* src,
float* dst,
int len) { vvatanf (dst, src, &len); }
55 static void sinh (
const float* src,
float* dst,
int len) { vvsinhf (dst, src, &len); }
56 static void cosh (
const float* src,
float* dst,
int len) { vvcoshf (dst, src, &len); }
57 static void tanh (
const float* src,
float* dst,
int len) { vvtanhf (dst, src, &len); }
58 static void asinh (
const float* src,
float* dst,
int len) { vvasinhf (dst, src, &len); }
59 static void acosh (
const float* src,
float* dst,
int len) { vvacoshf (dst, src, &len); }
60 static void atanh (
const float* src,
float* dst,
int len) { vvatanhf (dst, src, &len); }
61 static void copysign (
const float* src,
const float* sign,
float* dst,
int len) { vvcopysignf (dst, src, sign, &len); }
68 static void abs (
const float* src,
float* dst,
size_t len) { vDSP_vabs (src, 1, dst, 1, len); }
69 static void add (
const float* srcA,
const float* srcB,
float* dst,
size_t len) { vDSP_vadd (srcA, 1, srcB, 1, dst, 1, len); }
70 static void add (
const float* srcA,
float srcB,
float* dst,
size_t len) { vDSP_vsadd (srcA, 1, &srcB, dst, 1, len); }
71 static void sub (
const float* srcA,
const float* srcB,
float* dst,
size_t len) { vDSP_vsub (srcB, 1, srcA, 1, dst, 1, len); }
72 static void mul (
const float* srcA,
const float* srcB,
float* dst,
size_t len) { vDSP_vmul (srcA, 1, srcB, 1, dst, 1, len); }
73 static void mul (
const float* srcA,
float srcB,
float* dst,
size_t len) { vDSP_vsmul (srcA, 1, &srcB, dst, 1, len); }
74 static void div (
const float* srcA,
const float* srcB,
float* dst,
size_t len) { vDSP_vdiv (srcB, 1, srcA, 1, dst, 1, len); }
75 static void div (
const float* srcA,
float srcB,
float* dst,
size_t len) { vDSP_vsdiv (srcA, 1, &srcB, dst, 1, len); }
77 static void multiplyAdd (
const float* srcA,
float srcB,
float srcC,
float* dst,
size_t len) { vDSP_vsmsa (srcA, 1, &srcB, &srcC, dst, 1, len); }
78 static void multiplyAdd (
const float* srcA,
const float* srcB,
const float* srcC,
float* dst,
size_t len) { vDSP_vma (srcA, 1, srcB, 1, srcC, 1, dst, 1, len); }
79 static void multiplyAdd (
const float* srcA,
float srcB,
const float* srcC,
float* dst,
size_t len) { vDSP_vsma (srcA, 1, &srcB, srcC, 1, dst, 1, len); }
81 static void clampLow (
const float* src,
float thresh,
float* dst,
size_t len) { vDSP_vthr (src, 1, &thresh, dst, 1, len); }
82 static void clamp (
const float* src,
float l,
float h,
float* dst,
size_t len) { vDSP_vclip (src, 1, &l, &h, dst, 1, len); }
83 static void square (
const float* src,
float* dst,
size_t len) { vDSP_vsq (src, 1, dst, 1, len); }
85 static void intToFloat (
const int32_t* src,
float* dst,
size_t len) { vDSP_vflt32 (src, 1, dst, 1, len); }
86 static void intToFloat (
const uint32_t* src,
float* dst,
size_t len) { vDSP_vfltu32 (src, 1, dst, 1, len); }
88 static float max (
const float* src,
size_t len) {
float r; vDSP_maxv (src, 1, &r, len);
return r; }
89 static float min (
const float* src,
size_t len) {
float r; vDSP_minv (src, 1, &r, len);
return r; }
90 static float sum (
const float* src,
size_t len) {
float r; vDSP_sve (src, 1, &r, len);
return r; }
91 static float mean (
const float* src,
size_t len) {
float r; vDSP_meanv (src, 1, &r, len);
return r; }
92 static float meanSquare (
const float* src,
size_t len) {
float r; vDSP_measqv (src, 1, &r, len);
return r; }
93 static float rms (
const float* src,
size_t len) {
float r; vDSP_rmsqv (src, 1, &r, len);
return r; }
98class AppleAccelerate<double>
105 static void abs (
const double* src,
double* dst,
int len) { vvfabs (dst, src, &len); }
106 static void ln (
const double* src,
double* dst,
int len) { vvlog (dst, src, &len); }
107 static void log10 (
const double* src,
double* dst,
int len) { vvlog10 (dst, src, &len); }
108 static void log2 (
const double* src,
double* dst,
int len) { vvlog2 (dst, src, &len); }
109 static void exp (
const double* src,
double* dst,
int len) { vvexp (dst, src, &len); }
110 static void exp2 (
const double* src,
double* dst,
int len) { vvexp2 (dst, src, &len); }
111 static void pow (
const double* base,
const double*
exp,
double* dst,
int len) { vvpow (dst,
exp, base, &len); }
112 static void sqrt (
const double* src,
double* dst,
int len) { vvsqrt (dst, src, &len); }
113 static void sin (
const double* src,
double* dst,
int len) { vvsin (dst, src, &len); }
114 static void cos (
const double* src,
double* dst,
int len) { vvcos (dst, src, &len); }
115 static void tan (
const double* src,
double* dst,
int len) { vvtan (dst, src, &len); }
116 static void asin (
const double* src,
double* dst,
int len) { vvasin (dst, src, &len); }
117 static void acos (
const double* src,
double* dst,
int len) { vvacos (dst, src, &len); }
118 static void atan (
const double* src,
double* dst,
int len) { vvatan (dst, src, &len); }
119 static void sinh (
const double* src,
double* dst,
int len) { vvsinh (dst, src, &len); }
120 static void cosh (
const double* src,
double* dst,
int len) { vvcosh (dst, src, &len); }
121 static void tanh (
const double* src,
double* dst,
int len) { vvtanh (dst, src, &len); }
122 static void asinh (
const double* src,
double* dst,
int len) { vvasinh (dst, src, &len); }
123 static void acosh (
const double* src,
double* dst,
int len) { vvacosh (dst, src, &len); }
124 static void atanh (
const double* src,
double* dst,
int len) { vvatanh (dst, src, &len); }
125 static void copysign (
const double* src,
const double* sign,
double* dst,
int len) { vvcopysign (dst, src, sign, &len); }
132 static void abs (
const double* src,
double* dst,
size_t len) { vDSP_vabsD (src, 1, dst, 1, len); }
133 static void add (
const double* srcA,
const double* srcB,
double* dst,
size_t len) { vDSP_vaddD (srcA, 1, srcB, 1, dst, 1, len); }
134 static void add (
const double* srcA,
double srcB,
double* dst,
size_t len) { vDSP_vsaddD (srcA, 1, &srcB, dst, 1, len); }
135 static void sub (
const double* srcA,
const double* srcB,
double* dst,
size_t len) { vDSP_vsubD (srcB, 1, srcA, 1, dst, 1, len); }
136 static void mul (
const double* srcA,
const double* srcB,
double* dst,
size_t len) { vDSP_vmulD (srcA, 1, srcB, 1, dst, 1, len); }
137 static void mul (
const double* srcA,
double srcB,
double* dst,
size_t len) { vDSP_vsmulD (srcA, 1, &srcB, dst, 1, len); }
138 static void div (
const double* srcA,
const double* srcB,
double* dst,
size_t len) { vDSP_vdivD (srcB, 1, srcA, 1, dst, 1, len); }
139 static void div (
const double* srcA,
double srcB,
double* dst,
size_t len) { vDSP_vsdivD (srcA, 1, &srcB, dst, 1, len); }
141 static void multiplyAdd (
const double* srcA,
double srcB,
double srcC,
double* dst,
size_t len) { vDSP_vsmsaD (srcA, 1, &srcB, &srcC, dst, 1, len); }
142 static void multiplyAdd (
const double* srcA,
const double* srcB,
const double* srcC,
double* dst,
size_t len) { vDSP_vmaD (srcA, 1, srcB, 1, srcC, 1, dst, 1, len); }
143 static void multiplyAdd (
const double* srcA,
double srcB,
const double* srcC,
double* dst,
size_t len) { vDSP_vsmaD (srcA, 1, &srcB, srcC, 1, dst, 1, len); }
146 static void clampLow (
const double* src,
double thresh,
double* dst,
size_t len) { vDSP_vthrD (src, 1, &thresh, dst, 1, len); }
147 static void clamp (
const double* src,
double l,
double h,
double* dst,
size_t len) { vDSP_vclipD (src, 1, &l, &h, dst, 1, len); }
148 static void square (
const double* src,
double* dst,
size_t len) { vDSP_vsqD (src, 1, dst, 1, len); }
150 static void intToFloat (
const int32_t* src,
double* dst,
size_t len)
152 VCTR_ASSERT ((
void*) src != (
void*) dst);
153 vDSP_vflt32D (src, 1, dst, 1, len);
156 static void intToFloat (
const uint32_t* src,
double* dst,
size_t len)
158 VCTR_ASSERT ((
void*) src != (
void*) dst);
159 vDSP_vfltu32D (src, 1, dst, 1, len);
162 static double max (
const double* src,
size_t len) {
double r; vDSP_maxvD (src, 1, &r, len);
return r; }
163 static double min (
const double* src,
size_t len) {
double r; vDSP_minvD (src, 1, &r, len);
return r; }
164 static double sum (
const double* src,
size_t len) {
double r; vDSP_sveD (src, 1, &r, len);
return r; }
165 static double mean (
const double* src,
size_t len) {
double r; vDSP_meanvD (src, 1, &r, len);
return r; }
166 static double meanSquare (
const double* src,
size_t len) {
double r; vDSP_measqvD (src, 1, &r, len);
return r; }
167 static double rms (
const double* src,
size_t len) {
double r; vDSP_rmsqvD (src, 1, &r, len);
return r; }
171class AppleAccelerate<std::complex<float>>
175 static auto sp (std::complex<float>* c) {
return DSPSplitComplex {
reinterpret_cast<float*
> (c),
reinterpret_cast<float*
> (c) + 1 }; }
176 static const auto sp (
const std::complex<float>* c) {
return sp (
const_cast<std::complex<float>*
> (c)); }
177 static auto sp (std::complex<float>& c) {
return DSPSplitComplex { &
reinterpret_cast<float&
> (c), &
reinterpret_cast<float&
> (c) + 1 }; }
178 static const auto sp (
const std::complex<float>& c) {
return sp (
const_cast<std::complex<float>&
> (c)); }
185 static void abs (
const std::complex<float>* src,
float* dst,
size_t len)
188 vDSP_zvabs (&s, 2, dst, 1, len);
191 static void add (
const std::complex<float>* srcA,
const std::complex<float>* srcB, std::complex<float>* dst,
size_t len)
196 vDSP_zvadd (&sa, 2, &sb, 2, &d, 2, len);
199 static void add (
const std::complex<float>* srcA, std::complex<float> srcB, std::complex<float>* dst,
size_t len)
204 vDSP_vsadd (sa.realp, 2, sb.realp, d.realp, 2, len);
205 vDSP_vsadd (sa.imagp, 2, sb.imagp, d.imagp, 2, len);
208 static void sub (
const std::complex<float>* srcA,
const std::complex<float>* srcB, std::complex<float>* dst,
size_t len)
213 vDSP_zvsub (&sa, 2, &sb, 2, &d, 2, len);
216 static void mul (
const std::complex<float>* srcA,
const std::complex<float>* srcB, std::complex<float>* dst,
size_t len)
221 vDSP_zvmul (&sa, 2, &sb, 2, &d, 2, len, 1);
224 static void multiplyAdd (
const std::complex<float>* srcA,
const std::complex<float>* srcB,
const std::complex<float>* srcC, std::complex<float>* dst,
size_t len)
230 vDSP_zvma (&sa, 2, &sb, 2, &sc, 2, &d, 2, len);
233 static void div (
const std::complex<float>* srcA,
const std::complex<float>* srcB, std::complex<float>* dst,
size_t len)
238 vDSP_zvdiv (&sb, 2, &sa, 2, &d, 2, len);
241 static void conj (
const std::complex<float>* src, std::complex<float>* dst,
size_t len)
245 vDSP_zvconj (&s, 2, &d, 2, len);
248 static void angle (
const std::complex<float>* src,
float* dst,
size_t len)
251 vDSP_zvphas (&s, 2, dst, 1, len);
254 static void powerSpectrum (
const std::complex<float>* src,
float* dst,
size_t len)
257 vDSP_zvmags (&s, 2, dst, 1, len);
264 static void copyReal (
const std::complex<float>* src,
float* dst,
int len) { cblas_scopy (len,
reinterpret_cast<const float*
> (src), 2, dst, 1); }
265 static void copyImag (
const std::complex<float>* src,
float* dst,
int len) { cblas_scopy (len,
reinterpret_cast<const float*
> (src) + 1, 2, dst, 1); }
266 static void copyRealToComplex (
const float* src, std::complex<float>* dst,
int len) { cblas_scopy (len, src, 2,
reinterpret_cast<float*
> (dst), 1); }
270class AppleAccelerate<std::complex<double>>
274 static auto sp (std::complex<double>* c) {
return DSPDoubleSplitComplex {
reinterpret_cast<double*
> (c),
reinterpret_cast<double*
> (c) + 1}; }
275 static const auto sp (
const std::complex<double>* c) {
return sp (
const_cast<std::complex<double>*
> (c)); }
276 static auto sp (std::complex<double>& c) {
return DSPDoubleSplitComplex { &
reinterpret_cast<double&
> (c), &
reinterpret_cast<double&
> (c) + 1 }; }
277 static const auto sp (
const std::complex<double>& c) {
return sp (
const_cast<std::complex<double>&
> (c)); }
284 static void abs (
const std::complex<double>* src,
double* dst,
size_t len)
287 vDSP_zvabsD (&sc, 2, dst, 1, len);
290 static void add (
const std::complex<double>* srcA,
const std::complex<double>* srcB, std::complex<double>* dst,
size_t len)
295 vDSP_zvaddD (&sa, 2, &sb, 2, &d, 2, len);
298 static void add (
const std::complex<double>* srcA, std::complex<double> srcB, std::complex<double>* dst,
size_t len)
303 vDSP_vsaddD (sa.realp, 2, sb.realp, d.realp, 2, len);
304 vDSP_vsaddD (sa.imagp, 2, sb.imagp, d.imagp, 2, len);
307 static void sub (
const std::complex<double>* srcA,
const std::complex<double>* srcB, std::complex<double>* dst,
size_t len)
312 vDSP_zvsubD (&sa, 2, &sb, 2, &d, 2, len);
315 static void mul (
const std::complex<double>* srcA,
const std::complex<double>* srcB, std::complex<double>* dst,
size_t len)
320 vDSP_zvmulD (&sa, 2, &sb, 2, &d, 2, len, 1);
323 static void multiplyAdd (
const std::complex<double>* srcA,
const std::complex<double>* srcB,
const std::complex<double>* srcC, std::complex<double>* dst,
size_t len)
329 vDSP_zvmaD (&sa, 2, &sb, 2, &sc, 2, &d, 2, len);
332 static void div (
const std::complex<double>* srcA,
const std::complex<double>* srcB, std::complex<double>* dst,
size_t len)
337 vDSP_zvdivD (&sb, 2, &sa, 2, &d, 2, len);
340 static void conj (
const std::complex<double>* src, std::complex<double>* dst,
size_t len)
344 vDSP_zvconjD (&s, 2, &d, 2, len);
347 static void angle (
const std::complex<double>* src,
double* dst,
size_t len)
350 vDSP_zvphasD (&s, 2, dst, 1, len);
353 static void powerSpectrum (
const std::complex<double>* src,
double* dst,
size_t len)
356 vDSP_zvmagsD (&s, 2, dst, 1, len);
363 static void copyReal (
const std::complex<double>* src,
double* dst,
int len) { cblas_dcopy (len,
reinterpret_cast<const double*
> (src), 2, dst, 1); }
364 static void copyImag (
const std::complex<double>* src,
double* dst,
int len) { cblas_dcopy (len,
reinterpret_cast<const double*
> (src) + 1, 2, dst, 1); }
365 static void copyRealToComplex (
const double* src, std::complex<double>* dst,
int len) { cblas_dcopy (len, src, 2,
reinterpret_cast<double*
> (dst), 1); }
constexpr ExpressionChainBuilder< expressions::Log10 > log10
Computes the logarithm to the base of ten of the source values.
Definition: Log10.h:84
constexpr ExpressionChainBuilder< expressions::Sin > sin
Computes the sine of each source element.
Definition: Sin.h:90
constexpr ExpressionChainBuilder< expressions::Asinh > asinh
Computes the inverse hyperbolic sine of each source element.
Definition: Asinh.h:90
constexpr ExpressionChainBuilder< expressions::Exp > exp
Computes e (Euler's number, 2.7182818...) raised to the source vector elements power.
Definition: Exp.h:104
constexpr ExpressionChainBuilder< expressions::Asin > asin
Computes the inverse sine of each source element.
Definition: Asin.h:90
constexpr ExpressionChainBuilder< expressions::Acosh > acosh
Computes the inverse hyperbolic cosine of each source element.
Definition: Acosh.h:90
constexpr ExpressionChainBuilder< expressions::RootMeanSquare > rms
Computes the square root of the mean value of the squared source values.
Definition: Mean.h:260
constexpr ExpressionChainBuilder< expressions::Mean > mean
Computes the mean value of the source values.
Definition: Mean.h:248
constexpr ExpressionChainBuilder< expressions::Atan > atan
Computes the inverse tangent of each source element.
Definition: Atan.h:90
constexpr ExpressionChainBuilder< expressions::Ln > ln
Computes the natural logarithm of the source values.
Definition: Ln.h:84
constexpr auto clampLow(T lowerBound)
Ensures that the elements are not lower than lowerBound.
Definition: Clamp.h:287
constexpr ExpressionChainBuilder< expressions::Cosh > cosh
Computes the hyperbolic cosine of each source element.
Definition: Cosh.h:90
constexpr ExpressionChainBuilder< expressions::Acos > acos
Computes the inverse cosine of each source element.
Definition: Acos.h:90
constexpr ExpressionChainBuilder< expressions::Cos > cos
Computes the cosine of each source element.
Definition: Cos.h:90
constexpr ExpressionChainBuilder< expressions::Tan > tan
Computes the tangent of each source element.
Definition: Tan.h:90
constexpr ExpressionChainBuilder< expressions::Sqrt > sqrt
Computes the square root of the source values.
Definition: Sqrt.h:91
constexpr ExpressionChainBuilder< expressions::Atanh > atanh
Computes the inverse hyperbolic tangent of each source element.
Definition: Atanh.h:90
constexpr auto pow(SrcBaseType &&bases, SrcExpType &&exponents)
Returns an expression that raises the elements in bases element-wise to the power of the elements in ...
Definition: Pow.h:213
constexpr ExpressionChainBuilder< expressions::Sum > sum
Computes the sum of the source values.
Definition: Sum.h:118
constexpr ExpressionChainBuilder< expressions::Max > max
Computes the maximum value of the source values.
Definition: Max.h:198
constexpr ExpressionChainBuilder< expressions::Abs > abs
Computes the absolute value of the source values.
Definition: Abs.h:135
constexpr ExpressionChainBuilder< expressions::Angle > angle
Computes the phase angles of the complex source values.
Definition: Angle.h:67
constexpr ExpressionChainBuilder< expressions::Log2 > log2
Computes the logarithm to the base of two of the source values.
Definition: Log2.h:91
constexpr ExpressionChainBuilder< expressions::Square > square
Squares the source values.
Definition: Square.h:115
constexpr auto clamp(T lowerBound, T upperBound)
Ensures that the elements are not lower than lowerBound and not higher than upperBound.
Definition: Clamp.h:313
constexpr ExpressionChainBuilder< expressions::Sinh > sinh
Computes the hyperbolic sine of each source element.
Definition: Sinh.h:90
constexpr ExpressionChainBuilder< expressions::Min > min
Computes the minimum value of the source values.
Definition: Min.h:198
constexpr ExpressionChainBuilder< expressions::MeanSquare > meanSquare
Computes the mean value of the squared source values.
Definition: Mean.h:254
constexpr ExpressionChainBuilder< expressions::PowerSpectrum > powerSpectrum
Computes the power spectrum of the complex source values.
Definition: PowerSpectrum.h:72
constexpr ExpressionChainBuilder< expressions::Tanh > tanh
Computes the hyperbolic tangent of each source element.
Definition: Tanh.h:90