c - 上海证券交易所 (SIMD) : multiply vector by scalar

标签 c x86 sse simd

我在程序中执行的一个常见操作是按标量缩放 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/

相关文章:

c - 如何在 AC_COMPILE_IFELSE 程序中使用 AC_CHECK_HEADER header

c - 64 位中的 setjmp/longjmp

c++ - 映射共享库部分 : libhmmm. 时出错,因此:成功

assembly - 这些特定的汇编指令(使用 db 和 dw)如何导致计算机重新启动?

需要显式调用 free() 的 C 函数

visual-c++ - 更快的组装优化方式在 RGB8 和 RGB32 图像之间转换

x86 - 字节序如何与SIMD寄存器一起工作?

c++ - SSE 从 __m128 中提取整数以索引数组

C函数定义中返回类型的多个关键字

c - 0xfbad8001 回溯中的魔数(Magic Number)