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

问题描述 投票:2回答:3

我正在尝试编写C ++程序,该程序将启动我在x64汇编器中编写的功能。我想加快速度(并使用CPU功能),所以我选择使用向量运算。

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

windows x86-64 sse avx
3个回答
1
投票

是的,有使用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()。

祝你好运!


2
投票

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

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


0
投票

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

这是否会产生所需的精度以及此方法的速度取决于您的确切问题。一般而言,多项式逼近非常快,因为可以使用n> FMA指令(第一个Pade近似也需要除法)来评估第n次多项式,方法是将其写成

a + x *(b + x *(c + x *(...)))。

然而,当使用多项式近似时,罪过恶名昭著,因此用例受到限制。

© www.soinside.com 2019 - 2024. All rights reserved.