#include "common.h" extern gotoblas_t gotoblas_Z13; extern gotoblas_t gotoblas_Z14; //extern gotoblas_t gotoblas_Z15; //#if (!defined C_GCC) || (GCC_VERSION >= 60000) //extern gotoblas_t gotoblas_Z14; //#endif #define NUM_CORETYPES 4 extern void openblas_warning(int verbose, const char* msg); static char* corename[] = { "unknown", "Z13", "Z14", // "Z15", "ZARCH_GENERIC", }; char* gotoblas_corename(void) { if (gotoblas == &gotoblas_Z13) return corename[1]; if (gotoblas == &gotoblas_Z14) return corename[2]; // if (gotoblas == &gotoblas_Z15) return corename[3]; //#if (!defined C_GCC) || (GCC_VERSION >= 60000) // if (gotoblas == &gotoblas_POWER9) return corename[3]; //#endif return corename[0]; // try generic? } // __builtin_cpu_is is not supported by zarch static gotoblas_t* get_coretype(void) { FILE* infile; char buffer[512], * p; p = (char*)NULL; infile = fopen("/proc/sysinfo", "r"); while (fgets(buffer, sizeof(buffer), infile)) { if (!strncmp("Type", buffer, 4)) { p = strchr(buffer, ':') + 2; #if 0 fprintf(stderr, "%s\n", p); #endif break; } } fclose(infile); if (strstr(p, "2964")) return &gotoblas_Z13; if (strstr(p, "2965")) return &gotoblas_Z13; if (strstr(p, "3906")) return &gotoblas_Z14; if (strstr(p, "3907")) return &gotoblas_Z14; if (strstr(p, "8561")) return &gotoblas_Z14; // fallback z15 to z14 if (strstr(p, "8562")) return &gotoblas_Z14; // fallback z15 to z14 return NULL; // should be ZARCH_GENERIC } static gotoblas_t* force_coretype(char* coretype) { int i; int found = -1; char message[128]; for (i = 0; i < NUM_CORETYPES; i++) { if (!strncasecmp(coretype, corename[i], 20)) { found = i; break; } } switch (found) { case 1: return (&gotoblas_Z13); case 2: return (&gotoblas_Z14); // case 3: return (&gotoblas_Z15); //#if (!defined C_GCC) || (GCC_VERSION >= 60000) // case 3: return (&gotoblas_POWER9); //#endif default: return NULL; } snprintf(message, 128, "Core not found: %s\n", coretype); openblas_warning(1, message); } void gotoblas_dynamic_init(void) { char coremsg[128]; char coren[22]; char* p; if (gotoblas) return; p = getenv("OPENBLAS_CORETYPE"); if (p) { gotoblas = force_coretype(p); } else { gotoblas = get_coretype(); } if (gotoblas == NULL) { snprintf(coremsg, 128, "Falling back to Z14 core\n"); openblas_warning(1, coremsg); gotoblas = &gotoblas_Z14; } if (gotoblas && gotoblas->init) { strncpy(coren, gotoblas_corename(), 20); sprintf(coremsg, "Core: %s\n", coren); openblas_warning(2, coremsg); gotoblas->init(); } else { openblas_warning(0, "OpenBLAS : Architecture Initialization failed. No initialization function found.\n"); exit(1); } } void gotoblas_dynamic_quit(void) { gotoblas = NULL; }