我在程序中执行的常见操作是按标量缩放向量(V*s,例如 [1,2,3,4]*2 == [2,4,6,8])。除了首先在向量中的每个位置加载标量(例如 _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);
然而,像这样的标量常量只需要在任何循环之外初始化一次,因此性能成本应该是无关紧要的。 (除非标量值在循环内发生变化?)
与往常一样,您应该查看编译器生成的代码,并尝试在合适的分析器下运行代码,以查看热点的真正位置。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)