SSE(SIMD):乘以向量向量

在我的程序中,我做的一个常见的操作就是用一个标量(V * s,例如[1,2,3,4] * 2 == [2,4,6,8])来缩放向量。是否有SSE(或AVX)指令来执行此操作,而不是首先将向量中的每个位置加载标量(例如_mm_set_ps(2,2,2,2)),然后乘以?

这是我现在做的:

__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);

然而,这样的标量常量只需要在任何循环之外被初始化一次,因此性能成本应该是无关紧要的。 (除非标量值在循环内变化?)

一如往常,您应该看看编译器生成的代码,并尝试在一个体面的分析器下运行代码,以查看热点真正的位置。

http://stackoverflow.com/questions/9079580/sse-simd-multiply-vector-by-scalar

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:SSE(SIMD):乘以向量向量