【发布时间】:2020-07-01 13:47:37
【问题描述】:
有没有比 C 内在函数更快的方法来在汇编中执行 _mm256_set1_ps?似乎内在函数编译为一系列 vmovss、vshufps、vmovss、vshufps 和 vinsertf128,甚至内在函数指南本身也表示效率低下。我想知道是否有其他方法可以做到这一点。我意识到如果有英特尔可能已经实现了它,但问一下也无妨....
【问题讨论】:
-
你想设置什么值?一个常数,一个来自内存的值,来自另一个寄存器?你是怎么编译的(你是用
-march=native -O2,还是类似的东西)?VBROADCASTSS我认为这是非常量值的最有效方法。 -
@chtz:一个好的编译器通常会使用
vbroadcastss来实现_mm256_set1_ps,特别是如果它是来自内存的运行时变量,例如array[i]或其他东西。一些编译器很愚蠢,在编译时将标量常量扩展为向量常量,即使它们最终只是在循环之前将其加载到寄存器中,而不是将其用作内存源操作数。这为vmovaps与vbroadcastss节省了 1 字节的代码大小,但需要 32 字节的数据缓存占用空间,而不是 4 字节。(AVX CPU 直接在加载端口中实现广播加载,至少英特尔是这样做的。)