Skip to content

Commit 96ad579

Browse files
nk521martin-frbg
authored andcommitted
add in runtime cpu detection for zarch (#2349)
add in runtime cpu detection for zarch
1 parent c45b7ae commit 96ad579

File tree

7 files changed

+195
-28
lines changed

7 files changed

+195
-28
lines changed

Makefile.system

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ else ifeq ($(ARCH), i386)
2525
override ARCH=x86
2626
else ifeq ($(ARCH), aarch64)
2727
override ARCH=arm64
28+
else ifeq ($(ARCH), zarch)
29+
override ARCH=zarch
2830
endif
2931

3032
NETLIB_LAPACK_DIR = $(TOPDIR)/lapack-netlib
@@ -558,6 +560,11 @@ DYNAMIC_CORE += THUNDERX2T99
558560
DYNAMIC_CORE += TSV110
559561
endif
560562

563+
ifeq ($(ARCH), zarch)
564+
DYNAMIC_CORE = Z13
565+
DYNAMIC_CORE += Z14
566+
endif
567+
561568
ifeq ($(ARCH), power)
562569
DYNAMIC_CORE = POWER6
563570
DYNAMIC_CORE += POWER8

driver/others/Makefile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,13 @@ else
2121
ifeq ($(ARCH),power)
2222
COMMONOBJS += dynamic_power.$(SUFFIX)
2323
else
24+
ifeq ($(ARCH),zarch)
25+
COMMONOBJS += dynamic_zarch.$(SUFFIX)
26+
else
2427
COMMONOBJS += dynamic.$(SUFFIX)
2528
endif
2629
endif
30+
endif
2731
else
2832
COMMONOBJS += parameter.$(SUFFIX)
2933
endif
@@ -85,9 +89,13 @@ else
8589
ifeq ($(ARCH),power)
8690
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) dynamic_power.$(SUFFIX)
8791
else
92+
ifeq ($(ARCH),zarch)
93+
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) dynamic_zarch.$(SUFFIX)
94+
else
8895
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) dynamic.$(SUFFIX)
8996
endif
9097
endif
98+
endif
9199
else
92100
HPLOBJS = memory.$(SUFFIX) xerbla.$(SUFFIX) parameter.$(SUFFIX)
93101
endif

driver/others/dynamic_zarch.c

Lines changed: 131 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
2+
#include "common.h"
3+
4+
extern gotoblas_t gotoblas_Z13;
5+
extern gotoblas_t gotoblas_Z14;
6+
extern gotoblas_t gotoblas_Z15;
7+
//#if (!defined C_GCC) || (GCC_VERSION >= 60000)
8+
//extern gotoblas_t gotoblas_Z14;
9+
//#endif
10+
11+
#define NUM_CORETYPES 5
12+
13+
extern void openblas_warning(int verbose, const char* msg);
14+
15+
static char* corename[] = {
16+
"unknown",
17+
"Z13",
18+
"Z14",
19+
"Z15",
20+
"ZARCH_GENERIC",
21+
};
22+
23+
char* gotoblas_corename(void) {
24+
if (gotoblas == &gotoblas_Z13) return corename[1];
25+
if (gotoblas == &gotoblas_Z14) return corename[2];
26+
if (gotoblas == &gotoblas_Z15) return corename[3];
27+
//#if (!defined C_GCC) || (GCC_VERSION >= 60000)
28+
// if (gotoblas == &gotoblas_POWER9) return corename[3];
29+
//#endif
30+
return corename[0]; // try generic?
31+
}
32+
33+
// __builtin_cpu_is is not supported by zarch
34+
static gotolabs_t* get_coretype(void) {
35+
FILE* infile;
36+
char buffer[512], * p;
37+
38+
p = (char*)NULL;
39+
infile = fopen("/proc/sysinfo", "r");
40+
while (fgets(buffer, sizeof(buffer), infile)) {
41+
if (!strncmp("Type", buffer, 4)) {
42+
p = strchr(buffer, ':') + 2;
43+
#if 0
44+
fprintf(stderr, "%s\n", p);
45+
#endif
46+
break;
47+
}
48+
}
49+
50+
fclose(infile);
51+
52+
if (strstr(p, "2964")) return &gotoblas_Z13;
53+
if (strstr(p, "2965")) return &gotoblas_Z13;
54+
if (strstr(p, "3906")) return &gotoblas_Z14;
55+
if (strstr(p, "3907")) return &gotoblas_Z14;
56+
if (strstr(p, "8561")) return &gotoblas_Z14; // fallback z15 to z14
57+
if (strstr(p, "8562")) return &gotoblas_Z14; // fallback z15 to z14
58+
59+
return NULL; // should be ZARCH_GENERIC
60+
}
61+
62+
static gotoblas_t* force_coretype(char* coretype) {
63+
64+
int i;
65+
int found = -1;
66+
char message[128];
67+
68+
for (i = 0; i < NUM_CORETYPES; i++)
69+
{
70+
if (!strncasecmp(coretype, corename[i], 20))
71+
{
72+
found = i;
73+
break;
74+
}
75+
}
76+
77+
switch (found)
78+
{
79+
case 1: return (&gotoblas_Z13);
80+
case 2: return (&gotoblas_Z14);
81+
case 3: return (&gotoblas_Z15);
82+
//#if (!defined C_GCC) || (GCC_VERSION >= 60000)
83+
// case 3: return (&gotoblas_POWER9);
84+
//#endif
85+
default: return NULL;
86+
}
87+
snprintf(message, 128, "Core not found: %s\n", coretype);
88+
openblas_warning(1, message);
89+
}
90+
91+
void gotoblas_dynamic_init(void) {
92+
93+
char coremsg[128];
94+
char coren[22];
95+
char* p;
96+
97+
98+
if (gotoblas) return;
99+
100+
p = getenv("OPENBLAS_CORETYPE");
101+
if (p)
102+
{
103+
gotoblas = force_coretype(p);
104+
}
105+
else
106+
{
107+
gotoblas = get_coretype();
108+
}
109+
110+
if (gotoblas == NULL)
111+
{
112+
snprintf(coremsg, 128, "Falling back to Z14 core\n");
113+
openblas_warning(1, coremsg);
114+
gotoblas = &gotoblas_Z14;
115+
}
116+
117+
if (gotoblas && gotoblas->init) {
118+
strncpy(coren, gotoblas_corename(), 20);
119+
sprintf(coremsg, "Core: %s\n", coren);
120+
openblas_warning(2, coremsg);
121+
gotoblas->init();
122+
}
123+
else {
124+
openblas_warning(0, "OpenBLAS : Architecture Initialization failed. No initialization function found.\n");
125+
exit(1);
126+
}
127+
}
128+
129+
void gotoblas_dynamic_quit(void) {
130+
gotoblas = NULL;
131+
}

kernel/setparam-ref.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,26 @@ static void init_parameter(void) {
739739
}
740740
#else //POWER
741741

742+
#if defined(ARCH_ZARCH)
743+
static void init_parameter(void) {
744+
TABLE_NAME.sgemm_p = SGEMM_DEFAULT_P;
745+
TABLE_NAME.dgemm_p = DGEMM_DEFAULT_P;
746+
TABLE_NAME.cgemm_p = CGEMM_DEFAULT_P;
747+
TABLE_NAME.zgemm_p = ZGEMM_DEFAULT_P;
748+
749+
TABLE_NAME.sgemm_r = SGEMM_DEFAULT_R;
750+
TABLE_NAME.dgemm_r = DGEMM_DEFAULT_R;
751+
TABLE_NAME.cgemm_r = CGEMM_DEFAULT_R;
752+
TABLE_NAME.zgemm_r = ZGEMM_DEFAULT_R;
753+
754+
755+
TABLE_NAME.sgemm_q = SGEMM_DEFAULT_Q;
756+
TABLE_NAME.dgemm_q = DGEMM_DEFAULT_Q;
757+
TABLE_NAME.cgemm_q = CGEMM_DEFAULT_Q;
758+
TABLE_NAME.zgemm_q = ZGEMM_DEFAULT_Q;
759+
}
760+
#else //ZARCH
761+
742762
#ifdef ARCH_X86
743763
static int get_l2_size_old(void){
744764
int i, eax, ebx, ecx, edx, cpuid_level;
@@ -1325,4 +1345,5 @@ static void init_parameter(void) {
13251345

13261346
}
13271347
#endif //POWER
1348+
#endif //ZARCH
13281349
#endif //defined(ARCH_ARM64)

kernel/zarch/KERNEL.Z13

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@ SGEMMINCOPY = ../generic/gemm_ncopy_8.c
9696
SGEMMITCOPY = ../generic/gemm_tcopy_8.c
9797
SGEMMONCOPY = ../generic/gemm_ncopy_4.c
9898
SGEMMOTCOPY = ../generic/gemm_tcopy_4.c
99-
SGEMMINCOPYOBJ = sgemm_incopy.o
100-
SGEMMITCOPYOBJ = sgemm_itcopy.o
101-
SGEMMONCOPYOBJ = sgemm_oncopy.o
102-
SGEMMOTCOPYOBJ = sgemm_otcopy.o
99+
SGEMMINCOPYOBJ = sgemm_incopy$(TSUFFIX).$(SUFFIX)
100+
SGEMMITCOPYOBJ = sgemm_itcopy$(TSUFFIX).$(SUFFIX)
101+
SGEMMONCOPYOBJ = sgemm_oncopy$(TSUFFIX).$(SUFFIX)
102+
SGEMMOTCOPYOBJ = sgemm_otcopy$(TSUFFIX).$(SUFFIX)
103103

104104

105105

@@ -108,16 +108,16 @@ DGEMMINCOPY = ../generic/gemm_ncopy_8.c
108108
DGEMMITCOPY = ../generic/gemm_tcopy_8.c
109109
DGEMMONCOPY = ../generic/gemm_ncopy_4.c
110110
DGEMMOTCOPY = ../generic/gemm_tcopy_4.c
111-
DGEMMINCOPYOBJ = dgemm_incopy.o
112-
DGEMMITCOPYOBJ = dgemm_itcopy.o
113-
DGEMMONCOPYOBJ = dgemm_oncopy.o
114-
DGEMMOTCOPYOBJ = dgemm_otcopy.o
111+
DGEMMINCOPYOBJ = dgemm_incopy$(TSUFFIX).$(SUFFIX)
112+
DGEMMITCOPYOBJ = dgemm_itcopy$(TSUFFIX).$(SUFFIX)
113+
DGEMMONCOPYOBJ = dgemm_oncopy$(TSUFFIX).$(SUFFIX)
114+
DGEMMOTCOPYOBJ = dgemm_otcopy$(TSUFFIX).$(SUFFIX)
115115

116116
CGEMMKERNEL = ctrmm4x4V.S
117117
CGEMMONCOPY = ../generic/zgemm_ncopy_4.c
118118
CGEMMOTCOPY = ../generic/zgemm_tcopy_4.c
119-
CGEMMONCOPYOBJ = cgemm_oncopy.o
120-
CGEMMOTCOPYOBJ = cgemm_otcopy.o
119+
CGEMMONCOPYOBJ = cgemm_oncopy$(TSUFFIX).$(SUFFIX)
120+
CGEMMOTCOPYOBJ = cgemm_otcopy$(TSUFFIX).$(SUFFIX)
121121

122122
ZGEMMKERNEL = ztrmm4x4V.S
123123
ZGEMMONCOPY = ../generic/zgemm_ncopy_4.c

kernel/zarch/KERNEL.Z14

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@ SGEMMINCOPY = ../generic/gemm_ncopy_8.c
9696
SGEMMITCOPY = ../generic/gemm_tcopy_8.c
9797
SGEMMONCOPY = ../generic/gemm_ncopy_4.c
9898
SGEMMOTCOPY = ../generic/gemm_tcopy_4.c
99-
SGEMMINCOPYOBJ = sgemm_incopy.o
100-
SGEMMITCOPYOBJ = sgemm_itcopy.o
101-
SGEMMONCOPYOBJ = sgemm_oncopy.o
102-
SGEMMOTCOPYOBJ = sgemm_otcopy.o
99+
SGEMMINCOPYOBJ = sgemm_incopy$(TSUFFIX).$(SUFFIX)
100+
SGEMMITCOPYOBJ = sgemm_itcopy$(TSUFFIX).$(SUFFIX)
101+
SGEMMONCOPYOBJ = sgemm_oncopy$(TSUFFIX).$(SUFFIX)
102+
SGEMMOTCOPYOBJ = sgemm_otcopy$(TSUFFIX).$(SUFFIX)
103103

104104

105105

@@ -108,16 +108,16 @@ DGEMMINCOPY = ../generic/gemm_ncopy_8.c
108108
DGEMMITCOPY = ../generic/gemm_tcopy_8.c
109109
DGEMMONCOPY = ../generic/gemm_ncopy_4.c
110110
DGEMMOTCOPY = ../generic/gemm_tcopy_4.c
111-
DGEMMINCOPYOBJ = dgemm_incopy.o
112-
DGEMMITCOPYOBJ = dgemm_itcopy.o
113-
DGEMMONCOPYOBJ = dgemm_oncopy.o
114-
DGEMMOTCOPYOBJ = dgemm_otcopy.o
111+
DGEMMINCOPYOBJ = dgemm_incopy$(TSUFFIX).$(SUFFIX)
112+
DGEMMITCOPYOBJ = dgemm_itcopy$(TSUFFIX).$(SUFFIX)
113+
DGEMMONCOPYOBJ = dgemm_oncopy$(TSUFFIX).$(SUFFIX)
114+
DGEMMOTCOPYOBJ = dgemm_otcopy$(TSUFFIX).$(SUFFIX)
115115

116116
CGEMMKERNEL = ctrmm4x4V.S
117117
CGEMMONCOPY = ../generic/zgemm_ncopy_4.c
118118
CGEMMOTCOPY = ../generic/zgemm_tcopy_4.c
119-
CGEMMONCOPYOBJ = cgemm_oncopy.o
120-
CGEMMOTCOPYOBJ = cgemm_otcopy.o
119+
CGEMMONCOPYOBJ = cgemm_oncopy$(TSUFFIX).$(SUFFIX)
120+
CGEMMOTCOPYOBJ = cgemm_otcopy$(TSUFFIX).$(SUFFIX)
121121

122122
ZGEMMKERNEL = ztrmm4x4V.S
123123
ZGEMMONCOPY = ../generic/zgemm_ncopy_4.c

kernel/zarch/KERNEL.ZARCH_GENERIC

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -94,26 +94,26 @@ ZTRMMKERNEL = ../generic/ztrmmkernel_2x2.c
9494
SGEMMKERNEL = ../generic/gemmkernel_2x2.c
9595
SGEMMONCOPY = ../generic/gemm_ncopy_2.c
9696
SGEMMOTCOPY = ../generic/gemm_tcopy_2.c
97-
SGEMMONCOPYOBJ = sgemm_oncopy.o
98-
SGEMMOTCOPYOBJ = sgemm_otcopy.o
97+
SGEMMONCOPYOBJ = sgemm_oncopy$(TSUFFIX).$(SUFFIX)
98+
SGEMMOTCOPYOBJ = sgemm_otcopy$(TSUFFIX).$(SUFFIX)
9999

100100
DGEMMKERNEL = ../generic/gemmkernel_2x2.c
101101
DGEMMONCOPY = ../generic/gemm_ncopy_2.c
102102
DGEMMOTCOPY = ../generic/gemm_tcopy_2.c
103-
DGEMMONCOPYOBJ = dgemm_oncopy.o
104-
DGEMMOTCOPYOBJ = dgemm_otcopy.o
103+
DGEMMONCOPYOBJ = dgemm_oncopy$(TSUFFIX).$(SUFFIX)
104+
DGEMMOTCOPYOBJ = dgemm_otcopy$(TSUFFIX).$(SUFFIX)
105105

106106
CGEMMKERNEL = ../generic/zgemmkernel_2x2.c
107107
CGEMMONCOPY = ../generic/zgemm_ncopy_2.c
108108
CGEMMOTCOPY = ../generic/zgemm_tcopy_2.c
109-
CGEMMONCOPYOBJ = cgemm_oncopy.o
110-
CGEMMOTCOPYOBJ = cgemm_otcopy.o
109+
CGEMMONCOPYOBJ = cgemm_oncopy$(TSUFFIX).$(SUFFIX)
110+
CGEMMOTCOPYOBJ = cgemm_otcopy$(TSUFFIX).$(SUFFIX)
111111

112112
ZGEMMKERNEL = ../generic/zgemmkernel_2x2.c
113113
ZGEMMONCOPY = ../generic/zgemm_ncopy_2.c
114114
ZGEMMOTCOPY = ../generic/zgemm_tcopy_2.c
115-
ZGEMMONCOPYOBJ = zgemm_oncopy.o
116-
ZGEMMOTCOPYOBJ = zgemm_otcopy.o
115+
ZGEMMONCOPYOBJ = zgemm_oncopy$(TSUFFIX).$(SUFFIX)
116+
ZGEMMOTCOPYOBJ = zgemm_otcopy$(TSUFFIX).$(SUFFIX)
117117

118118
STRSMKERNEL_LN = ../generic/trsm_kernel_LN.c
119119
STRSMKERNEL_LT = ../generic/trsm_kernel_LT.c

0 commit comments

Comments
 (0)