用于SSE类型的战俘

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

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

(请注意, 这个问题与重复无关,当然没有一个有用的答案。)

对于pow(x, y)和具有 exp和log的SSE实现的库 ,使用公式exp(y*log(x))

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

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

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

您可以使用以下库:

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

从浮动中创建一个向量。

  _mm_pow_ps(v,_mm_ps1(f))