8

我正在寻找计算高度并行化的三角函数(在 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 就会对所有循环进行矢量化,而且我的速度是单纯 sin 循环的两倍(使用位精确的答案,或者使用 9 阶系列,只有一位关闭 1600 个值中的最后两个,以获得 > 3 倍的加速)。我敢肯定有人以前遇到过这样的问题,但是当我用谷歌搜索时,我发现没有提到任何库等。

A. 有什么东西已经存在了吗?
B. 如果没有,关于优化并行触发函数的建议?

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

4

5 回答 5

4

既然你说你使用的是 GCC,看起来有一些选项:

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

于 2011-02-24T20:36:30.187 回答
2

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

于 2011-02-24T20:28:17.853 回答
1

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

于 2011-02-24T21:20:23.800 回答
1

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

  • 英特尔提供带有 icc 的向量数学库 (VML)。
  • Apple 提供 vForce 库作为 Accelerate 框架的一部分。
  • HP 为 Itanium 提供了他们自己的向量数学库(可能还有其他架构)。
  • Sun 为 libmvec 提供了他们的编译器工具。
  • ...
于 2011-02-24T20:24:08.813 回答
0

我的答案是创建我自己的库来完全做到这一点,称为 vectrig:https ://github.com/jeremysalwen/vectrig

于 2011-06-08T20:52:58.517 回答