如何用linux指令集,linux – 如何知道我是否可以使用FMA指令集进行编译?
我已經看到有關如何使用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 :: fma比x * y z快,如果它是基于FMA指令集的內部函數,則可能.否則它將使用非常慢的非內在函數.現在在2016年,GCC的默認glibc / libstdc定義了這個宏,但大多數其他標準庫實現都沒有(包括LLVM libc,ICC和MSVC).這并不意味著如果可能的話,他們不會將std :: fma實現為內在函數,他們只是忘了定義這個宏.
可靠的FMA檢測
要在編譯時可靠地檢測FMA(或任何指令集),您需要使用指令集特定的宏.這些宏由編譯器基于所選擇的目標體系結構和/或指令集來定義.
有一個支持FMA / FMA3的__FMA__宏,以及支持AMD FMA4的__FMA4__宏. GCC,clang和ICC確實對它們進行了定義.
不幸的是,MSVC沒有定義除__AVX__和__AVX2__之外的任何指令集特定的宏.
交叉編譯器FMA檢測
對于英特爾處理器,FMA在Intel Haswell之前與AVX2一起推出.
對于AMD處理器來說,事情有點混亂. F004在0700年推出了AVX和XOP.FMA3(Intel FMA等效版)于AMD Piledriver推出.您可以在編譯時通過FMA(__FMA__宏)和BMI(__BMI__宏)指令集來區分Piledriver與其前身Bulldozer.不幸的是,MSVC沒有定義.
然而,與英特爾處理器一樣,如果存在AVX2,所有AMD處理器都支持FMA / FMA3.
如果您希望交叉編譯器檢測目標體系結構是否支持FMA / FMA3,則必須檢測__AVX2__宏,因為如果啟用了AVX2,它將由所有主要編譯器(包括MSVC)定義:
#if !defined(__FMA__) && defined(__AVX2__)
#define __FMA__ 1
#endif
遺憾的是,沒有可靠的方法只使用__AVX__和__AVX2__宏來檢測AMD FMA4.
筆記
只有在編譯器啟用FMA指令時,才能在程序中使用FMA指令.在GCC和clang中,您需要設置正確的目標體系結構(如-march = haswell)或手動啟用帶有-mfma標志的FMA指令集. ICC使用-xavx2標志自動啟用FMA. MSVC使用/ arch:AVX2選項自動啟用FMA.
AMD宣布將在未來放棄對FMA4的支持.
標簽:linux,x86,intel,processor,fma
來源: https://codeday.me/bug/20190716/1479064.html
總結
以上是生活随笔為你收集整理的如何用linux指令集,linux – 如何知道我是否可以使用FMA指令集进行编译?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机领域的道德模范,2015-2016
- 下一篇: go语言的魔幻旅行38-gin、Gorm