Skip to content

Commit 7bcd643

Browse files
authored
Merge pull request #3442 from martin-frbg/cpuid_x86
Add CPUID recognition of Intel Alder Lake
2 parents 4ea9a14 + 08f8bb6 commit 7bcd643

File tree

2 files changed

+181
-50
lines changed

2 files changed

+181
-50
lines changed

cpuid_x86.c

Lines changed: 134 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
//{
12
/*********************************************************************/
23
/* Copyright 2009, 2010 The University of Texas at Austin. */
34
/* All rights reserved. */
@@ -1455,7 +1456,6 @@ int get_cpuname(void){
14551456
return CPUTYPE_NEHALEM;
14561457
}
14571458
break;
1458-
case 9:
14591459
case 8:
14601460
switch (model) {
14611461
case 12: // Tiger Lake
@@ -1475,30 +1475,70 @@ int get_cpuname(void){
14751475
return CPUTYPE_SANDYBRIDGE;
14761476
else
14771477
return CPUTYPE_NEHALEM;
1478-
}
1479-
case 10: //family 6 exmodel 10
1478+
case 15: // Sapphire Rapids
1479+
if(support_avx512_bf16())
1480+
return CPUTYPE_COOPERLAKE;
1481+
if(support_avx512())
1482+
return CPUTYPE_SKYLAKEX;
1483+
if(support_avx2())
1484+
return CPUTYPE_HASWELL;
1485+
if(support_avx())
1486+
return CPUTYPE_SANDYBRIDGE;
1487+
else
1488+
return CPUTYPE_NEHALEM;
1489+
}
1490+
break;
1491+
case 9:
14801492
switch (model) {
1481-
case 5: // Comet Lake H and S
1482-
case 6: // Comet Lake U
1493+
case 7: // Alder Lake desktop
1494+
case 10: // Alder Lake mobile
14831495
if(support_avx2())
14841496
return CPUTYPE_HASWELL;
14851497
if(support_avx())
1486-
return CPUTYPE_SANDYBRIDGE;
1498+
return CPUTYPE_SANDYBRIDGE;
14871499
else
1488-
return CPUTYPE_NEHALEM;
1489-
case 7: // Rocket Lake
1490-
if(support_avx512())
1500+
return CPUTYPE_NEHALEM;
1501+
case 13: // Ice Lake NNPI
1502+
if(support_avx512())
14911503
return CPUTYPE_SKYLAKEX;
1504+
if(support_avx2())
1505+
return CPUTYPE_HASWELL;
1506+
if(support_avx())
1507+
return CPUTYPE_SANDYBRIDGE;
1508+
else
1509+
return CPUTYPE_NEHALEM;
1510+
case 14: // Kaby Lake and refreshes
14921511
if(support_avx2())
14931512
return CPUTYPE_HASWELL;
14941513
if(support_avx())
14951514
return CPUTYPE_SANDYBRIDGE;
1496-
else
1497-
return CPUTYPE_NEHALEM;
1498-
}
1499-
break;
1500-
}
1515+
else
1516+
return CPUTYPE_NEHALEM;
1517+
}
15011518
break;
1519+
case 10: //family 6 exmodel 10
1520+
switch (model) {
1521+
case 5: // Comet Lake H and S
1522+
case 6: // Comet Lake U
1523+
if(support_avx2())
1524+
return CPUTYPE_HASWELL;
1525+
if(support_avx())
1526+
return CPUTYPE_SANDYBRIDGE;
1527+
else
1528+
return CPUTYPE_NEHALEM;
1529+
case 7: // Rocket Lake
1530+
if(support_avx512())
1531+
return CPUTYPE_SKYLAKEX;
1532+
if(support_avx2())
1533+
return CPUTYPE_HASWELL;
1534+
if(support_avx())
1535+
return CPUTYPE_SANDYBRIDGE;
1536+
else
1537+
return CPUTYPE_NEHALEM;
1538+
}
1539+
break;
1540+
}
1541+
break;
15021542
case 0x7:
15031543
return CPUTYPE_ITANIUM;
15041544
case 0xf:
@@ -2069,32 +2109,7 @@ int get_coretype(void){
20692109
return CORE_NEHALEM;
20702110
}
20712111
break;
2072-
case 10:
2073-
switch (model) {
2074-
case 5: // Comet Lake H and S
2075-
case 6: // Comet Lake U
2076-
if(support_avx())
2077-
#ifndef NO_AVX2
2078-
return CORE_HASWELL;
2079-
#else
2080-
return CORE_SANDYBRIDGE;
2081-
#endif
2082-
else
2083-
return CORE_NEHALEM;
2084-
case 7:// Rocket Lake
2085-
#ifndef NO_AVX512
2086-
if(support_avx512())
2087-
return CORE_SKYLAKEX;
2088-
#endif
2089-
#ifndef NO_AVX2
2090-
if(support_avx2())
2091-
return CORE_HASWELL;
2092-
#endif
2093-
if(support_avx())
2094-
return CORE_SANDYBRIDGE;
2095-
else
2096-
return CORE_NEHALEM;
2097-
}
2112+
20982113
case 5:
20992114
switch (model) {
21002115
case 6:
@@ -2148,6 +2163,7 @@ int get_coretype(void){
21482163
return CORE_NEHALEM;
21492164
}
21502165
break;
2166+
21512167
case 6:
21522168
if (model == 6)
21532169
#ifndef NO_AVX512
@@ -2162,7 +2178,7 @@ int get_coretype(void){
21622178
else
21632179
return CORE_NEHALEM;
21642180
#endif
2165-
if (model == 10)
2181+
if (model == 10 || model == 12)
21662182
#ifndef NO_AVX512
21672183
if(support_avx512_bf16())
21682184
return CORE_COOPERLAKE;
@@ -2178,10 +2194,11 @@ int get_coretype(void){
21782194
return CORE_NEHALEM;
21792195
#endif
21802196
break;
2197+
21812198
case 7:
21822199
if (model == 10)
21832200
return CORE_NEHALEM;
2184-
if (model == 14)
2201+
if (model == 13 || model == 14) // Ice Lake
21852202
#ifndef NO_AVX512
21862203
return CORE_SKYLAKEX;
21872204
#else
@@ -2195,9 +2212,9 @@ int get_coretype(void){
21952212
return CORE_NEHALEM;
21962213
#endif
21972214
break;
2198-
case 9:
2215+
21992216
case 8:
2200-
if (model == 12 || model == 13) { // Tiger Lake
2217+
if (model == 12 || model == 13) { // Tiger Lake
22012218
if(support_avx512())
22022219
return CORE_SKYLAKEX;
22032220
if(support_avx2())
@@ -2207,7 +2224,50 @@ int get_coretype(void){
22072224
else
22082225
return CORE_NEHALEM;
22092226
}
2210-
if (model == 14) { // Kaby Lake
2227+
if (model == 14) { // Kaby Lake mobile
2228+
if(support_avx())
2229+
#ifndef NO_AVX2
2230+
return CORE_HASWELL;
2231+
#else
2232+
return CORE_SANDYBRIDGE;
2233+
#endif
2234+
else
2235+
return CORE_NEHALEM;
2236+
}
2237+
if (model == 15) { // Sapphire Rapids
2238+
if(support_avx512_bf16())
2239+
return CPUTYPE_COOPERLAKE;
2240+
if(support_avx512())
2241+
return CPUTYPE_SKYLAKEX;
2242+
if(support_avx2())
2243+
return CPUTYPE_HASWELL;
2244+
if(support_avx())
2245+
return CPUTYPE_SANDYBRIDGE;
2246+
else
2247+
return CPUTYPE_NEHALEM;
2248+
}
2249+
break;
2250+
2251+
case 9:
2252+
if (model == 7 || model == 10) { // Alder Lake
2253+
if(support_avx2())
2254+
return CORE_HASWELL;
2255+
if(support_avx())
2256+
return CORE_SANDYBRIDGE;
2257+
else
2258+
return CORE_NEHALEM;
2259+
}
2260+
if (model == 13) { // Ice Lake NNPI
2261+
if(support_avx512())
2262+
return CORE_SKYLAKEX;
2263+
if(support_avx2())
2264+
return CORE_HASWELL;
2265+
if(support_avx())
2266+
return CORE_SANDYBRIDGE;
2267+
else
2268+
return CORE_NEHALEM;
2269+
}
2270+
if (model == 14) { // Kaby Lake desktop
22112271
if(support_avx())
22122272
#ifndef NO_AVX2
22132273
return CORE_HASWELL;
@@ -2217,12 +2277,39 @@ int get_coretype(void){
22172277
else
22182278
return CORE_NEHALEM;
22192279
}
2220-
}
22212280
break;
22222281

2282+
case 10:
2283+
switch (model) {
2284+
case 5: // Comet Lake H and S
2285+
case 6: // Comet Lake U
2286+
if(support_avx())
2287+
#ifndef NO_AVX2
2288+
return CORE_HASWELL;
2289+
#else
2290+
return CORE_SANDYBRIDGE;
2291+
#endif
2292+
else
2293+
return CORE_NEHALEM;
2294+
case 7:// Rocket Lake
2295+
#ifndef NO_AVX512
2296+
if(support_avx512())
2297+
return CORE_SKYLAKEX;
2298+
#endif
2299+
#ifndef NO_AVX2
2300+
if(support_avx2())
2301+
return CORE_HASWELL;
2302+
#endif
2303+
if(support_avx())
2304+
return CORE_SANDYBRIDGE;
2305+
else
2306+
return CORE_NEHALEM;
2307+
}
2308+
22232309
case 15:
22242310
if (model <= 0x2) return CORE_NORTHWOOD;
22252311
else return CORE_PRESCOTT;
2312+
}
22262313
}
22272314
}
22282315

@@ -2495,3 +2582,4 @@ void get_sse(void){
24952582
if (features & HAVE_FMA3 ) printf("HAVE_FMA3=1\n");
24962583

24972584
}
2585+
//}

driver/others/dynamic.c

Lines changed: 47 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,7 @@ static gotoblas_t *get_coretype(void){
624624
return &gotoblas_NEHALEM;
625625
}
626626
}
627-
if (model == 10) {
627+
if (model == 10 || model == 12){
628628
// Ice Lake SP
629629
if(support_avx512_bf16())
630630
return &gotoblas_COOPERLAKE;
@@ -639,12 +639,12 @@ static gotoblas_t *get_coretype(void){
639639
openblas_warning(FALLBACK_VERBOSE, NEHALEM_FALLBACK);
640640
return &gotoblas_NEHALEM;
641641
}
642-
}
642+
}
643643
return NULL;
644644
case 7:
645645
if (model == 10) // Goldmont Plus
646646
return &gotoblas_NEHALEM;
647-
if (model == 14) {
647+
if (model == 13 || model == 14) {
648648
// Ice Lake
649649
if (support_avx512())
650650
return &gotoblas_SKYLAKEX;
@@ -661,7 +661,6 @@ static gotoblas_t *get_coretype(void){
661661
}
662662
}
663663
return NULL;
664-
case 9:
665664
case 8:
666665
if (model == 12 || model == 13) { // Tiger Lake
667666
if (support_avx512())
@@ -689,6 +688,50 @@ static gotoblas_t *get_coretype(void){
689688
return &gotoblas_NEHALEM; //OS doesn't support AVX. Use old kernels.
690689
}
691690
}
691+
if (model == 15){ // Sapphire Rapids
692+
if(support_avx512_bf16())
693+
return &gotoblas_COOPERLAKE;
694+
if (support_avx512())
695+
return &gotoblas_SKYLAKEX;
696+
if(support_avx2())
697+
return &gotoblas_HASWELL;
698+
if(support_avx()) {
699+
openblas_warning(FALLBACK_VERBOSE, SANDYBRIDGE_FALLBACK);
700+
return &gotoblas_SANDYBRIDGE;
701+
} else {
702+
openblas_warning(FALLBACK_VERBOSE, NEHALEM_FALLBACK);
703+
return &gotoblas_NEHALEM;
704+
}
705+
}
706+
return NULL;
707+
708+
709+
case 9:
710+
if (model == 7 || model == 10) { // Alder Lake
711+
if(support_avx2()){
712+
openblas_warning(FALLBACK_VERBOSE, HASWELL_FALLBACK);
713+
return &gotoblas_HASWELL;
714+
}
715+
if(support_avx()) {
716+
openblas_warning(FALLBACK_VERBOSE, SANDYBRIDGE_FALLBACK);
717+
return &gotoblas_SANDYBRIDGE;
718+
} else {
719+
openblas_warning(FALLBACK_VERBOSE, NEHALEM_FALLBACK);
720+
return &gotoblas_NEHALEM;
721+
}
722+
}
723+
if (model == 14 ) { // Kaby Lake, Coffee Lake
724+
if(support_avx2())
725+
return &gotoblas_HASWELL;
726+
if(support_avx()) {
727+
openblas_warning(FALLBACK_VERBOSE, SANDYBRIDGE_FALLBACK);
728+
return &gotoblas_SANDYBRIDGE;
729+
} else {
730+
openblas_warning(FALLBACK_VERBOSE, NEHALEM_FALLBACK);
731+
return &gotoblas_NEHALEM; //OS doesn't support AVX. Use old kernels.
732+
}
733+
}
734+
return NULL;
692735
case 10:
693736
if (model == 5 || model == 6) {
694737
if(support_avx2())

0 commit comments

Comments
 (0)