ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux – 如何知道我是否可以使用FMA指令集进行编译?

2019-07-16 14:51:22  阅读:898  来源: 互联网

标签:linux x86 intel processor 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有