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,看起来有一些选择:
- http://gruntthepeon.free.fr/ssemath/
- 这使用SSE和SSE2指令来实现它。
- http://www.gamasutra.com/view/feature/4248/designing_fast_crossplatform_simd_.php
- 这有一个替代实现。 一些评论非常好。
也就是说,我可能会考虑使用GPGPU来寻找解决方案。 也许用CUDA或OpenCL编写它(如果我没记错,CUDA支持正弦函数)。 以下是一些看起来可能更容易的库。
既然你想在这里计算谐波,我有一些代码可以解决类似的问题 。 它已经比我发现的任何其他东西更快速地进行了矢量化。 作为附带好处,您可以免费获得余弦。
你在用什么平台? 许多此类库已经存在:
- 英特尔提供带有icc的矢量数学库(VML)。
- Apple提供vForce库作为Accelerate框架的一部分。
- 惠普为Itanium提供了自己的Vector Math Library(也可能是其他架构)。
- Sun为libmvec提供了他们的编译工具。
- …
而不是泰勒系列,我会看看fdlibm使用的算法。 他们应该用更少的步骤来获得更高的精度。
我的答案是创建我自己的库来完成这个名为vectrig: https : //github.com/jeremysalwen/vectrig