我希望计算高度并行的trig函数(在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);这对我来说是有道理的。然而,我想知道是否有一个库可以进行并行trig计算。
使用一个简单的11阶泰勒级数,GCC将向量化所有的循环,并且我得到的速度比简单的正弦循环快两倍(使用比特精确的答案,或者使用9阶级数,1600个值中的最后两个只差一位,加速比>3倍)。我肯定有人以前遇到过这样的问题,但当我搜索时,我没有找到任何库或类似的提及。
答:有没有已经存在的东西?
如果不是,优化并行trig函数的建议是什么?
编辑:我找到了以下名为“SLEEF”的库:http://shibatch.sourceforge.net/,它在this论文中进行了描述,并使用SIMD指令来计算几个基本函数。它使用SSE和AVX特定的代码,但我认为将其转换为标准C循环并不难。
发布于 2011-06-09 04:52:59
我的答案是创建我自己的库来做这件事,叫做vectrig:https://github.com/jeremysalwen/vectrig
发布于 2011-02-25 04:36:30
既然你说你用的是GCC,看起来有一些选择:
的
也就是说,我可能会在GPGPU中寻找解决方案。也许是用CUDA或OpenCL编写的(如果我没记错的话,CUDA支持正弦函数)。这里有一些库,它们看起来可能会让它变得更容易。
发布于 2011-02-25 04:28:18
既然你想在这里计算谐波,我有一些code that addressed a similar problem。它已经矢量化了,而且比我找到的任何东西都要快。附带的好处是,你可以免费得到余弦。
https://stackoverflow.com/questions/5109864
复制相似问题