2013-05-02 7 views
3

FMA 명령어를 사용하는 방법에 대해 질문을했지만 사용하기 전에 먼저 (내 프로세서가 지원할 수 있는지) 알고 싶습니다.FMA 명령어 세트로 컴파일 할 수 있는지 어떻게 알 수 있습니까?

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  

가장 흥미로운 부분은 플래그 부분이지만, 프로세서가이 지침을 지원할 경우 목록에서 찾는 방법을 모르겠습니다.

누구나 어떻게 알 수 있습니까? 고맙습니다.

답변

3

네, 가지고 있다면 flags 부분에 나타납니다. 인텔 하 스웰 기계에 나는

flags  : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm ida arat xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm 

를 얻을 수와 AMD 파일 드라이버에, 나는

flags  : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good nopl nonstop_tsc extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 popcnt aes xsave avx f16c lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs xop skinit wdt lwp fma4 tce nodeid_msr tbm topoext perfctr_core perfctr_nb arat cpb hw_pstate npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold bmi1 

를 (그것이 fma4 플래그뿐만 아니라 표준 fma 플래그가 포함되어 있습니다) 얻을.

그래서 리눅스를 확인하는 쉬운 방법의 반환 코드를 살펴 보는 것입니다 : /proc/cpuinfo이없는

grep fma < /proc/cpuinfo 

OS의 X,하지만 당신은 대신 수행 할 수 있습니다

sysctl -n hw.optional.fma 

을하는 0 (fma 없음) 또는 1 (fma 있음)을 인쇄합니다.

C/C++를 사용하는 경우 FP_FAST_FMA macro을 사용할 수도 있습니다.

5

이것은 오래된 질문이지만 여전히 관련성이 있습니다.

컴파일 타임에 C/C++에서 감지하고 싶다고 가정합니다.

FP_FAST_FMA 매크로는 FMA 명령어 세트를 감지하는 신뢰할 수있는 방법이 아닙니다. 이 매크로는 이 x*y+z보다 빠르면 "math.h"/<cmath>으로 정의됩니다. 이는 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 프로세서의 경우 약간 이상합니다. FMA4는 AVX 및 XOP와 함께 AMD Bulldozer에 도입되었습니다. FMA3 (인텔 FMA 상당)은 AMD Piledriver에 의해 소개되었습니다. Piledriver는 FMA (__FMA__ 매크로) 및 BMI (__BMI__ 매크로) 명령 세트가 있으면 컴파일 할 때 이전 Bulldozer와 구별 할 수 있습니다. 불행히도 MSVC는 둘 다 정의하지 않습니다.

그럼에도 불구하고 Intel 프로세서와 마찬가지로 모든 AMD 프로세서는 AVX2가있는 경우 FMA/FMA3을 지원합니다. 타겟 아키텍처가 FMA/FMA3를 지원하는지 여부를 당신은 크로스 컴파일러 탐지를 원한다면이 (MSVC 포함) 모든 주요 컴파일러에 의해 정의되기 때문에 AVX2이 활성화 된 경우

, 당신은 __AVX2__ 매크로를 감지해야합니다

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

__AVX____AVX2__ 매크로 만 사용하여 AMD FMA4를 감지하는 신뢰할 수있는 방법은 없습니다.

노트

FMA 지침이 컴파일러에 의해 활성화되어있는 경우에만 프로그램에서 실제로 사용할 수 있습니다. GCC와 clang에서 적절한 목표 아키텍처 (예 : -march=haswell)를 설정하거나 -mfma 플래그로 설정된 FMA 명령어를 수동으로 활성화해야합니다. ICC는 -xavx2 플래그로 FMA를 자동으로 활성화합니다. MSVC는 /arch:AVX2 옵션을 사용하여 FMA를 자동으로 활성화합니다.

AMD는 앞으로 FMA4의 지원을 중단한다고 발표했다.

+1

당신은 컴파일 타임에 탐지에 대해 이야기하고, 당신이'-march = native'를 가정하는 것처럼 그것에 대해 이야기합니다. 이것은 합리적이지만 언급되어야합니다. gcc -march = haswell 또는 gcc -march = bdver2 (Bulldozer version2 = Piledriver) 대신'gcc -mtune = haswell -mavx2' ('-mfma'없이)를 실행할 수 있기 때문에 이것을 지적합니다. 그래서 이것은 실제 하드웨어와 일치하는 경우에만 활성화되는 대상 옵션을 탐지하는 신뢰할 수있는 방법입니다.'-march = '대신'-m ...'을 사용하여 수동으로 선택하지 않아야합니다. –

+0

@ PeterCordes 맞아, 내 대답을 업데이트 해. – plasmacel