Clang 的'_mm256_pow_ps' 在哪里?

Where is Clang's '_mm256_pow_ps' intrinsic?

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

Clang 没有定义这些还是它们在 header 我不包括在内?

这不是内在的;它是一个 Intel SVML 库 function name,混淆地使用了与实际内在函数相同的命名方案。 没有 vpowps 指令。(Xeon Phi 上的 AVX512ER 确实有 the semi-related vexp2ps 指令...)

IDK 如果这个命名方案是为了欺骗人们在使用他们的编译器(SVML 附带)编写 SIMD 代码时依赖英特尔工具,或者因为他们的编译器确实将其视为 intrinsic/builtin 来执行常量如果输入已知或其他原因,则传播。

要使用 _mm_sin_ps 等功能,您需要英特尔的 Short Vector Math Library (SVML)。大多数人只是避免使用它们。但是,如果它实现了您想要的东西,那么值得研究一下。 IDK 存在哪些其他向量 pow 实现。


intrinsics finder 中,如果不选中 SVML 框,您可以避免在搜索结果中看到这些不可移植的函数。

有一些 "composite" 内部函数,例如 _mm_set_epi8(),它们通常编译为多个加载和随机播放, 可跨编译器移植,并且内联而不是调用库函数。

另请注意,sqrtps 是本机机器指令,因此 _mm_sqrt_ps() 是真正的内在指令。 IEEE 754 将 mul、div、add、sub 和 sqrt 指定为 "basic" 需要产生正确舍入结果(误差 <= 0.5ulp)的操作,因此 sqrt() 是特殊的并且与大多数其他 "math library" 函数不同,确实有直接的硬件支持。


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

的 C++ 包装器库
  • glibc libmvec - since glibc 2.22, to support OpenMP 4.0 vector math functions. GCC knows how to auto-vectorize some functions like cos(), sin(), and probably pow() using it. 显示了一种明确使用它进行手动矢量化的不方便方式。 (希望在源代码中没有损坏名称的更好方法是可能的)。

  • Agner Fog's VCL 有一些数学函数,如 explog。 (以前是 GPL 许可,现在是 Apache)。

  • https://github.com/microsoft/DirectXMath(麻省理工学院许可证)- 我认为可移植到非 Windows,并且不需要 DirectX。
  • https://sleef.org/ - 显然性能出色,您可以选择可变精度。以前仅支持 Windows 上的 MSVC,其网站上的支持矩阵现在包括适用于 x86-64 GNU/Linux 和 AArch64 的 GCC 和 Clang。

  • Intel's own SVML(ICC 附带;默认情况下,ICC 使用 SVML 自动矢量化)。令人困惑的是 immintrin.h 中有它的原型以及实际的内在函数。也许他们想诱骗人们编写依赖于 Intel tools/libraries 的代码。或者也许他们认为包含越少越好,每个人都应该使用他们的编译器...

    还相关:英特尔 MKL(数学核心库),具有矩阵 BLAS 函数。

  • AMD ACML - 生命周期结束的闭源免费软件。我认为它只有循环 arrays/matrices 的函数(如 Intel MKL),而不是单个 SIMD 向量的函数。

  • sse_mathfun(zlib 许可证)SSE2 和 ARM NEON。似乎从 2011 年左右就没有更新过。但是确实有单向量数学/三角函数的实现。