我试图编写一个C ++程序,它启动了我在x64汇编程序中编写的函数。 我想加快速度(并使用CPU功能),所以我选择使用矢量操作。
问题是,我必须将正弦乘以整数,所以我必须首先计算正弦值。
是否可以在SSE / AVX中执行此操作?我知道指令fsin
,但它不仅在FPU中,而且一次只能计算1个正弦值。因此,我必须在FPU中将其推送,调用fsin
,将其从FPU弹出到内存,然后将其放入AVX寄存器。在我看来,这不值得麻烦。
答案 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()会更好代替。
祝你好运!!