是否有可能在AVX / SSE中获得多个正弦值?

时间:2015-01-13 23:24:51

标签: windows x86-64 sse avx

我试图编写一个C ++程序,它启动了我在x64汇编程序中编写的函数。 我想加快速度(并使用CPU功能),所以我选择使用矢量操作。

问题是,我必须将正弦乘以整数,所以我必须首先计算正弦值。 是否可以在SSE / AVX中执行此操作?我知道指令fsin,但它不仅在FPU中,而且一次只能计算1个正弦值。因此,我必须在FPU中将其推送,调用fsin,将其从FPU弹出到内存,然后将其放入AVX寄存器。在我看来,这不值得麻烦。

3 个答案:

答案 0 :(得分:2)

由于OpenMP 4.0需要向量化的sin / cos扩展,因此gcc-glibc也在libmvec中提供了它们。参见:

有关其他SVML替代项的列表,请参见https://stackoverflow.com/a/36637424

答案 1 :(得分:0)

SSE / AVX中没有正弦指令,但是根据您所需的精度,您可以使用Taylor/Madhava series作为多项式或使用{{3}作为两个多项式的商来写正弦函数的近似值}}。当然还有更多的多项式逼近技术。

这是否会产生您想要的精度以及此方法的速度取决于您的确切问题。一般来说,多项式近似非常快,因为可以使用n个FMA指令(Pade近似也需要一个除法)通过以

的形式写出它来评估n次多项式。
  

A + X *(B + X *(C + X *(...)))。

然而,当使用多项式进行近似时,正弦表现出色,因此使用情况有限。

答案 2 :(得分:0)

是的,有一个使用SSE / AVX的矢量版本! 但问题是必须使用英特尔C ++编译器。

这称为英特尔小矢量数学库(内在函数):

对于128位SSE,请使用(双精度): _mm_sin_pd

对于256bit AVX请使用(双精度): _mm256_sin_pd

这两个内在函数实际上是非常小的函数,包括手写的SSE / AVX程序集,现在你可以使用AVX一次处理4个正弦计算:=)延迟约为10个时钟周期(如果我没记错的话)在Haswell CPU上。

顺便说一句,CPU需要执行大约100个这样的内在函数来预热并达到其峰值性能,如果只需要评估几个sin函数,那么使用普通sin()会更好代替。

祝你好运!!