我正在寻找计算高度并行化的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支持正弦函数)。 以下是一些看起来可能更容易的库。
既然你想在这里计算谐波,我有一些代码可以解决类似的问题 。 它已经比我发现的任何其他东西更快速地进行了矢量化。 作为附带好处,您可以免费获得余弦。
你在用什么平台? 许多此类库已经存在:
而不是泰勒系列,我会看看fdlibm使用的算法。 他们应该用更少的步骤来获得更高的精度。
我的答案是创建我自己的库来完成这个名为vectrig: https : //github.com/jeremysalwen/vectrig
需要了解更多c/c++开发分享C中的矢量化Trigfunction?,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享C中的矢量化Trigfunction?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/979600.html