23namespace vctr::expressions
28template <
size_t extent,
class SrcAType,
class SrcBType>
37 VCTR_COMMON_BINARY_VEC_VEC_EXPRESSION_MEMBERS (
MultiplyVectors, srcA, srcB)
39 VCTR_FORCEDINLINE
constexpr auto operator[] (
size_t i)
const
41 return srcA[i] * srcB[i];
44 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
47 Expression::Accelerate::mul (srcA.evalNextVectorOpInExpressionChain (dst), srcB.evalNextVectorOpInExpressionChain (dst), dst, size());
51 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
54 Expression::IPP::mul (srcA.evalNextVectorOpInExpressionChain (dst), srcB.evalNextVectorOpInExpressionChain (dst), dst,
sizeToInt (size()));
59 VCTR_FORCEDINLINE
void evalVectorOpMultiplyAccumulate (value_type* dst)
const
62 Expression::Accelerate::multiplyAdd (srcA.data(), srcB.data(), dst, dst, size());
65 VCTR_FORCEDINLINE
void evalVectorOpMultiplyAccumulate (value_type* dst)
const
68 Expression::IPP::multiplyAccumulate (srcA.data(), srcB.data(), dst,
sizeToInt (size()));
72 VCTR_FORWARD_PREPARE_SIMD_EVALUATION_BINARY_EXPRESSION_MEMBER_FUNCTIONS (srcA, srcB)
78 return Expression::AVX::mul (srcA.getAVX (i), srcB.getAVX (i));
86 return Expression::Neon::mul (srcA.getNeon (i), srcB.getNeon (i));
92template <
size_t extent,
class SrcType>
100 VCTR_FORCEDINLINE
constexpr value_type operator[] (
size_t i)
const
102 return single * src[i];
105 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
108 Expression::Accelerate::mul (src.evalNextVectorOpInExpressionChain (dst), single, dst, size());
112 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
115 Expression::IPP::mul (src.evalNextVectorOpInExpressionChain (dst), single, dst,
sizeToInt (size()));
119 VCTR_FORCEDINLINE
void evalVectorOpMultiplyAccumulate (value_type* dst)
const
122 Expression::Accelerate::multiplyAdd (src.data(), single, dst, dst, size());
125 VCTR_FORCEDINLINE
void evalVectorOpMultiplyAccumulate (value_type* dst)
const
128 Expression::IPP::multiplyAccumulate (src.data(), single, dst,
sizeToInt (size()));
133 VCTR_FORCEDINLINE VCTR_TARGET (
"avx")
void prepareAVXEvaluation()
const
136 src.prepareAVXEvaluation();
137 singleSIMD.avx = Expression::AVX::broadcast (single);
141 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
143 return Expression::AVX::mul (singleSIMD.avx, src.getAVX (i));
147 VCTR_FORCEDINLINE VCTR_TARGET (
"sse4.1")
void prepareSSEEvaluation()
const
150 src.prepareSSEEvaluation();
151 singleSIMD.sse = Expression::SSE::broadcast (single);
155 requires (archX64 &&
has::getSSE<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
157 return Expression::SSE::mul (singleSIMD.sse, src.getSSE (i));
165template <
size_t extent,
class SrcType, is::constant ConstantType>
171 static constexpr auto constant = value_type (ConstantType::value);
175 VCTR_FORCEDINLINE
constexpr value_type operator[] (
size_t i)
const
177 return constant * src[i];
180 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
183 Expression::Accelerate::mul (src.evalNextVectorOpInExpressionChain (dst), constant, dst, size());
187 VCTR_FORCEDINLINE
const value_type* evalNextVectorOpInExpressionChain (value_type* dst)
const
190 Expression::IPP::mul (src.evalNextVectorOpInExpressionChain (dst), constant, dst,
sizeToInt (size()));
194 VCTR_FORCEDINLINE
void evalVectorOpMultiplyAccumulate (value_type* dst)
const
197 Expression::Accelerate::multiplyAdd (src.data(), constant, dst, dst, size());
200 VCTR_FORCEDINLINE
void evalVectorOpMultiplyAccumulate (value_type* dst)
const
203 Expression::IPP::multiplyAccumulate (src.data(), constant, dst,
sizeToInt (size()));
208 VCTR_FORCEDINLINE
void prepareNeonEvaluation()
const
211 src.prepareNeonEvaluation();
212 constantSIMD.neon = Expression::Neon::broadcast (constant);
216 requires (archARM &&
has::getNeon<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
218 return Expression::Neon::mul (constantSIMD.neon, src.getNeon (i));
222 VCTR_FORCEDINLINE VCTR_TARGET (
"avx")
void prepareAVXEvaluation()
const
225 src.prepareAVXEvaluation();
226 constantSIMD.avx = Expression::AVX::broadcast (constant);
230 requires (archX64 &&
has::getAVX<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
232 return Expression::AVX::mul (constantSIMD.avx, src.getAVX (i));
236 VCTR_FORCEDINLINE VCTR_TARGET (
"sse4.1")
void prepareSSEEvaluation()
const
239 src.prepareSSEEvaluation();
240 constantSIMD.sse = Expression::SSE::broadcast (constant);
244 requires (archX64 &&
has::getSSE<SrcType> && Expression::allElementTypesSame && Expression::CommonElement::isRealFloat)
246 return Expression::SSE::mul (constantSIMD.sse, src.getSSE (i));
255namespace vctr::detail
258struct IsMultiplicationExpression : std::false_type {};
260template <
size_t e,
class A,
class B>
261struct IsMultiplicationExpression<expressions::MultiplyVectors<e, A, B>> : std::true_type {};
263template <
size_t e,
class A>
264struct IsMultiplicationExpression<expressions::MultiplyVecBySingle<e, A>> : std::true_type {};
274template <
class SrcAType,
class SrcBType>
275requires (is::anyVctrOrExpression<std::remove_cvref_t<SrcAType>> &&
276 is::anyVctrOrExpression<std::remove_cvref_t<SrcBType>>)
277constexpr auto operator* (SrcAType&& a, SrcBType&& b)
280 constexpr auto extent = getCommonExtent<SrcAType, SrcBType>();
290requires is::anyVctrOrExpression<Src>
291constexpr auto operator* (
typename std::remove_cvref_t<Src>::value_type single, Src&& vec)
301requires is::anyVctrOrExpression<Src>
302constexpr auto operator* (Src&& vec,
typename std::remove_cvref_t<Src>::value_type single)
312template <auto constantValue>
Multiplies a vector like type by a single compile time constant value.
Definition: Multiply.h:167
Multiplies a vector like type by a single value.
Definition: Multiply.h:94
Multiplies two vector like types.
Definition: Multiply.h:30
Constrains a type to have a member function getAVX (size_t) const.
Definition: ContainerAndExpressionConcepts.h:92
Constrains a type to have a member function getNeon (size_t) const.
Definition: ContainerAndExpressionConcepts.h:84
Constrains a type to have a member function getSSE (size_t) const.
Definition: ContainerAndExpressionConcepts.h:100
Constrains a type to have a member function prepareAVXEvaluation() const.
Definition: ContainerAndExpressionConcepts.h:88
Constrains a type to have a member function prepareNeonEvaluation() const.
Definition: ContainerAndExpressionConcepts.h:80
Constrains a type to have a member function prepareSSEEvaluation() const.
Definition: ContainerAndExpressionConcepts.h:96
Constrains a type to be any derived instance of VctrBase.
Definition: ContainerAndExpressionConcepts.h:210
A combined concept to check if Apple Accelerate is a suitable option for a real valued floating point...
Definition: ContainerAndExpressionConcepts.h:260
A combined concept to check if Apple Accelerate is a suitable option for a real or complex valued flo...
Definition: ContainerAndExpressionConcepts.h:329
A combined concept to check if Intel IPP is a suitable option for a real valued floating point vector...
Definition: ContainerAndExpressionConcepts.h:284
A combined concept to check if Intel IPP is a suitable option for a real or complex valued floating p...
Definition: ContainerAndExpressionConcepts.h:342
A combined concept to check if Intel IPP is a suitable option for a real or complex valued floating p...
Definition: ContainerAndExpressionConcepts.h:296
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:313
constexpr auto operator*(SrcAType &&a, SrcBType &&b)
Returns an expression that multiplies vector or expression a with vector or expression b.
Definition: Multiply.h:277
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:256
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
typename detail::CommonVecExpressionType< A, B, op >::type CommonVecExpressionType
Used to figure out the value_type for binary vector-vector operations.
Definition: ExpressionTemplate.h:177
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:157
The base class to every expression template.
Definition: ExpressionTemplate.h:37
Definition: NeonRegister.h:28
Definition: SSERegister.h:28
Helper template to define a union of all supported SIMD types.
Definition: ExpressionTemplate.h:123