Skip to content

Commit af3a41e

Browse files
authored
Add autodetection for POWER7, POWER9 & POWER10 (#647)
Read from `/proc/cpuinfo` as done for ARM. Fixes #501
1 parent 17b0caa commit af3a41e

File tree

2 files changed

+28
-5
lines changed

2 files changed

+28
-5
lines changed

frame/base/bli_cpuid.c

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ bool bli_cpuid_is_bulldozer
485485
return TRUE;
486486
}
487487

488-
#elif defined(__aarch64__) || defined(__arm__) || defined(_M_ARM)
488+
#elif defined(__aarch64__) || defined(__arm__) || defined(_M_ARM) || defined(_ARCH_PPC)
489489

490490
arch_t bli_cpuid_query_id( void )
491491
{
@@ -530,9 +530,14 @@ arch_t bli_cpuid_query_id( void )
530530
return BLIS_ARCH_GENERIC;
531531
}
532532
}
533-
else if ( vendor == VENDOR_UNKNOWN )
533+
else if ( vendor == VENDOR_IBM )
534534
{
535-
return BLIS_ARCH_GENERIC;
535+
if ( model == MODEL_POWER7)
536+
return BLIS_ARCH_POWER7;
537+
else if ( model == MODEL_POWER9)
538+
return BLIS_ARCH_POWER9;
539+
else if ( model == MODEL_POWER10)
540+
return BLIS_ARCH_POWER10;
536541
}
537542

538543
return BLIS_ARCH_GENERIC;
@@ -1203,7 +1208,7 @@ uint32_t bli_cpuid_query
12031208
return VENDOR_ARM;
12041209
}
12051210

1206-
#elif defined(__arm__) || defined(_M_ARM)
1211+
#elif defined(__arm__) || defined(_M_ARM) || defined(_ARCH_PPC)
12071212

12081213
/*
12091214
I can't easily find documentation to do this as for aarch64, though
@@ -1240,6 +1245,20 @@ uint32_t bli_cpuid_query
12401245
char feat_str[ TEMP_BUFFER_SIZE ];
12411246
char* r_val;
12421247

1248+
#ifdef _ARCH_PPC
1249+
r_val = find_string_in( "cpu", proc_str, TEMP_BUFFER_SIZE, pci_str );
1250+
if ( r_val == NULL ) return VENDOR_IBM;
1251+
1252+
if ( strstr( proc_str, "POWER7" ) != NULL )
1253+
*model = MODEL_POWER7;
1254+
else if ( strstr( proc_str, "POWER9" ) != NULL )
1255+
*model = MODEL_POWER9;
1256+
else if ( strstr( proc_str, "POWER10" ) != NULL )
1257+
*model = MODEL_POWER10;
1258+
1259+
return VENDOR_IBM;
1260+
#endif
1261+
12431262
//printf( "bli_cpuid_query(): beginning search\n" );
12441263

12451264
// Search /proc/cpuinfo for the 'Processor' entry.

frame/base/bli_cpuid.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,19 +161,23 @@ enum
161161
FEATURE_AVX512VL = 0x4000
162162
};
163163

164-
#elif defined(__aarch64__) || defined(__arm__) || defined(_M_ARM)
164+
#elif defined(__aarch64__) || defined(__arm__) || defined(_M_ARM) || defined(_ARCH_PPC)
165165

166166
char* find_string_in( char* target, char* buffer, size_t buf_len, char* filepath );
167167

168168
enum
169169
{
170170
VENDOR_ARM = 0,
171+
VENDOR_IBM,
171172
VENDOR_UNKNOWN
172173
};
173174
enum
174175
{
175176
MODEL_ARMV7 = 0,
176177
MODEL_ARMV8,
178+
MODEL_POWER7,
179+
MODEL_POWER9,
180+
MODEL_POWER10,
177181
MODEL_UNKNOWN
178182
};
179183
enum

0 commit comments

Comments
 (0)