C 中的向量化三角函数?

问题描述 投票:0回答:6

我希望计算高度并行的三角函数(以 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 循环并不困难。

c gcc vectorization trigonometry
6个回答
4
投票

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

也就是说,我可能会研究 GPGPU 来寻求解决方案。也许用 CUDA 或 OpenCL 编写(如果我没记错的话 CUDA 支持正弦函数)。这里有一些库看起来可能会让事情变得更容易。


2
投票

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


1
投票

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

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

1
投票

我会查看 fdlibm 使用的算法,而不是泰勒级数。他们应该以更少的步骤为您提供尽可能高的精度。


0
投票

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


0
投票

您可以检查这个提供 AVX/Neon 三角函数“内在函数”的单头库,易于集成:https://github.com/Geolm/math_intrinsics

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