首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SSE类型的pow

SSE类型的pow
EN

Stack Overflow用户
提问于 2014-09-19 22:14:43
回答 4查看 5.9K关注 0票数 9

我使用SSE类型进行了一些显式的矢量化计算,例如__m128 (在xmmintrin.h等中定义),但现在我需要将向量的所有元素提升到某个(相同)幂,即理想情况下,我会想要像__m128 _mm_pow_ps(__m128, float)这样的东西,不幸的是,它并不存在。

解决这个问题的最好方法是什么?我可以存储向量,对每个元素调用std::pow,然后重新加载它。这是我能做的最好的事了吗?当自动向量化本来可以很好地向量化的代码时,编译器如何实现对std::pow的调用?有没有什么库可以提供有用的东西?

(请注意,this question不是通过重复来关联的,因此肯定没有一个有用的答案。)

EN

回答 4

Stack Overflow用户

发布于 2014-09-19 22:46:37

将公式exp(y*log(x))用于pow(x, y)a library以及exp()log()的SSE实现。

由@Royi编辑:以上仅在xy均为正的情况下成立。否则,需要更仔细的数学运算。参见https://math.stackexchange.com/questions/2089690

票数 8
EN

Stack Overflow用户

发布于 2014-09-22 18:04:43

对于这些类型的运算,我非常推荐使用英特尔短向量数学库。该库与您在要支持的编译器列表中提到的英特尔编译器捆绑在一起。我怀疑它对gcc和clang是否有用,但它可以作为基准测试的参考点,无论您想出什么pow实现。

https://software.intel.com/sites/products/documentation/doclib/iss/2013/compiler/cpp-lin/GUID-DEB8B19C-E7A2-432A-85E4-D5648250188E.htm

票数 2
EN

Stack Overflow用户

发布于 2017-03-29 19:12:40

现在可以使用ssemath库的AVX版本:http://software-lisc.fbk.eu/avx_mathfun/

对于该库,您可以使用:

代码语言:javascript
复制
exp256_ps(y*log256_ps(x)); // for pow(x, y)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25936031

复制
相关文章

相似问题

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