【问题标题】:How do I know which AVX C functions are available on different processor models我如何知道不同处理器型号上可用的 AVX C 功能
【发布时间】:2021-07-25 02:05:38
【问题描述】:

基本上是标题。例如,我正在尝试运行如下指令:

_mm256_load_pd_mm256_add_pd_mm256_stream_pd 和处理器上的 128 位版本:Intel Xeon、E5630、2.53 GHz、IBM HS22。但是我收到Illegal instruction 任何想法,我可以在其中查看该处理器可用的功能?

【问题讨论】:

    标签: c optimization x86 avx cpuid


    【解决方案1】:

    如果您使用的操作系统有 /proc/cpuinfo,请检查您的/proc/cpuinfo

    或者使用 clang 或 gcc -march=native - 他们会拒绝编译你的 CPU 不支持的任何内部函数。 (与 MSVC 或 ICC 不同,它们允许您使用内在函数,而无需告诉它目标机器支持它们。)


    要按 CPU 型号查找,请 google 型号,例如Xeon, E5630 -> https://ark.intel.com/content/www/us/en/ark/products/47924/intel-xeon-processor-e5630-12m-cache-2-53-ghz-5-86-gt-s-intel-qpi.html

    • 指令集扩展:英特尔® SSE4.2

    所以根本没有 AVX,因为它是 2010 年的 Westmere-EP 微架构(在 Sandybridge 之前)。

    如需更详细的 CPU,您还可以查看http://instlatx64.atw.hu/ 并检查该型号(或相同微架构之一)的 CPUID 转储(如果您能找到)。例如a screenshot of Aida64 CPUID 在 Westmere-EX 和 instruction latency/throughput benchmark output 上运行,文本文件顶部的信息包括解码的 CPUID 信息,显示它具有哪些 ISA 扩展。还有raw CPUID dumps,您可以通过您感兴趣的任何扩展名(例如cmpxchg16b 或英特尔方舟页面不会提及的FSGSBASE)与所需的CPUID 功能位(https://sandpile.org/x86/cpuid.htm)进行交叉引用。


    相关:https://software.intel.com/sites/landingpage/IntrinsicsGuide/ 告诉您每个内部函数的相应 asm 指令需要什么 ISA 扩展。

    【讨论】:

    • 在 macOS 上:sysctl machdep.cpu.features machdep.cpu.leaf7_features
    • 您好,感谢您的回答!你能告诉我一种在 C 代码中检查的方法吗?仅当它具有 AVX512 或 AVX2 时才运行该代码?也许是一些宏 IF
    • @C.Cristi:这是一个单独的问题。如果您希望人们在自己的机器上使用-march=native 编译您的代码,您当然可以在构建时使用#if __AVX__ 进行检测。如果您想进行运行时调度(例如设置函数指针),您需要选择足够大的函数以值得分支(例如使它们不可内联),但是您可以使用 GCC 的 ifunc 东西,或者使用您自己的__builtin_cpu_supports("avx") 或 GNU C 中的任何内容。搜索 google / Stack Overflow 以获取更多信息。
    • @C.Cristi:是的,如果您不使用 MSVC,那么使用 -march=native 可以很好地工作。 MSVC 是围绕构建您分发的一个二进制文件的模型设计的,并且没有等效的选项来构建专门针对主机的二进制文件。所以这听起来像你的目的,你想要gccclang -O3 -march=native,可能还有-ffast-math 等等等等(绝对是-fno-math-errno)。
    • 对于特定的宏,google 是你的朋友:How to detect SSE/SSE2/AVX/AVX2/AVX-512/AVX-128-FMA/KCVI availability at compile-time?gcc macro avx avx512 的第一个点击
    猜你喜欢
    • 2021-11-26
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2016-09-25
    相关资源
    最近更新 更多