用于SSE类型的战俘

时间:2014-09-19 14:14:43

标签: c++ c sse pow

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

最好的方法是什么?我可以存储向量,在每个元素上调用std::pow,然后重新加载它。这是我能做的最好的吗?编译器如何在自动矢量化代码时实现对std::pow的调用,否则代码可以很好地实现矢量化?有没有提供有用功能的库?

(请注意,this question与重复有关,并且肯定没有重要的答案。)

4 个答案:

答案 0 :(得分:7)

exp(y*log(x))a library使用公式pow(x, y),并使用exp和log的SSE实现。

答案 1 :(得分:2)

我真的推荐英特尔短矢量数学库用于这些类型的操作。该库与英特尔编译器捆绑在一起,您可以在支持的编译器列表中提及该编译器。我怀疑它对gcc和clang有用,但它可以作为基准测试的参考点,无论你在哪里实现它。

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

答案 2 :(得分:1)

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

使用您可以使用的库:

exp256_ps(y*log256_ps(x)); // for pow(x, y)

答案 3 :(得分:-2)

从浮动中创建一个向量。

 _mm_pow_ps(v,_mm_ps1(f))