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_
#define CPU_FEATURES_START_CPP_NAMESPACE
Definition: cpu_features_macros.h:114
#define CPU_FEATURES_END_CPP_NAMESPACE
Definition: cpu_features_macros.h:115
X86Microarchitecture
Definition: cpuinfo_x86.h:113
@ INTEL_HSW
Definition: cpuinfo_x86.h:123
@ INTEL_CFL
Definition: cpuinfo_x86.h:128
@ INTEL_SKL
Definition: cpuinfo_x86.h:125
@ INTEL_PNR
Definition: cpuinfo_x86.h:116
@ INTEL_KBL
Definition: cpuinfo_x86.h:127
@ INTEL_SNB
Definition: cpuinfo_x86.h:120
@ INTEL_ICL
Definition: cpuinfo_x86.h:131
@ AMD_JAGUAR
Definition: cpuinfo_x86.h:138
@ INTEL_ATOM_GMT
Definition: cpuinfo_x86.h:126
@ INTEL_ATOM_SMT
Definition: cpuinfo_x86.h:122
@ AMD_K10
Definition: cpuinfo_x86.h:135
@ INTEL_WHL
Definition: cpuinfo_x86.h:129
@ INTEL_CNL
Definition: cpuinfo_x86.h:130
@ AMD_HAMMER
Definition: cpuinfo_x86.h:134
@ INTEL_WSM
Definition: cpuinfo_x86.h:119
@ INTEL_NHM
Definition: cpuinfo_x86.h:117
@ AMD_BOBCAT
Definition: cpuinfo_x86.h:136
@ INTEL_ATOM_BNL
Definition: cpuinfo_x86.h:118
@ INTEL_BDW
Definition: cpuinfo_x86.h:124
@ INTEL_IVB
Definition: cpuinfo_x86.h:121
@ INTEL_SPR
Definition: cpuinfo_x86.h:133
@ INTEL_CORE
Definition: cpuinfo_x86.h:115
@ X86_UNKNOWN
Definition: cpuinfo_x86.h:114
@ INTEL_TGL
Definition: cpuinfo_x86.h:132
@ AMD_ZEN
Definition: cpuinfo_x86.h:139
@ AMD_BULLDOZER
Definition: cpuinfo_x86.h:137
void FillX86BrandString(char brand_string[49])
Definition: cpuinfo_x86.c:1543
int GetX86FeaturesEnumValue(const X86Features *features, X86FeaturesEnum value)
Definition: cpuinfo_x86.c:1555
X86Microarchitecture GetX86Microarchitecture(const X86Info *info)
Definition: cpuinfo_x86.c:1415
CacheInfo GetX86CacheInfo(void)
Definition: cpuinfo_x86.c:1402
const char * GetX86MicroarchitectureName(X86Microarchitecture)
Definition: cpuinfo_x86.c:1566
X86Info GetX86Info(void)
Definition: cpuinfo_x86.c:1385
X86FeaturesEnum
Definition: cpuinfo_x86.h:155
@ X86_CLWB
Definition: cpuinfo_x86.h:174
@ X86_FPU
Definition: cpuinfo_x86.h:156
@ X86_RDRND
Definition: cpuinfo_x86.h:213
@ X86_AVX512VNNI
Definition: cpuinfo_x86.h:194
@ X86_AVX512VBMI
Definition: cpuinfo_x86.h:192
@ X86_AVX512PF
Definition: cpuinfo_x86.h:187
@ X86_SSE4A
Definition: cpuinfo_x86.h:181
@ X86_AVX512_4FMAPS
Definition: cpuinfo_x86.h:200
@ X86_CX16
Definition: cpuinfo_x86.h:209
@ X86_VPCLMULQDQ
Definition: cpuinfo_x86.h:167
@ X86_AVX512IFMA
Definition: cpuinfo_x86.h:191
@ X86_AVX512_SECOND_FMA
Definition: cpuinfo_x86.h:199
@ X86_BMI1
Definition: cpuinfo_x86.h:168
@ X86_SGX
Definition: cpuinfo_x86.h:208
@ X86_PCLMULQDQ
Definition: cpuinfo_x86.h:206
@ X86_ERMS
Definition: cpuinfo_x86.h:162
@ X86_SS
Definition: cpuinfo_x86.h:215
@ X86_AVX2
Definition: cpuinfo_x86.h:183
@ X86_AVX512VL
Definition: cpuinfo_x86.h:190
@ X86_SSSE3
Definition: cpuinfo_x86.h:178
@ X86_CX8
Definition: cpuinfo_x86.h:158
@ X86_SHA
Definition: cpuinfo_x86.h:210
@ X86_AVX512VBMI2
Definition: cpuinfo_x86.h:193
@ X86_AVX512ER
Definition: cpuinfo_x86.h:186
@ X86_AVX512BITALG
Definition: cpuinfo_x86.h:195
@ X86_RDSEED
Definition: cpuinfo_x86.h:172
@ X86_BMI2
Definition: cpuinfo_x86.h:170
@ X86_SMX
Definition: cpuinfo_x86.h:207
@ X86_F16C
Definition: cpuinfo_x86.h:163
@ X86_AVX512_VP2INTERSECT
Definition: cpuinfo_x86.h:202
@ X86_AVX512BW
Definition: cpuinfo_x86.h:188
@ X86_POPCNT
Definition: cpuinfo_x86.h:211
@ X86_FMA3
Definition: cpuinfo_x86.h:165
@ X86_AES
Definition: cpuinfo_x86.h:161
@ X86_MOVBE
Definition: cpuinfo_x86.h:212
@ X86_AVX512VPOPCNTDQ
Definition: cpuinfo_x86.h:196
@ X86_SSE4_2
Definition: cpuinfo_x86.h:180
@ X86_MMX
Definition: cpuinfo_x86.h:160
@ X86_DCA
Definition: cpuinfo_x86.h:214
@ X86_VAES
Definition: cpuinfo_x86.h:166
@ X86_AVX
Definition: cpuinfo_x86.h:182
@ X86_AVX512_4VBMI2
Definition: cpuinfo_x86.h:198
@ X86_SSE4_1
Definition: cpuinfo_x86.h:179
@ X86_FMA4
Definition: cpuinfo_x86.h:164
@ X86_SSE2
Definition: cpuinfo_x86.h:176
@ X86_SSE3
Definition: cpuinfo_x86.h:177
@ X86_LAST_
Definition: cpuinfo_x86.h:216
@ X86_AVX512F
Definition: cpuinfo_x86.h:184
@ X86_AMX_TILE
Definition: cpuinfo_x86.h:204
@ X86_TSC
Definition: cpuinfo_x86.h:157
@ X86_AVX512DQ
Definition: cpuinfo_x86.h:189
@ X86_AVX512_BF16
Definition: cpuinfo_x86.h:201
@ X86_AMX_INT8
Definition: cpuinfo_x86.h:205
@ X86_HLE
Definition: cpuinfo_x86.h:169
@ X86_RTM
Definition: cpuinfo_x86.h:171
@ X86_CLFLUSHOPT
Definition: cpuinfo_x86.h:173
@ X86_CLFSH
Definition: cpuinfo_x86.h:159
@ X86_AVX512CD
Definition: cpuinfo_x86.h:185
@ X86_AMX_BF16
Definition: cpuinfo_x86.h:203
@ X86_AVX512_4VNNIW
Definition: cpuinfo_x86.h:197
@ X86_SSE
Definition: cpuinfo_x86.h:175
const char * GetX86FeaturesEnumName(X86FeaturesEnum)
Definition: cpuinfo_x86.c:1561
Definition: cpu_features_cache_info.h:47
Definition: cpuinfo_x86.h:26
int avx512_vp2intersect
Definition: cpuinfo_x86.h:76
int pclmulqdq
Definition: cpuinfo_x86.h:81
int ss
Definition: cpuinfo_x86.h:91
int sse2
Definition: cpuinfo_x86.h:48
int avx512ifma
Definition: cpuinfo_x86.h:65
int avx512dq
Definition: cpuinfo_x86.h:63
int avx512vbmi2
Definition: cpuinfo_x86.h:67
int avx2
Definition: cpuinfo_x86.h:56
int vaes
Definition: cpuinfo_x86.h:37
int avx512_4vnniw
Definition: cpuinfo_x86.h:71
int clwb
Definition: cpuinfo_x86.h:45
int rdseed
Definition: cpuinfo_x86.h:43
int bmi1
Definition: cpuinfo_x86.h:39
int sse
Definition: cpuinfo_x86.h:47
int clfsh
Definition: cpuinfo_x86.h:30
int vpclmulqdq
Definition: cpuinfo_x86.h:38
int ssse3
Definition: cpuinfo_x86.h:50
int avx512vpopcntdq
Definition: cpuinfo_x86.h:70
int popcnt
Definition: cpuinfo_x86.h:86
int aes
Definition: cpuinfo_x86.h:32
int avx512_bf16
Definition: cpuinfo_x86.h:75
int movbe
Definition: cpuinfo_x86.h:87
int avx512bw
Definition: cpuinfo_x86.h:62
int cx16
Definition: cpuinfo_x86.h:84
int mmx
Definition: cpuinfo_x86.h:31
int sse4_2
Definition: cpuinfo_x86.h:52
int avx
Definition: cpuinfo_x86.h:55
int bmi2
Definition: cpuinfo_x86.h:41
int avx512_second_fma
Definition: cpuinfo_x86.h:73
int sse4a
Definition: cpuinfo_x86.h:53
int amx_int8
Definition: cpuinfo_x86.h:79
int amx_bf16
Definition: cpuinfo_x86.h:77
int fma4
Definition: cpuinfo_x86.h:35
int amx_tile
Definition: cpuinfo_x86.h:78
int rtm
Definition: cpuinfo_x86.h:42
int avx512_4vbmi2
Definition: cpuinfo_x86.h:72
int sse3
Definition: cpuinfo_x86.h:49
int rdrnd
Definition: cpuinfo_x86.h:88
int avx512er
Definition: cpuinfo_x86.h:60
int dca
Definition: cpuinfo_x86.h:90
int avx512f
Definition: cpuinfo_x86.h:58
int avx512pf
Definition: cpuinfo_x86.h:61
int smx
Definition: cpuinfo_x86.h:82
int avx512vnni
Definition: cpuinfo_x86.h:68
int clflushopt
Definition: cpuinfo_x86.h:44
int fma3
Definition: cpuinfo_x86.h:36
int sse4_1
Definition: cpuinfo_x86.h:51
int cx8
Definition: cpuinfo_x86.h:29
int erms
Definition: cpuinfo_x86.h:33
int fpu
Definition: cpuinfo_x86.h:27
int tsc
Definition: cpuinfo_x86.h:28
int avx512_4fmaps
Definition: cpuinfo_x86.h:74
int avx512cd
Definition: cpuinfo_x86.h:59
int hle
Definition: cpuinfo_x86.h:40
int sha
Definition: cpuinfo_x86.h:85
int avx512vbmi
Definition: cpuinfo_x86.h:66
int f16c
Definition: cpuinfo_x86.h:34
int avx512bitalg
Definition: cpuinfo_x86.h:69
int sgx
Definition: cpuinfo_x86.h:83
int avx512vl
Definition: cpuinfo_x86.h:64
Definition: cpuinfo_x86.h:95
int model
Definition: cpuinfo_x86.h:98
int family
Definition: cpuinfo_x86.h:97
X86Features features
Definition: cpuinfo_x86.h:96
int stepping
Definition: cpuinfo_x86.h:99