C中的矢量化Trigfunction?

我正在寻找计算高度并行化的trig函数(在1024的块中),并且我想利用至少一些现代架构所具有的并行性。

当我编译一个块

for(int i=0; i<SIZE; i++) { arr[i]=sin((float)i/1024); } 

海湾合作委员会不会对其进行矢量化,并表示

 not vectorized: relevant stmt not supported: D.3068_39 = __builtin_sinf (D.3069_38); 

这对我来说很有意义。 但是,我想知道是否有一个库可以进行并行三角计算。

只有一个简单的泰勒系列上升到11阶,GCC将矢量化所有循环,并且我的速度超过了一个天真的sin循环的速度的两倍(具有精确的答案,或者具有9阶系列,只有一个位)关闭1600个值的最后两个,加速> 3倍)。 我确定有人之前遇到过这样的问题,但是当我谷歌时,我发现没有提到任何库等。

A.是否已存在某些内容?
B.如果没有,建议优化并行触发function?

编辑:我发现了以下库名为“SLEEF”: http ://shibatch.sourceforge.net/,在本文中描述并使用SIMD指令计算几个基本function。 它使用SSE和AVX特定代码,但我认为将其转换为标准C循环并不困难。

既然你说你正在使用GCC,看起来有一些选择:

也就是说,我可能会考虑使用GPGPU来寻找解决方案。 也许用CUDA或OpenCL编写它(如果我没记错,CUDA支持正弦函数)。 以下是一些看起来可能更容易的库。

既然你想在这里计算谐波,我有一些代码可以解决类似的问题 。 它已经比我发现的任何其他东西更快速地进行了矢量化。 作为附带好处,您可以免费获得余弦。

你在用什么平台? 许多此类库已经存在:

  • 英特尔提供带有icc的矢量数学库(VML)。
  • Apple提供vForce库作为Accelerate框架的一部分。
  • 惠普为Itanium提供了自己的Vector Math Library(也可能是其他架构)。
  • Sun为libmvec提供了他们的编译工具。

而不是泰勒系列,我会看看fdlibm使用的算法。 他们应该用更少的步骤来获得更高的精度。

我的答案是创建我自己的库来完成这个名为vectrig: https : //github.com/jeremysalwen/vectrig