用于SSE类型的pow
pow for SSE types
我使用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))
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 用于SSE类型的pow
- pow()在使用类型转换时会产生意外结果
- 长类型Max等于int Max error + math.h pow()编译警告:隐式常量转换溢出