用于SSE类型的pow

pow for SSE types

本文关键字:pow 类型 SSE 用于      更新时间:2023-10-16

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

最好的办法是什么?我可以存储向量,对每个元素调用std::pow,然后重新加载它。这是我能做的最好的事情吗?当对原本可以很好向量化的代码进行自动向量化时,编译器如何实现对std::pow的调用?有什么图书馆可以提供有用的东西吗?

(注意,这个问题没有重复,当然也没有有用的答案。)

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

编辑:@Royi:以上仅适用于CCD_ 10和CCD_。否则,需要更仔细的数学。看见https://math.stackexchange.com/questions/2089690.

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

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

现在提供了ssemath库的AVX版本:http://software-lisc.fbk.eu/avx_mathfun/

使用您可以使用的库:

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

从浮点中生成一个向量。

 _mm_pow_ps(v,_mm_ps1(f))