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_
Definition: cpuinfo_x86.h:159
int sse4_1
Definition: cpuinfo_x86.h:51
Definition: cpuinfo_x86.h:203
Definition: cpuinfo_x86.h:125
Definition: cpuinfo_x86.h:115
Definition: cpuinfo_x86.h:171
Definition: cpuinfo_x86.h:126
int avx512vpopcntdq
Definition: cpuinfo_x86.h:70
Definition: cpuinfo_x86.h:213
int erms
Definition: cpuinfo_x86.h:33
Definition: cpuinfo_x86.h:197
int model
Definition: cpuinfo_x86.h:98
int cx8
Definition: cpuinfo_x86.h:29
Definition: cpuinfo_x86.h:188
Definition: cpuinfo_x86.h:124
Definition: cpuinfo_x86.h:95
int dca
Definition: cpuinfo_x86.h:90
int avx512vbmi
Definition: cpuinfo_x86.h:66
int avx512cd
Definition: cpuinfo_x86.h:59
int vaes
Definition: cpuinfo_x86.h:37
Definition: cpuinfo_x86.h:132
int sse3
Definition: cpuinfo_x86.h:49
Definition: cpuinfo_x86.h:120
Definition: cpuinfo_x86.h:161
Definition: cpuinfo_x86.h:205
Definition: cpuinfo_x86.h:133
int sse4a
Definition: cpuinfo_x86.h:53
Definition: cpuinfo_x86.h:179
int rdseed
Definition: cpuinfo_x86.h:43
int ssse3
Definition: cpuinfo_x86.h:50
Definition: cpuinfo_x86.h:181
#define CPU_FEATURES_END_CPP_NAMESPACE
Definition: cpu_features_macros.h:115
Definition: cpuinfo_x86.h:172
Definition: cpuinfo_x86.h:131
Definition: cpuinfo_x86.h:165
Definition: cpuinfo_x86.h:158
int avx512bw
Definition: cpuinfo_x86.h:62
Definition: cpuinfo_x86.h:121
int avx512vbmi2
Definition: cpuinfo_x86.h:67
Definition: cpuinfo_x86.h:170
const char * GetX86MicroarchitectureName(X86Microarchitecture)
Definition: cpuinfo_x86.c:1566
int bmi2
Definition: cpuinfo_x86.h:41
int bmi1
Definition: cpuinfo_x86.h:39
Definition: cpuinfo_x86.h:156
int ss
Definition: cpuinfo_x86.h:91
int clflushopt
Definition: cpuinfo_x86.h:44
int fpu
Definition: cpuinfo_x86.h:27
Definition: cpuinfo_x86.h:191
Definition: cpuinfo_x86.h:199
Definition: cpuinfo_x86.h:166
int rtm
Definition: cpuinfo_x86.h:42
Definition: cpuinfo_x86.h:118
Definition: cpuinfo_x86.h:195
int f16c
Definition: cpuinfo_x86.h:34
int vpclmulqdq
Definition: cpuinfo_x86.h:38
Definition: cpuinfo_x86.h:164
Definition: cpuinfo_x86.h:167
Definition: cpuinfo_x86.h:160
Definition: cpuinfo_x86.h:198
Definition: cpuinfo_x86.h:192
Definition: cpuinfo_x86.h:216
Definition: cpuinfo_x86.h:201
Definition: cpuinfo_x86.h:190
Definition: cpuinfo_x86.h:139
int sgx
Definition: cpuinfo_x86.h:83
int avx512dq
Definition: cpuinfo_x86.h:63
Definition: cpuinfo_x86.h:180
int avx512_4vbmi2
Definition: cpuinfo_x86.h:72
Definition: cpuinfo_x86.h:169
#define CPU_FEATURES_START_CPP_NAMESPACE
Definition: cpu_features_macros.h:114
int fma3
Definition: cpuinfo_x86.h:36
int amx_tile
Definition: cpuinfo_x86.h:78
Definition: cpuinfo_x86.h:129
Definition: cpuinfo_x86.h:210
int fma4
Definition: cpuinfo_x86.h:35
int hle
Definition: cpuinfo_x86.h:40
int pclmulqdq
Definition: cpuinfo_x86.h:81
int avx512f
Definition: cpuinfo_x86.h:58
int avx
Definition: cpuinfo_x86.h:55
Definition: cpuinfo_x86.h:138
Definition: cpuinfo_x86.h:122
Definition: cpuinfo_x86.h:183
int avx512_4vnniw
Definition: cpuinfo_x86.h:71
Definition: cpuinfo_x86.h:209
int clwb
Definition: cpuinfo_x86.h:45
void FillX86BrandString(char brand_string[49])
Definition: cpuinfo_x86.c:1543
int avx512pf
Definition: cpuinfo_x86.h:61
Definition: cpuinfo_x86.h:211
int sse2
Definition: cpuinfo_x86.h:48
Definition: cpuinfo_x86.h:157
Definition: cpuinfo_x86.h:135
int avx512bitalg
Definition: cpuinfo_x86.h:69
Definition: cpuinfo_x86.h:176
int avx512vnni
Definition: cpuinfo_x86.h:68
Definition: cpuinfo_x86.h:137
X86Microarchitecture
Definition: cpuinfo_x86.h:113
Definition: cpuinfo_x86.h:177
X86FeaturesEnum
Definition: cpuinfo_x86.h:155
Definition: cpuinfo_x86.h:174
int avx512vl
Definition: cpuinfo_x86.h:64
int cx16
Definition: cpuinfo_x86.h:84
int family
Definition: cpuinfo_x86.h:97
Definition: cpuinfo_x86.h:214
Definition: cpuinfo_x86.h:134
int rdrnd
Definition: cpuinfo_x86.h:88
const char * GetX86FeaturesEnumName(X86FeaturesEnum)
Definition: cpuinfo_x86.c:1561
int sse
Definition: cpuinfo_x86.h:47
int aes
Definition: cpuinfo_x86.h:32
int amx_bf16
Definition: cpuinfo_x86.h:77
Definition: cpuinfo_x86.h:119
Definition: cpuinfo_x86.h:173
Definition: cpuinfo_x86.h:196
Definition: cpuinfo_x86.h:212
Definition: cpuinfo_x86.h:175
Definition: cpuinfo_x86.h:206
int avx512_second_fma
Definition: cpuinfo_x86.h:73
int sha
Definition: cpuinfo_x86.h:85
Definition: cpuinfo_x86.h:185
Definition: cpuinfo_x86.h:207
X86Info GetX86Info(void)
Definition: cpuinfo_x86.c:1385
Definition: cpuinfo_x86.h:193
int avx512er
Definition: cpuinfo_x86.h:60
Definition: cpuinfo_x86.h:162
int GetX86FeaturesEnumValue(const X86Features *features, X86FeaturesEnum value)
Definition: cpuinfo_x86.c:1555
int mmx
Definition: cpuinfo_x86.h:31
Definition: cpuinfo_x86.h:194
int clfsh
Definition: cpuinfo_x86.h:30
Definition: cpuinfo_x86.h:123
CacheInfo GetX86CacheInfo(void)
Definition: cpuinfo_x86.c:1402
Definition: cpuinfo_x86.h:178
Definition: cpuinfo_x86.h:136
Definition: cpuinfo_x86.h:168
int sse4_2
Definition: cpuinfo_x86.h:52
Definition: cpuinfo_x86.h:215
int avx512_bf16
Definition: cpuinfo_x86.h:75
Definition: cpuinfo_x86.h:26
Definition: cpuinfo_x86.h:114
Definition: cpuinfo_x86.h:208
Definition: cpuinfo_x86.h:184
Definition: cpu_features_cache_info.h:47
Definition: cpuinfo_x86.h:163
Definition: cpuinfo_x86.h:130
int avx512ifma
Definition: cpuinfo_x86.h:65
X86Features features
Definition: cpuinfo_x86.h:96
int avx512_4fmaps
Definition: cpuinfo_x86.h:74
Definition: cpuinfo_x86.h:202
Definition: cpuinfo_x86.h:200
int avx512_vp2intersect
Definition: cpuinfo_x86.h:76
Definition: cpuinfo_x86.h:186
int smx
Definition: cpuinfo_x86.h:82
Definition: cpuinfo_x86.h:117
Definition: cpuinfo_x86.h:128
int movbe
Definition: cpuinfo_x86.h:87
Definition: cpuinfo_x86.h:127
int avx2
Definition: cpuinfo_x86.h:56
Definition: cpuinfo_x86.h:187
int tsc
Definition: cpuinfo_x86.h:28
int amx_int8
Definition: cpuinfo_x86.h:79
X86Microarchitecture GetX86Microarchitecture(const X86Info *info)
Definition: cpuinfo_x86.c:1415
Definition: cpuinfo_x86.h:189
int stepping
Definition: cpuinfo_x86.h:99
Definition: cpuinfo_x86.h:204
Definition: cpuinfo_x86.h:182
Definition: cpuinfo_x86.h:116
int popcnt
Definition: cpuinfo_x86.h:86