我正在尝试编写C ++程序,该程序将启动我在x64汇编器中编写的功能。我想加快速度(并使用CPU功能),所以我选择使用向量运算。
问题是,我必须将正弦乘以整数,所以我必须先计算正弦。在SSE / AVX中可以这样做吗?我知道指令fsin
,但它不仅在FPU中,而且一次只计算1个正弦值。因此,我必须将其推入FPU,调用fsin
,将其从FPU弹出到内存中,然后将其放入AVX寄存器中。在我看来,这不值得麻烦。
是的,有使用SSE / AVX的矢量版本! 但是要注意的是必须使用Intel C ++编译器。
这被称为英特尔小型向量数学库(内部语言):
对于128位SSE,请使用(双精度):_ mm_sin_pd
对于256位AVX,请使用(双精度):_ mm256_sin_pd
这两个内在函数实际上是很小的函数,它们由手写的SSE / AVX程序集组成,现在您可以使用AVX:=一次处理4个正弦计算,延迟约为10个时钟周期(如果我没记错的话), Haswell CPU。
顺便说一句,CPU需要执行大约100个这样的内在函数来预热并达到其峰值性能,如果仅需要评估几个sin函数,则最好使用普通sin()。
祝你好运!
由于OpenMP 4.0需要向量化的sin / cos扩展,因此gcc-glibc也在libmvec
中提供了它们。参见:
有关其他SVML替代项的列表,请参见https://stackoverflow.com/a/36637424。
SSE / AVX中没有正弦指令,但是根据精度要求,您可以使用Taylor/Madhava series作为多项式或使用Pade Approximant作为两个多项式的商来写正弦函数的近似值。当然还有更多的多项式逼近技术。
这是否会产生所需的精度以及此方法的速度取决于您的确切问题。一般而言,多项式逼近非常快,因为可以使用n> FMA指令(第一个Pade近似也需要除法)来评估第n次多项式,方法是将其写成
a + x *(b + x *(c + x *(...)))。
然而,当使用多项式近似时,罪过恶名昭著,因此用例受到限制。