Clang的'_mm256_pow_ps'本质在哪里?

use*_*761 3 sse clang avx

我似乎找不到_mm_pow_ps或_mm256_pow_ps的内在函数,它们都应该包含在'immintrin.h'中。

Clang不会定义这些,还是在我不包括的标头中?

Pet*_*des 5

那不是内在的;这是一个英特尔库函数名称,该名称容易混淆地使用与实际内部函数相同的命名方案。 没有vpowps指示。 (至强融核上的AVX512ER确实具有半相关的vexp2ps说明...)

为了使此类功能_mm_sin_ps可用,您需要英特尔的短向量数学库(SVML)。大多数人只是避免使用它们。但是,如果它具有所需的实现,则值得研究。IDK还有哪些其他矢量pow实现。

如果未选中此框,则在内函数查找器中,可以避免在搜索结果中看到这些不可移植的功能SVML

还有一些“复合”内在就像_mm_set_epi8()通常编译成多负载和洗牌这跨编译器移植,并做内联,而不是被库函数的调用。

还要注意,这sqrtps是本机指令,_mm_sqrt_ps()真正的内在指令也是如此。IEEE 754将mul,div,add,sub和sqrt指定为“基本”操作,这些操作需要产生正确取整的结果(错误<= 0.5ulp),因此sqrt()非常特殊,并且具有直接的硬件支持,这与大多数其他“数学”不同库”功能。


有各种SIMD数学函数库。其中一些附带C ++包装库,该库允许a+b而不是_mm_add_ps(a,b)

  • glibc libmvec-从glibc 2.22开始,支持OpenMP 4.0矢量数学函数。GCC知道如何自动向量化的一些功能,如cos()sin()和可能pow()使用它。 该答案显示了一种不便的方式,将其显式地用于手动矢量化。(希望有更好的方法可能会在源代码中没有名称混乱的情况)。

  • Agner Fog的VCL具有一些数学函数,例如explog。(已获得GPL许可,但未获得 LGPL许可,因此只能在GPL兼容项目中使用)。

  • https://github.com/microsoft/DirectXMath(MIT 许可证)-我认为可移植到非Windows系统,并且不需要DirectX。
  • https://sleef.org/-显然仅在Windows上支持MSVC

  • 英特尔自己的SVML(ICC附带;默认情况下,ICC使用SVML自动矢量化)。令人困惑的是它的原型immintrin.h与实际的内在函数一起存在。也许他们想诱使人们编写依赖于英特尔工具/库的代码。或者也许他们认为包含的内容越少越好,并且每个人都应该使用其编译器...

    还涉及到:具有矩阵BLAS功能的Intel MKL(数学内核库)。

  • AMD ACML-报废的封闭源免费软件。我认为它仅具有循环遍历数组/矩阵的功能(如Intel MKL),而不具有单个SIMD向量的功能。

  • sse_mathfun(zlib许可证)SSE2和ARM NEON。似乎自2011年以来就没有更新过。但是确实有单向量数学/触发函数的实现。

  • Agner Fog在他的开源VectorClass库中实现了SVML中的大多数功能。他声称它与SVML竞争。 (3认同)