我正在计算高度并行化的trig函数(在像1024的块中),并且我想利用至少一些现代体系结构所具有的并行性。C中的矢量化Trig函数?
当我编译块
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倍加速)。我确定以前有人遇到过这样的问题,但是当我google时,我发现没有提及任何库或类似的东西。
A.有没有东西存在? B.如果不是,建议优化并行触发函数?
编辑:我发现了以下库称为“SLEEF”:http://shibatch.sourceforge.net/它在this论文中描述,并使用SIMD指令来计算几个基本功能。它使用SSE和AVX特定代码,但我认为将其转换为标准C循环并不困难。
我在Debian/Linux的x86_64的,GCC。理想情况下,我希望能在GCC支持矢量化的大多数平台上运行。 – 2011-02-24 20:29:27