|
| 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 | +} |
0 commit comments