Setting DYNAMIC_ARCH=1 on POWER9 does not build POWER9 files due to some compiler version checks. This patch fixes some of the macros that are used to check compiler version. On fixing those checks, there are some new make failures related to icamin, icamax, isamin, isamax and caxpy files on POWER9. This patch fixes those failures as well.
111 lines
2.2 KiB
C
111 lines
2.2 KiB
C
|
|
#include "common.h"
|
|
|
|
extern gotoblas_t gotoblas_POWER6;
|
|
extern gotoblas_t gotoblas_POWER8;
|
|
#if (!defined __GNUC__) || ( __GNUC__ >= 6)
|
|
extern gotoblas_t gotoblas_POWER9;
|
|
#endif
|
|
|
|
extern void openblas_warning(int verbose, const char *msg);
|
|
|
|
static char *corename[] = {
|
|
"unknown",
|
|
"POWER6",
|
|
"POWER8",
|
|
"POWER9"
|
|
};
|
|
|
|
#define NUM_CORETYPES 4
|
|
|
|
char *gotoblas_corename(void) {
|
|
if (gotoblas == &gotoblas_POWER6) return corename[1];
|
|
if (gotoblas == &gotoblas_POWER8) return corename[2];
|
|
#if (!defined __GNUC__) || ( __GNUC__ >= 6)
|
|
if (gotoblas == &gotoblas_POWER9) return corename[3];
|
|
#endif
|
|
return corename[0];
|
|
}
|
|
|
|
static gotoblas_t *get_coretype(void) {
|
|
|
|
if (__builtin_cpu_is("power6") || __builtin_cpu_is("power6x"))
|
|
return &gotoblas_POWER6;
|
|
if (__builtin_cpu_is("power8"))
|
|
return &gotoblas_POWER8;
|
|
#if (!defined __GNUC__) || ( __GNUC__ >= 6)
|
|
if (__builtin_cpu_is("power9"))
|
|
return &gotoblas_POWER9;
|
|
#endif
|
|
return NULL;
|
|
}
|
|
|
|
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_POWER6);
|
|
case 2: return (&gotoblas_POWER8);
|
|
#if (!defined __GNUC__) || ( __GNUC__ >= 6)
|
|
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 POWER8 core\n");
|
|
openblas_warning(1, coremsg);
|
|
gotoblas = &gotoblas_POWER8;
|
|
}
|
|
|
|
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;
|
|
}
|