我正在寻找计算高度并行化的三角函数(在 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 循环并不难。