【问题标题】:How to check with Intel intrinsics if AVX extensions is supported by the CPU?如果 CPU 支持 AVX 扩展,如何检查 Intel 内部函数?
【发布时间】:2014-08-07 06:28:27
【问题描述】:

我正在使用英特尔内部函数编写程序。我想使用 _mm_permute_pd 内在函数,它只在带有 AVX 的 CPU 上可用。对于没有 AVX 的 CPU,我可以使用 _mm_shuffle_pd,但根据规范,它比 _mm_permute_pd 慢得多。英特尔内部函数的头文件是否定义了允许我区分是否支持 AVX 的常量,以便我可以这样编写:

#ifdef __IS_AVX_SUPPORTED__  // is there sth like this defined?
// use _mm_permute_pd
# else
// use _mm_shuffle_pd
#endif

?我找到了this tutorial,它展示了如何执行运行时检查,但我需要对当前机器进行静态编译时检查。

【问题讨论】:

  • _mm_permute_pd (vpermilpd) 并不比shufpd dest,same,same 快,除非它允许内存源操作数折叠到指令中。指令表等见agner.org/optimize

标签: c intel intrinsics


【解决方案1】:

我假设您使用的是英特尔 C++ 编译器。在这种情况下 - 是的,有这样的宏:Intel C++ Compiler Reference Guide:__AVX__,__AVX2__

附:请注意,如果您在启用 AVX 指令集的情况下编译应用程序,它将在不支持 AVX 的 CPU 上失败。如果您要将软件作为源代码包分发并在目标机器上编译 - 这可能是一个可行的解决方案。否则,您应该动态检查 AVX。

附言ICC 有多种选择。看看following compiler options 以及它对其他人的引用。

【讨论】:

  • GCC支持-mtune=native根据当前CPU调优指令集,或许ICC也有类似的东西?
  • 是的,-xHost 用于 MacOS 和 Linux,/QxHost 用于 Windows。还有各种选项,如-march-arch 等。
【解决方案2】:

GCC、ICC、MSVC 和 Clang 都定义了一个可以检查的宏 __AVX__。事实上,它是所有这些编译器定义的唯一 SIMD 常量 (MSVC is the one that breaks the mold)。这只会告诉您您的代码是否使用 AVX 支持编译(例如 -mavx 与 GCC 或 /arch:AVX 与 MSVC)它不会告诉您您的 CPU 是否支持 AVX。如果您想知道 CPU 是否支持 AVX,您需要检查 CPUID。这里,asm-in-c-error 是一个从所有这些编译器读取 CPUID 的示例。

要正确执行此操作,我建议您创建一个CPU dispatcher

编辑:如果有人想知道如何使用 CPUID 中的值来确定 AVX 是否可用,请参阅https://github.com/Mysticial/FeatureDetector

【讨论】:

  • 如果你想让GCC/clang定义像__AVX__这样的特征宏根据你的电脑有没有,你必须用-march=native编译跨度>
【解决方案3】:

在我看来,唯一的方法是编译并运行一个程序来识别 AVX 是否可用。然后手动或自动编译带有或不带有 AVX 功能的单独代码。对于 VS 2013,我将使用以下 commomAVX 文件夹中的代码来识别 hasAVX(或不),并使用它来执行两个不同的 BAT 文件之一来编译和链接适当的程序。

http://www.roylongbottom.org.uk/gigaflops-benchmarks.zip

我的问题是帮助确定有关使用合适的编译选项(例如 /arch:AVX)的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 2018-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    相关资源
    最近更新 更多