Vector Optimized Library of Kernels  2.4
Architecture-tuned implementations of math kernels
cpuinfo_x86.h
Go to the documentation of this file.
1 // Copyright 2017 Google LLC
2 // Copyright 2020 Intel Corporation
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 
16 #ifndef CPU_FEATURES_INCLUDE_CPUINFO_X86_H_
17 #define CPU_FEATURES_INCLUDE_CPUINFO_X86_H_
18 
20 #include "cpu_features_macros.h"
21 
23 
24 // See https://en.wikipedia.org/wiki/CPUID for a list of x86 cpu features.
25 // The field names are based on the short name provided in the wikipedia tables.
26 typedef struct {
27  int fpu : 1;
28  int tsc : 1;
29  int cx8 : 1;
30  int clfsh : 1;
31  int mmx : 1;
32  int aes : 1;
33  int erms : 1;
34  int f16c : 1;
35  int fma4 : 1;
36  int fma3 : 1;
37  int vaes : 1;
38  int vpclmulqdq : 1;
39  int bmi1 : 1;
40  int hle : 1;
41  int bmi2 : 1;
42  int rtm : 1;
43  int rdseed : 1;
44  int clflushopt : 1;
45  int clwb : 1;
46 
47  int sse : 1;
48  int sse2 : 1;
49  int sse3 : 1;
50  int ssse3 : 1;
51  int sse4_1 : 1;
52  int sse4_2 : 1;
53  int sse4a : 1;
54 
55  int avx : 1;
56  int avx2 : 1;
57 
58  int avx512f : 1;
59  int avx512cd : 1;
60  int avx512er : 1;
61  int avx512pf : 1;
62  int avx512bw : 1;
63  int avx512dq : 1;
64  int avx512vl : 1;
65  int avx512ifma : 1;
66  int avx512vbmi : 1;
67  int avx512vbmi2 : 1;
68  int avx512vnni : 1;
69  int avx512bitalg : 1;
70  int avx512vpopcntdq : 1;
71  int avx512_4vnniw : 1;
72  int avx512_4vbmi2 : 1;
74  int avx512_4fmaps : 1;
75  int avx512_bf16 : 1;
77  int amx_bf16 : 1;
78  int amx_tile : 1;
79  int amx_int8 : 1;
80 
81  int pclmulqdq : 1;
82  int smx : 1;
83  int sgx : 1;
84  int cx16 : 1; // aka. CMPXCHG16B
85  int sha : 1;
86  int popcnt : 1;
87  int movbe : 1;
88  int rdrnd : 1;
89 
90  int dca : 1;
91  int ss : 1;
92  // Make sure to update X86FeaturesEnum below if you add a field here.
93 } X86Features;
94 
95 typedef struct {
97  int family;
98  int model;
99  int stepping;
100  char vendor[13]; // 0 terminated string
101 } X86Info;
102 
103 // Calls cpuid and returns an initialized X86info.
104 // This function is guaranteed to be malloc, memset and memcpy free.
105 X86Info GetX86Info(void);
106 
107 // Returns cache hierarchy informations.
108 // Can call cpuid multiple times.
109 // Only works on Intel CPU at the moment.
110 // This function is guaranteed to be malloc, memset and memcpy free.
112 
113 typedef enum {
115  INTEL_CORE, // CORE
116  INTEL_PNR, // PENRYN
117  INTEL_NHM, // NEHALEM
118  INTEL_ATOM_BNL, // BONNELL
119  INTEL_WSM, // WESTMERE
120  INTEL_SNB, // SANDYBRIDGE
121  INTEL_IVB, // IVYBRIDGE
122  INTEL_ATOM_SMT, // SILVERMONT
123  INTEL_HSW, // HASWELL
124  INTEL_BDW, // BROADWELL
125  INTEL_SKL, // SKYLAKE
126  INTEL_ATOM_GMT, // GOLDMONT
127  INTEL_KBL, // KABY LAKE
128  INTEL_CFL, // COFFEE LAKE
129  INTEL_WHL, // WHISKEY LAKE
130  INTEL_CNL, // CANNON LAKE
131  INTEL_ICL, // ICE LAKE
132  INTEL_TGL, // TIGER LAKE
133  INTEL_SPR, // SAPPHIRE RAPIDS
134  AMD_HAMMER, // K8
135  AMD_K10, // K10
136  AMD_BOBCAT, // K14
138  AMD_JAGUAR, // K16
139  AMD_ZEN, // K17
141 
142 // Returns the underlying microarchitecture by looking at X86Info's vendor,
143 // family and model.
145 
146 // Calls cpuid and fills the brand_string.
147 // - brand_string *must* be of size 49 (beware of array decaying).
148 // - brand_string will be zero terminated.
149 // - This function calls memcpy.
150 void FillX86BrandString(char brand_string[49]);
151 
153 // Introspection functions
154 
155 typedef enum {
218 
219 int GetX86FeaturesEnumValue(const X86Features* features, X86FeaturesEnum value);
220 
222 
224 
226 
227 #if !defined(CPU_FEATURES_ARCH_X86)
228 #error "Including cpuinfo_x86.h from a non-x86 target."
229 #endif
230 
231 #endif // CPU_FEATURES_INCLUDE_CPUINFO_X86_H_
X86Features::amx_bf16
int amx_bf16
Definition: cpuinfo_x86.h:77
X86Features::clfsh
int clfsh
Definition: cpuinfo_x86.h:30
X86Features::sgx
int sgx
Definition: cpuinfo_x86.h:83
INTEL_CORE
@ INTEL_CORE
Definition: cpuinfo_x86.h:115
X86_AVX512DQ
@ X86_AVX512DQ
Definition: cpuinfo_x86.h:189
X86Features::sse
int sse
Definition: cpuinfo_x86.h:47
X86_AVX512PF
@ X86_AVX512PF
Definition: cpuinfo_x86.h:187
X86Features::vaes
int vaes
Definition: cpuinfo_x86.h:37
X86Features::clflushopt
int clflushopt
Definition: cpuinfo_x86.h:44
X86_CLWB
@ X86_CLWB
Definition: cpuinfo_x86.h:174
CPU_FEATURES_START_CPP_NAMESPACE
#define CPU_FEATURES_START_CPP_NAMESPACE
Definition: cpu_features_macros.h:114
X86_AVX512_4FMAPS
@ X86_AVX512_4FMAPS
Definition: cpuinfo_x86.h:200
AMD_BOBCAT
@ AMD_BOBCAT
Definition: cpuinfo_x86.h:136
X86Features::amx_int8
int amx_int8
Definition: cpuinfo_x86.h:79
INTEL_WHL
@ INTEL_WHL
Definition: cpuinfo_x86.h:129
X86Features::mmx
int mmx
Definition: cpuinfo_x86.h:31
X86Features::sha
int sha
Definition: cpuinfo_x86.h:85
X86_RDRND
@ X86_RDRND
Definition: cpuinfo_x86.h:213
X86Features::avx
int avx
Definition: cpuinfo_x86.h:55
X86_SSE
@ X86_SSE
Definition: cpuinfo_x86.h:175
X86Features::avx512_vp2intersect
int avx512_vp2intersect
Definition: cpuinfo_x86.h:76
X86Features::avx512pf
int avx512pf
Definition: cpuinfo_x86.h:61
X86Features::sse4_2
int sse4_2
Definition: cpuinfo_x86.h:52
X86_DCA
@ X86_DCA
Definition: cpuinfo_x86.h:214
X86_VAES
@ X86_VAES
Definition: cpuinfo_x86.h:166
X86_BMI2
@ X86_BMI2
Definition: cpuinfo_x86.h:170
X86Features::popcnt
int popcnt
Definition: cpuinfo_x86.h:86
X86_ERMS
@ X86_ERMS
Definition: cpuinfo_x86.h:162
X86_TSC
@ X86_TSC
Definition: cpuinfo_x86.h:157
X86_MMX
@ X86_MMX
Definition: cpuinfo_x86.h:160
X86_AVX
@ X86_AVX
Definition: cpuinfo_x86.h:182
X86Features::hle
int hle
Definition: cpuinfo_x86.h:40
INTEL_SKL
@ INTEL_SKL
Definition: cpuinfo_x86.h:125
X86_SHA
@ X86_SHA
Definition: cpuinfo_x86.h:210
X86Features::avx512vl
int avx512vl
Definition: cpuinfo_x86.h:64
X86_VPCLMULQDQ
@ X86_VPCLMULQDQ
Definition: cpuinfo_x86.h:167
X86Features::fma4
int fma4
Definition: cpuinfo_x86.h:35
INTEL_SNB
@ INTEL_SNB
Definition: cpuinfo_x86.h:120
X86Features::movbe
int movbe
Definition: cpuinfo_x86.h:87
X86Features::amx_tile
int amx_tile
Definition: cpuinfo_x86.h:78
X86_CLFSH
@ X86_CLFSH
Definition: cpuinfo_x86.h:159
X86Features::avx512er
int avx512er
Definition: cpuinfo_x86.h:60
X86Features::sse4_1
int sse4_1
Definition: cpuinfo_x86.h:51
X86Features::sse2
int sse2
Definition: cpuinfo_x86.h:48
X86Features::smx
int smx
Definition: cpuinfo_x86.h:82
X86Features::rtm
int rtm
Definition: cpuinfo_x86.h:42
X86Features::avx512vpopcntdq
int avx512vpopcntdq
Definition: cpuinfo_x86.h:70
X86Features::tsc
int tsc
Definition: cpuinfo_x86.h:28
X86_AVX512VBMI2
@ X86_AVX512VBMI2
Definition: cpuinfo_x86.h:193
X86_AVX512_SECOND_FMA
@ X86_AVX512_SECOND_FMA
Definition: cpuinfo_x86.h:199
X86FeaturesEnum
X86FeaturesEnum
Definition: cpuinfo_x86.h:155
X86Features::vpclmulqdq
int vpclmulqdq
Definition: cpuinfo_x86.h:38
X86_AVX512VNNI
@ X86_AVX512VNNI
Definition: cpuinfo_x86.h:194
INTEL_PNR
@ INTEL_PNR
Definition: cpuinfo_x86.h:116
X86Features::avx512_4vbmi2
int avx512_4vbmi2
Definition: cpuinfo_x86.h:72
GetX86FeaturesEnumValue
int GetX86FeaturesEnumValue(const X86Features *features, X86FeaturesEnum value)
Definition: cpuinfo_x86.c:1555
X86_SS
@ X86_SS
Definition: cpuinfo_x86.h:215
X86_BMI1
@ X86_BMI1
Definition: cpuinfo_x86.h:168
X86_UNKNOWN
@ X86_UNKNOWN
Definition: cpuinfo_x86.h:114
cpu_features_macros.h
X86_SSSE3
@ X86_SSSE3
Definition: cpuinfo_x86.h:178
X86_AVX512_4VNNIW
@ X86_AVX512_4VNNIW
Definition: cpuinfo_x86.h:197
X86Features::ss
int ss
Definition: cpuinfo_x86.h:91
X86Info
Definition: cpuinfo_x86.h:95
GetX86CacheInfo
CacheInfo GetX86CacheInfo(void)
Definition: cpuinfo_x86.c:1402
X86_AVX512_BF16
@ X86_AVX512_BF16
Definition: cpuinfo_x86.h:201
AMD_ZEN
@ AMD_ZEN
Definition: cpuinfo_x86.h:139
X86Features::avx512bitalg
int avx512bitalg
Definition: cpuinfo_x86.h:69
X86_AVX512F
@ X86_AVX512F
Definition: cpuinfo_x86.h:184
X86Features
Definition: cpuinfo_x86.h:26
X86_AMX_TILE
@ X86_AMX_TILE
Definition: cpuinfo_x86.h:204
X86_MOVBE
@ X86_MOVBE
Definition: cpuinfo_x86.h:212
X86Features::sse3
int sse3
Definition: cpuinfo_x86.h:49
X86_AVX512VPOPCNTDQ
@ X86_AVX512VPOPCNTDQ
Definition: cpuinfo_x86.h:196
GetX86Microarchitecture
X86Microarchitecture GetX86Microarchitecture(const X86Info *info)
Definition: cpuinfo_x86.c:1415
X86_AMX_INT8
@ X86_AMX_INT8
Definition: cpuinfo_x86.h:205
INTEL_IVB
@ INTEL_IVB
Definition: cpuinfo_x86.h:121
INTEL_ICL
@ INTEL_ICL
Definition: cpuinfo_x86.h:131
CacheInfo
Definition: cpu_features_cache_info.h:47
X86Features::avx512vbmi
int avx512vbmi
Definition: cpuinfo_x86.h:66
X86Features::avx512_second_fma
int avx512_second_fma
Definition: cpuinfo_x86.h:73
GetX86MicroarchitectureName
const char * GetX86MicroarchitectureName(X86Microarchitecture)
Definition: cpuinfo_x86.c:1566
X86_AVX512CD
@ X86_AVX512CD
Definition: cpuinfo_x86.h:185
X86_FPU
@ X86_FPU
Definition: cpuinfo_x86.h:156
X86_SMX
@ X86_SMX
Definition: cpuinfo_x86.h:207
GetX86FeaturesEnumName
const char * GetX86FeaturesEnumName(X86FeaturesEnum)
Definition: cpuinfo_x86.c:1561
INTEL_BDW
@ INTEL_BDW
Definition: cpuinfo_x86.h:124
X86Features::clwb
int clwb
Definition: cpuinfo_x86.h:45
X86_CLFLUSHOPT
@ X86_CLFLUSHOPT
Definition: cpuinfo_x86.h:173
X86Features::fpu
int fpu
Definition: cpuinfo_x86.h:27
X86_FMA4
@ X86_FMA4
Definition: cpuinfo_x86.h:164
GetX86Info
X86Info GetX86Info(void)
Definition: cpuinfo_x86.c:1385
X86_FMA3
@ X86_FMA3
Definition: cpuinfo_x86.h:165
X86_AMX_BF16
@ X86_AMX_BF16
Definition: cpuinfo_x86.h:203
X86_AVX512BW
@ X86_AVX512BW
Definition: cpuinfo_x86.h:188
X86_SSE3
@ X86_SSE3
Definition: cpuinfo_x86.h:177
X86Features::dca
int dca
Definition: cpuinfo_x86.h:90
X86Features::avx512dq
int avx512dq
Definition: cpuinfo_x86.h:63
AMD_JAGUAR
@ AMD_JAGUAR
Definition: cpuinfo_x86.h:138
X86Features::avx512cd
int avx512cd
Definition: cpuinfo_x86.h:59
X86_SSE4_2
@ X86_SSE4_2
Definition: cpuinfo_x86.h:180
INTEL_WSM
@ INTEL_WSM
Definition: cpuinfo_x86.h:119
INTEL_NHM
@ INTEL_NHM
Definition: cpuinfo_x86.h:117
X86_SGX
@ X86_SGX
Definition: cpuinfo_x86.h:208
X86_SSE2
@ X86_SSE2
Definition: cpuinfo_x86.h:176
FillX86BrandString
void FillX86BrandString(char brand_string[49])
Definition: cpuinfo_x86.c:1543
X86Features::avx512vbmi2
int avx512vbmi2
Definition: cpuinfo_x86.h:67
X86_SSE4A
@ X86_SSE4A
Definition: cpuinfo_x86.h:181
X86Features::fma3
int fma3
Definition: cpuinfo_x86.h:36
X86Info::family
int family
Definition: cpuinfo_x86.h:97
X86Info::features
X86Features features
Definition: cpuinfo_x86.h:96
X86_CX16
@ X86_CX16
Definition: cpuinfo_x86.h:209
X86Features::rdseed
int rdseed
Definition: cpuinfo_x86.h:43
X86Features::sse4a
int sse4a
Definition: cpuinfo_x86.h:53
INTEL_ATOM_SMT
@ INTEL_ATOM_SMT
Definition: cpuinfo_x86.h:122
X86Features::avx512f
int avx512f
Definition: cpuinfo_x86.h:58
X86_AVX512VL
@ X86_AVX512VL
Definition: cpuinfo_x86.h:190
X86_AVX512IFMA
@ X86_AVX512IFMA
Definition: cpuinfo_x86.h:191
X86Features::ssse3
int ssse3
Definition: cpuinfo_x86.h:50
INTEL_HSW
@ INTEL_HSW
Definition: cpuinfo_x86.h:123
X86Features::aes
int aes
Definition: cpuinfo_x86.h:32
X86_RTM
@ X86_RTM
Definition: cpuinfo_x86.h:171
X86Features::avx512_4fmaps
int avx512_4fmaps
Definition: cpuinfo_x86.h:74
X86Features::avx512ifma
int avx512ifma
Definition: cpuinfo_x86.h:65
X86_HLE
@ X86_HLE
Definition: cpuinfo_x86.h:169
X86_LAST_
@ X86_LAST_
Definition: cpuinfo_x86.h:216
X86Features::pclmulqdq
int pclmulqdq
Definition: cpuinfo_x86.h:81
X86Features::bmi1
int bmi1
Definition: cpuinfo_x86.h:39
X86Features::avx512bw
int avx512bw
Definition: cpuinfo_x86.h:62
X86_AVX512ER
@ X86_AVX512ER
Definition: cpuinfo_x86.h:186
X86Info::stepping
int stepping
Definition: cpuinfo_x86.h:99
X86Features::cx16
int cx16
Definition: cpuinfo_x86.h:84
X86Features::f16c
int f16c
Definition: cpuinfo_x86.h:34
X86_SSE4_1
@ X86_SSE4_1
Definition: cpuinfo_x86.h:179
X86Features::avx512_4vnniw
int avx512_4vnniw
Definition: cpuinfo_x86.h:71
X86_AVX512_VP2INTERSECT
@ X86_AVX512_VP2INTERSECT
Definition: cpuinfo_x86.h:202
INTEL_CFL
@ INTEL_CFL
Definition: cpuinfo_x86.h:128
X86_RDSEED
@ X86_RDSEED
Definition: cpuinfo_x86.h:172
INTEL_ATOM_GMT
@ INTEL_ATOM_GMT
Definition: cpuinfo_x86.h:126
INTEL_ATOM_BNL
@ INTEL_ATOM_BNL
Definition: cpuinfo_x86.h:118
X86Features::avx2
int avx2
Definition: cpuinfo_x86.h:56
AMD_HAMMER
@ AMD_HAMMER
Definition: cpuinfo_x86.h:134
X86Features::erms
int erms
Definition: cpuinfo_x86.h:33
INTEL_TGL
@ INTEL_TGL
Definition: cpuinfo_x86.h:132
X86Features::avx512vnni
int avx512vnni
Definition: cpuinfo_x86.h:68
INTEL_KBL
@ INTEL_KBL
Definition: cpuinfo_x86.h:127
X86_AVX2
@ X86_AVX2
Definition: cpuinfo_x86.h:183
X86Microarchitecture
X86Microarchitecture
Definition: cpuinfo_x86.h:113
X86_F16C
@ X86_F16C
Definition: cpuinfo_x86.h:163
X86_AVX512BITALG
@ X86_AVX512BITALG
Definition: cpuinfo_x86.h:195
AMD_BULLDOZER
@ AMD_BULLDOZER
Definition: cpuinfo_x86.h:137
INTEL_CNL
@ INTEL_CNL
Definition: cpuinfo_x86.h:130
CPU_FEATURES_END_CPP_NAMESPACE
#define CPU_FEATURES_END_CPP_NAMESPACE
Definition: cpu_features_macros.h:115
X86_AES
@ X86_AES
Definition: cpuinfo_x86.h:161
X86Features::cx8
int cx8
Definition: cpuinfo_x86.h:29
X86Info::model
int model
Definition: cpuinfo_x86.h:98
X86_PCLMULQDQ
@ X86_PCLMULQDQ
Definition: cpuinfo_x86.h:206
X86_CX8
@ X86_CX8
Definition: cpuinfo_x86.h:158
X86_AVX512_4VBMI2
@ X86_AVX512_4VBMI2
Definition: cpuinfo_x86.h:198
INTEL_SPR
@ INTEL_SPR
Definition: cpuinfo_x86.h:133
cpu_features_cache_info.h
X86Features::bmi2
int bmi2
Definition: cpuinfo_x86.h:41
X86_AVX512VBMI
@ X86_AVX512VBMI
Definition: cpuinfo_x86.h:192
X86_POPCNT
@ X86_POPCNT
Definition: cpuinfo_x86.h:211
X86Features::avx512_bf16
int avx512_bf16
Definition: cpuinfo_x86.h:75
X86Features::rdrnd
int rdrnd
Definition: cpuinfo_x86.h:88
AMD_K10
@ AMD_K10
Definition: cpuinfo_x86.h:135