Skip to content

Commit d6860c4

Browse files
authored
Add detection of Intel x86 AVX-VNNI instructions. (#196)
Tested using Intel SDE: ``` bash scripts/local-build.sh OPTIONS=() PLATFORMS=() OPTIONS+=(-quark); PLATFORMS+=("Quark") OPTIONS+=(-p4); PLATFORMS+=("Pentium4") OPTIONS+=(-p4p); PLATFORMS+=("Pentium4 Prescott") OPTIONS+=(-mrm); PLATFORMS+=("Merom") OPTIONS+=(-pnr); PLATFORMS+=("Penryn") OPTIONS+=(-nhm); PLATFORMS+=("Nehalem") OPTIONS+=(-wsm); PLATFORMS+=("Westmere") OPTIONS+=(-snb); PLATFORMS+=("Sandy Bridge") OPTIONS+=(-ivb); PLATFORMS+=("Ivy Bridge") OPTIONS+=(-hsw); PLATFORMS+=("Haswell") OPTIONS+=(-bdw); PLATFORMS+=("Broadwell") OPTIONS+=(-slt); PLATFORMS+=("Saltwell") OPTIONS+=(-slm); PLATFORMS+=("Silvermont") OPTIONS+=(-glm); PLATFORMS+=("Goldmont") OPTIONS+=(-glp); PLATFORMS+=("Goldmont Plus") OPTIONS+=(-tnt); PLATFORMS+=("Tremont") OPTIONS+=(-snr); PLATFORMS+=("Snow Ridge") OPTIONS+=(-skl); PLATFORMS+=("Skylake") OPTIONS+=(-cnl); PLATFORMS+=("Cannon Lake") OPTIONS+=(-icl); PLATFORMS+=("Ice Lake") OPTIONS+=(-skx); PLATFORMS+=("Skylake server") OPTIONS+=(-clx); PLATFORMS+=("Cascade Lake") OPTIONS+=(-cpx); PLATFORMS+=("Cooper Lake") OPTIONS+=(-icx); PLATFORMS+=("Ice Lake server") OPTIONS+=(-knl); PLATFORMS+=("Knights landing") OPTIONS+=(-knm); PLATFORMS+=("Knights mill") OPTIONS+=(-tgl); PLATFORMS+=("Tiger Lake") OPTIONS+=(-adl); PLATFORMS+=("Alder Lake") OPTIONS+=(-mtl); PLATFORMS+=("Meteor Lake") OPTIONS+=(-rpl); PLATFORMS+=("Raptor Lake") OPTIONS+=(-spr); PLATFORMS+=("Sapphire Rapids") OPTIONS+=(-gnr); PLATFORMS+=("Granite Rapids") OPTIONS+=(-srf); PLATFORMS+=("Sierra Forest") OPTIONS+=(-grr); PLATFORMS+=("Grand Ridge") OPTIONS+=(-future); PLATFORMS+=("Future chip") SDE_BIN="path/to/sde" for I in "${!PLATFORMS[@]}"; do echo "${PLATFORMS["${I}"]}" "${SDE_BIN}" "${OPTIONS[$I]}" -- ./build/local/isa-info | grep "AVXVNNI" done ``` Result: ``` Quark [error] Merom [error] Penryn [error] Nehalem [error] Westmere AVXVNNI: no Sandy Bridge AVXVNNI: no Ivy Bridge AVXVNNI: no Haswell AVXVNNI: no Broadwell AVXVNNI: no Saltwell [error] Silvermont AVXVNNI: no Goldmont AVXVNNI: no Goldmont Plus AVXVNNI: no Tremont AVXVNNI: no Snow Ridge AVXVNNI: no Skylake AVXVNNI: no Cannon Lake AVXVNNI: no Ice Lake AVXVNNI: no Skylake server AVXVNNI: no Cascade Lake AVXVNNI: no Cooper Lake AVXVNNI: no Ice Lake server AVXVNNI: no Knights landing AVXVNNI: no Knights mill AVXVNNI: no Tiger Lake AVXVNNI: no Alder Lake AVXVNNI: yes Meteor Lake AVXVNNI: yes Raptor Lake AVXVNNI: yes Sapphire Rapids AVXVNNI: yes Granite Rapids AVXVNNI: yes Sierra Forest AVXVNNI: yes Grand Ridge AVXVNNI: yes Future chip AVXVNNI: yes ```
1 parent 76d5e8f commit d6860c4

File tree

3 files changed

+16
-0
lines changed

3 files changed

+16
-0
lines changed

include/cpuinfo.h

+9
Original file line numberDiff line numberDiff line change
@@ -729,6 +729,7 @@ void CPUINFO_ABI cpuinfo_deinitialize(void);
729729
bool sse4a;
730730
bool misaligned_sse;
731731
bool avx;
732+
bool avxvnni;
732733
bool fma3;
733734
bool fma4;
734735
bool xop;
@@ -1076,6 +1077,14 @@ static inline bool cpuinfo_has_x86_avx(void) {
10761077
#endif
10771078
}
10781079

1080+
static inline bool cpuinfo_has_x86_avxvnni(void) {
1081+
#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
1082+
return cpuinfo_isa.avxvnni;
1083+
#else
1084+
return false;
1085+
#endif
1086+
}
1087+
10791088
static inline bool cpuinfo_has_x86_fma3(void) {
10801089
#if CPUINFO_ARCH_X86 || CPUINFO_ARCH_X86_64
10811090
return cpuinfo_isa.fma3;

src/x86/isa.c

+6
Original file line numberDiff line numberDiff line change
@@ -496,6 +496,12 @@ struct cpuinfo_x86_isa cpuinfo_x86_detect_isa(
496496
*/
497497
isa.avx512fp16 = avx512_regs && !!(structured_feature_info0.edx & UINT32_C(0x00800000));
498498

499+
/*
500+
* AVX_VNNI instructions:
501+
* - Intel: eax[bit 4] in structured feature info (ecx = 1).
502+
*/
503+
isa.avxvnni = avx_regs && !!(structured_feature_info1.eax & UINT32_C(0x00000010));
504+
499505
/*
500506
* AVX512_BF16 instructions:
501507
* - Intel: eax[bit 5] in structured feature info (ecx = 1).

tools/isa-info.c

+1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ int main(int argc, char** argv) {
7272
printf("\tAVX512VP2INTERSECT: %s\n", cpuinfo_has_x86_avx512vp2intersect() ? "yes" : "no");
7373
printf("\tAVX512_4VNNIW: %s\n", cpuinfo_has_x86_avx512_4vnniw() ? "yes" : "no");
7474
printf("\tAVX512_4FMAPS: %s\n", cpuinfo_has_x86_avx512_4fmaps() ? "yes" : "no");
75+
printf("\tAVXVNNI: %s\n", cpuinfo_has_x86_avxvnni() ? "yes" : "no");
7576

7677

7778
printf("Multi-threading extensions:\n");

0 commit comments

Comments
 (0)