gpt4 book ai didi

linux - 我怎么知道我是否可以使用 FMA 指令集进行编译?

转载 作者:IT王子 更新时间:2023-10-29 00:50:39 36 4
gpt4 key购买 nike

我看到过有关如何使用 FMA 指令集的问题,但在我开始使用它们之前,我首先想知道我是否可以(我的处理器是否支持它们)。我发现一篇文章说我需要查看(在 Linux 上工作)的输出:

more /proc/cpuinfo

一探究竟。我明白了:

processor       : 0                                                  
vendor_id : GenuineIntel
cpu family : 6
model : 30
model name : Intel(R) Xeon(R) CPU X3470 @ 2.93GHz
stepping : 5
cpu MHz : 2933.235
size : 8192 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 4
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 11
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good xtopology nonstop_tsc aperfmperf pni
dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm sse4_1 sse4_2 popcnt lahf_lm ida dts tpr_shadow vnmi flexpriority ept vpid
bogomips : 5866.47
clflush size : 64
cache_alignment : 64
address sizes : 36 bits physical, 48 bits virtual

似乎最有趣的是标志部分,但我不确定如何从该列表中找出处理器是否支持这些指令。

有人知道怎么查吗?谢谢。

最佳答案

我假设您想在编译时用 C/C++ 检测它。

FP_FAST_FMA 宏不是检测 FMA 指令集的可靠方法。此宏在 "math.h" 中定义/<cmath>如果std::fmax*y+z 快,如果它是基于 FMA 指令集的内部函数,则这是可能的。否则它将使用非常慢的非内部函数。现在在 2016 年,GCC 的默认 glibc/libstdc++ 定义了这个宏,但大多数其他标准库实现没有(包括 LLVM libc++、ICC 和 MSVC)。这并不意味着他们没有实现 std::fma如果可能的话,作为内在函数,他们只是忘记定义这个宏。

可靠的 FMA 检测

要在编译时可靠地检测 FMA(或任何指令集),您需要使用特定于指令集的宏。这些宏由编译器根据选定的目标架构和/或指令集定义。

有一个__FMA__用于 FMA/FMA3 支持的宏,以及 __FMA4__用于 AMD FMA4 支持的宏。 GCC、clang 和 ICC 确实定义了它们。

不幸的是,除了 __AVX__ 之外,MSVC 没有定义任何指令集特定的宏。和 __AVX2__ .

交叉编译器FMA检测

对于 Intel 处理器,FMA 由 Intel Haswell 与 AVX2 一起引入.

对于 AMD 处理器,情况有点困惑。 FMA4 由 AMD Bulldozer 与 AVX 和 XOP 一起引入. FMA3(相当于英特尔 FMA)由 AMD Piledriver 引入.您可以在编译时通过 FMA(__FMA__ 宏)和 BMI(__BMI__ 宏)指令集将 Piledriver 与其前身 Bulldozer 区分开来。不幸的是,MSVC 两者都没有定义。

不过,与 Intel 处理器一样,如果存在 AVX2,所有 AMD 处理器都支持 FMA/FMA3。

如果要交叉编译检测目标架构是否支持FMA/FMA3,必须检测__AVX2__宏,因为如果启用了 AVX2,它由所有主要编译器(包括 MSVC)定义:

#if !defined(__FMA__) && defined(__AVX2__)
#define __FMA__ 1
#endif

不幸的是,没有可靠的方法仅使用 __AVX__ 来检测 AMD FMA4和 __AVX2__宏。

注意事项

FMA 指令实际上只有在编译器启用时才在您的程序中可用。在 GCC 和 clang 中,您需要设置正确的目标架构(如 -march=haswell ) 或使用 -mfma 手动启用 FMA 指令集旗帜。 ICC 使用 -xavx2 自动启用 FMA旗帜。 MSVC 使用 /arch:AVX2 /fp:fast /O2 启用 FMA选项。

AMD 宣布 future 将放弃对 FMA4 的支持。

关于linux - 我怎么知道我是否可以使用 FMA 指令集进行编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16348909/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com