首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向量化的Trig函数在C?

向量化的Trig函数在C?
EN

Stack Overflow用户
提问于 2011-02-25 04:09:50
回答 5查看 3.7K关注 0票数 8

我希望计算高度并行的trig函数(在1024块中),并且我希望至少利用现代体系结构所具有的一些并行性。

当我编译一个块时

代码语言:javascript
复制
for(int i=0; i<SIZE; i++) {
   arr[i]=sin((float)i/1024);
}

GCC不会矢量化,他说

代码语言:javascript
复制
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循环并不难。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-06-09 04:52:59

我的答案是创建我自己的库来做这件事,叫做vectrig:https://github.com/jeremysalwen/vectrig

票数 0
EN

Stack Overflow用户

发布于 2011-02-25 04:36:30

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

  • http://gruntthepeon.free.fr/ssemath/
    • 它使用SSE和SSE2指令来实现it.

  • http://www.gamasutra.com/view/feature/4248/designing_fast_crossplatform_simd_.php
    • 这有一个替代实现。有些评论是相当good.

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

票数 4
EN

Stack Overflow用户

发布于 2011-02-25 04:28:18

既然你想在这里计算谐波,我有一些code that addressed a similar problem。它已经矢量化了,而且比我找到的任何东西都要快。附带的好处是,你可以免费得到余弦。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5109864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档