我在程序中执行的一个常见操作是按标量缩放 vector (V*s,例如 [1,2,3,4]*2 == [2,4,6,8])。除了首先在 vector 中的每个位置加载标量(例如 _mm_set_ps(2,2,2,2))然后相乘之外,是否有 SSE(或 AVX)指令来执行此操作?
这就是我现在做的:
__m128 _scalar = _mm_set_ps(s,s,s,s);
__m128 _result = _mm_mul_ps(_vector, _scalar);
我正在寻找类似...
__m128 _result = _mm_scale_ps(_vector, s);
最佳答案
根据您的编译器,您可以通过使用 _mm_set1_ps
稍微改进代码生成:
const __m128 scalar = _mm_set1_ps(s);
__m128 result = _mm_mul_ps(vector, scalar);
然而,像这样的标量常量应该只需要在任何循环之外初始化一次,因此性能成本应该无关紧要。 (除非标量值在循环内发生变化?)
与往常一样,您应该查看编译器生成的代码,并尝试在合适的分析器下运行您的代码,以查看热点的真实位置。
关于c - 上海证券交易所 (SIMD) : multiply vector by scalar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9079580/