C 中的向量化三角函数?

2023-11-22

我希望计算高度并行的三角函数(以 1024 为单位),并且我想至少利用现代架构所具有的一些并行性。

当我编译一个块时

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

GCC 不会对其进行矢量化,并表示

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

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

只需要一个简单的 11 阶泰勒级数,GCC 就会对所有循环进行矢量化,并且我获得的速度是朴素正弦循环的两倍以上(使用位精确答案,或者使用 9 阶级数,只有一位)关闭 1600 个值中的最后两个,以获得 >3 倍的加速)。我确信有人以前遇到过这样的问题,但是当我谷歌时,我发现没有提到任何库之类的。

A. 是否已经存在一些东西?
B. 如果没有,有优化并行三角函数的建议吗?

编辑:我找到了以下名为“SLEEF”的库:http://shibatch.sourceforge.net/中描述的this论文并使用 SIMD 指令来计算几个基本函数。它使用 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 支持正弦函数)。以下是一些看起来可能会让事情变得更容易的库。

  • https://code.google.com/p/slmath/
  • https://code.google.com/p/thrust/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 中的向量化三角函数? 的相关文章

随机推荐