【问题标题】:Where is Clang's '_mm256_pow_ps' intrinsic?Clang 的 '_mm256_pow_ps' 内在函数在哪里?
【发布时间】:2016-08-06 18:40:19
【问题描述】:

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

Clang 是否没有定义这些,或者它们是否在我不包括的标题中?

【问题讨论】:

  • 您可以查看 SLEEF 项目 - SLEEF: Vectorized Math Library。它具有与英特尔 SVML 相媲美的出色性能和可变精度供用户选择。我发现的唯一问题是它只支持 Windows 上的 MSVC(我希望它也支持 CLang-CL)。

标签: clang intel sse intrinsics avx


【解决方案1】:

这不是内在的;它是一个英特尔 SVML 库函数名称,它使用与实际内在函数相同的命名方案令人困惑。 没有vpowps 指令。(至强融核上的AVX512ER 确实有the semi-related vexp2ps 指令...)

IDK,如果此命名方案是为了在使用编译器(SVML 附带)编写 SIMD 代码时诱使人们依赖英特尔工具,或者因为他们的编译器确实将其视为内在/内置来进行持续传播,如果输入是已知,或其他原因。

要使类似的功能和_mm_sin_ps 可用,您需要英特尔的Short Vector Math Library (SVML)。大多数人只是避免使用它们。但是,如果它具有您想要的东西的实现,那么值得研究。 IDK 还有哪些矢量pow 实现存在。


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

有一些“复合”内在函数,如 _mm_set_epi8(),通常编译为多个加载和随机播放, 可跨编译器移植,并且内联而不是调用库函数。

还要注意sqrtps 是本机机器指令,所以_mm_sqrt_ps() 是真正的内在指令。 IEEE 754 将 mul、div、add、sub 和 sqrt 指定为产生正确舍入结果所需的“基本”操作(错误 sqrt() 是特殊的并且确实具有直接的硬件支持,不像大多数其他“数学库”函数。


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

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

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

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

  • Intel's own SVML(ICC 自带;ICC 默认使用 SVML 自动矢量化)。令人困惑的是,它的原型在 immintrin.h 以及实际的内在函数。也许他们想欺骗人们编写依赖于英特尔工具/库的代码。或者他们认为更少的包含更好,每个人都应该使用他们的编译器......

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

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

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

【讨论】:

  • Agner Fog 在他的开源 VectorClass 库中实现了 SVML 中的大部分功能。他声称它可以与 SVML 竞争。
  • @Zboson:不幸的是,在 VectorClass 的文档中,他将pow 的效率列为“差”。当然,“差”是一个相对术语,它可能仍然有用。
  • SLEEF 现在有相当广泛的支持,LLVM 正在努力整合它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
  • 2020-07-11
  • 1970-01-01
  • 2011-01-01
  • 2015-05-13
  • 1970-01-01
相关资源
最近更新 更多