23namespace vctr::expressions
28template <
size_t extent,
class SrcAType,
class SrcBType>
34 VCTR_COMMON_BINARY_VEC_VEC_EXPRESSION_MEMBERS (
MultiplyVectors, srcA, srcB)
36 VCTR_FORCEDINLINE
constexpr value_type operator[] (
size_t i)
const
38 return srcA[i] * srcB[i];
41 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
44 Expression::Accelerate::mul (srcA.evalNextVectorOpInExpressionChain (dst), srcB.evalNextVectorOpInExpressionChain (dst), dst, size());
48 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
51 Expression::IPP::mul (srcA.evalNextVectorOpInExpressionChain (dst), srcB.evalNextVectorOpInExpressionChain (dst), dst, size());
56 VCTR_FORCEDINLINE
void evalVectorOpMultiplyAccumulate (value_type* dst)
const
59 Expression::Accelerate::multiplyAdd (srcA.data(), srcB.data(), dst, dst, size());
62 VCTR_FORCEDINLINE
void evalVectorOpMultiplyAccumulate (value_type* dst)
const
65 Expression::IPP::multiplyAccumulate (srcA.data(), srcB.data(), dst,
sizeToInt (size()));
73 return Expression::AVX::mul (srcA.getAVX (i), srcB.getAVX (i));
79template <
size_t extent,
class SrcType>
87 VCTR_FORCEDINLINE
constexpr value_type operator[] (
size_t i)
const
89 return single * src[i];
92 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
95 Expression::Accelerate::mul (src.evalNextVectorOpInExpressionChain (dst), single, dst, size());
99 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
102 Expression::IPP::mul (src.evalNextVectorOpInExpressionChain (dst), single, dst,
sizeToInt (size()));
106 VCTR_FORCEDINLINE
void evalVectorOpMultiplyAccumulate (value_type* dst)
const
109 Expression::Accelerate::multiplyAdd (src.data(), single, dst, dst, size());
112 VCTR_FORCEDINLINE
void evalVectorOpMultiplyAccumulate (value_type* dst)
const
115 Expression::IPP::multiplyAccumulate (src.data(), single, dst,
sizeToInt (size()));
121 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
123 return Expression::AVX::mul (Expression::AVX::fromSSE (singleAsSSE, singleAsSSE), src.getAVX (i));
129 requires (archX64 &&
has::getSSE<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
131 return Expression::SSE::mul (singleAsSSE, src.getSSE (i));
137template <
size_t extent,
class SrcType, is::constant ConstantType>
143 static constexpr auto constant = value_type (ConstantType::value);
147 void applyRuntimeArgs()
149 asSSE = Expression::SSESrc::broadcast (constant);
150 asNeon = Expression::NeonSrc::broadcast (constant);
153 VCTR_FORCEDINLINE
constexpr value_type operator[] (
size_t i)
const
155 return constant * src[i];
158 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
161 Expression::Accelerate::mul (src.evalNextVectorOpInExpressionChain (dst), constant, dst, size());
165 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
168 Expression::IPP::mul (src.evalNextVectorOpInExpressionChain (dst), constant, dst, size());
172 VCTR_FORCEDINLINE
void evalVectorOpMultiplyAccumulate (value_type* dst)
const
175 Expression::Accelerate::multiplyAdd (src.data(), constant, dst, dst, size());
178 VCTR_FORCEDINLINE
void evalVectorOpMultiplyAccumulate (value_type* dst)
const
181 Expression::IPP::multiplyAccumulate (src.data(), constant, dst,
sizeToInt (size()));
187 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
189 return Expression::AVX::mul (Expression::AVX::fromSSE (asSSE, asSSE), src.getAVX (i));
195 requires (archX64 &&
has::getSSE<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
197 return Expression::SSE::mul (asSSE, src.getSSE (i));
202 typename Expression::SSESrc asSSE;
203 typename Expression::NeonSrc asNeon;
208namespace vctr::detail
211struct IsMultiplicationExpression : std::false_type {};
213template <
size_t e,
class A,
class B>
214struct IsMultiplicationExpression<expressions::MultiplyVectors<e, A, B>> : std::true_type {};
216template <
size_t e,
class A>
217struct IsMultiplicationExpression<expressions::MultiplyVecBySingle<e, A>> : std::true_type {};
227template <
class SrcAType,
class SrcBType>
228requires (is::anyVctrOrExpression<std::remove_cvref_t<SrcAType>> &&
229 is::anyVctrOrExpression<std::remove_cvref_t<SrcBType>>)
230constexpr auto operator* (SrcAType&& a, SrcBType&& b)
233 constexpr auto extent = getCommonExtent<SrcAType, SrcBType>();
243requires is::anyVctrOrExpression<Src>
244constexpr auto operator* (
typename std::remove_cvref_t<Src>::value_type single, Src&& vec)
254requires is::anyVctrOrExpression<Src>
255constexpr auto operator* (Src&& vec,
typename std::remove_cvref_t<Src>::value_type single)
265template <auto constantValue>
Multiplies a vector like type by a single compile time constant value.
Definition: Multiply.h:139
Multiplies a vector like type by a single value.
Definition: Multiply.h:81
Multiplies two vector like types.
Definition: Multiply.h:30
Constrains a type to have a member function getAVX (size_t) const.
Definition: ContainerAndExpressionConcepts.h:78
Constrains a type to have a member function getSSE (size_t) const.
Definition: ContainerAndExpressionConcepts.h:82
Constrains a type to be any derived instance of VctrBase.
Definition: ContainerAndExpressionConcepts.h:192
A combined concept to check if Apple Accelerate is a suitable option for a real valued floating point...
Definition: ContainerAndExpressionConcepts.h:303
A combined concept to check if Apple Accelerate is a suitable option for a real valued floating point...
Definition: ContainerAndExpressionConcepts.h:242
A combined concept to check if Apple Accelerate is a suitable option for a real or complex valued flo...
Definition: ContainerAndExpressionConcepts.h:311
A combined concept to check if Intel IPP is a suitable option for a real valued floating point vector...
Definition: ContainerAndExpressionConcepts.h:266
A combined concept to check if Intel IPP is a suitable option for a real or complex valued floating p...
Definition: ContainerAndExpressionConcepts.h:324
A combined concept to check if Intel IPP is a suitable option for a real or complex valued floating p...
Definition: ContainerAndExpressionConcepts.h:278
constexpr ExpressionChainBuilder< expressions::MultiplyVecByConstant, Constant< constantValue > > multiplyByConstant
Returns an expression that multiplies a vector or expression source with a compile time constant.
Definition: Multiply.h:266
constexpr auto operator*(SrcAType &&a, SrcBType &&b)
Returns an expression that multiplies vector or expression a with vector or expression b.
Definition: Multiply.h:230
The main namespace of the VCTR project.
Definition: Array.h:24
constexpr void assertCommonSize(const A &a, const B &b)
Ensures that both sources have the same size.
Definition: Traits.h:253
typename detail::ValueType< std::remove_cvref_t< T > >::Type ValueType
If T is an expression template, it equals its return type, if it's a type that defines value_type as ...
Definition: Traits.h:201
int sizeToInt(size_t size)
Casts the size_t argument to an int.
Definition: PlatformVectorOpsHelpers.h:27
Definition: AVXRegister.h:28
An expression chain builder is an object which supplies various operator<< overloads which build chai...
Definition: ExpressionChainBuilder.h:136
The base class to every expression template.
Definition: ExpressionTemplate.h:37
Definition: SSERegister.h:28