我使用SSE类型进行了一些显式向量化计算,例如__m128
(在xmmintrin.h
等中定义),但现在我需要将向量的所有元素提升到某个(相同)幂,即理想情况下,我会想要像__m128 _mm_pow_ps(__m128, float)
这样的东西,遗憾的是它不存在。
最好的方法是什么?我可以存储向量,在每个元素上调用std::pow
,然后重新加载它。这是我能做的最好的吗?编译器如何在自动矢量化代码时实现对std::pow
的调用,否则代码可以很好地实现矢量化?有没有提供有用功能的库?
(请注意,this question与重复有关,并且肯定没有重要的答案。)
答案 0 :(得分:7)
对exp(y*log(x))
和a library使用公式pow(x, y)
,并使用exp和log的SSE实现。
答案 1 :(得分:2)
我真的推荐英特尔短矢量数学库用于这些类型的操作。该库与英特尔编译器捆绑在一起,您可以在支持的编译器列表中提及该编译器。我怀疑它对gcc和clang有用,但它可以作为基准测试的参考点,无论你在哪里实现它。
答案 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))