LoongArch64: Rename core
Use microarchitecture name instead of meaningless strings to name the core, the legacy core is still retained. 1. Rename LOONGSONGENERIC to LA64_GENERIC 2. Rename LOONGSON3R5 to LA464 3. Rename LOONGSON2K1000 to LA264
This commit is contained in:
@@ -1082,7 +1082,7 @@ if (buffer == NULL) {
|
||||
}
|
||||
|
||||
|
||||
//For target LOONGSON3R5, applying an offset to the buffer is essential
|
||||
//For LOONGARCH64, applying an offset to the buffer is essential
|
||||
//for minimizing cache conflicts and optimizing performance.
|
||||
#if defined(ARCH_LOONGARCH64) && !defined(NO_AFFINITY)
|
||||
if (sa == NULL) sa = (void *)((BLASLONG)buffer + (WhereAmI() & 0xf) * GEMM_OFFSET_A);
|
||||
|
||||
@@ -28,25 +28,36 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#include <sys/auxv.h>
|
||||
#include "common.h"
|
||||
|
||||
extern gotoblas_t gotoblas_LOONGSON3R5;
|
||||
extern gotoblas_t gotoblas_LOONGSON2K1000;
|
||||
extern gotoblas_t gotoblas_LOONGSONGENERIC;
|
||||
#define NUM_CORETYPES 6
|
||||
#define LOONGARCH_CFG0 0x00
|
||||
#define LA_HWCAP_LSX (1U << 4)
|
||||
#define LA_HWCAP_LASX (1U << 5)
|
||||
#define PRID_SERIES_MASK 0xf000
|
||||
#define PRID_SERIES_LA264 0xa000
|
||||
#define PRID_SERIES_LA364 0xb000
|
||||
#define PRID_SERIES_LA464 0xc000
|
||||
#define PRID_SERIES_LA664 0xd000
|
||||
|
||||
extern gotoblas_t gotoblas_LA64_GENERIC;
|
||||
extern gotoblas_t gotoblas_LA264;
|
||||
extern gotoblas_t gotoblas_LA464;
|
||||
|
||||
extern void openblas_warning(int verbose, const char * msg);
|
||||
|
||||
#define NUM_CORETYPES 3
|
||||
|
||||
static char *corename[] = {
|
||||
"loongson3r5",
|
||||
"loongson2k1000",
|
||||
"la64_generic",
|
||||
"la264",
|
||||
"la464",
|
||||
"loongsongeneric",
|
||||
"loongson2k1000",
|
||||
"loongson3r5",
|
||||
"unknown"
|
||||
};
|
||||
|
||||
char *gotoblas_corename(void) {
|
||||
if (gotoblas == &gotoblas_LOONGSON3R5) return corename[0];
|
||||
if (gotoblas == &gotoblas_LOONGSON2K1000) return corename[1];
|
||||
if (gotoblas == &gotoblas_LOONGSONGENERIC) return corename[2];
|
||||
if (gotoblas == &gotoblas_LA64_GENERIC) return corename[0];
|
||||
if (gotoblas == &gotoblas_LA264) return corename[1];
|
||||
if (gotoblas == &gotoblas_LA464) return corename[2];
|
||||
return corename[NUM_CORETYPES];
|
||||
}
|
||||
|
||||
@@ -66,27 +77,78 @@ static gotoblas_t *force_coretype(char *coretype) {
|
||||
|
||||
switch (found)
|
||||
{
|
||||
case 0: return (&gotoblas_LOONGSON3R5);
|
||||
case 1: return (&gotoblas_LOONGSON2K1000);
|
||||
case 2: return (&gotoblas_LOONGSONGENERIC);
|
||||
case 0: return (&gotoblas_LA64_GENERIC);
|
||||
case 1: return (&gotoblas_LA264);
|
||||
case 2: return (&gotoblas_LA464);
|
||||
case 3: return (&gotoblas_LA64_GENERIC);
|
||||
case 4: return (&gotoblas_LA264);
|
||||
case 5: return (&gotoblas_LA464);
|
||||
}
|
||||
snprintf(message, 128, "Core not found: %s\n", coretype);
|
||||
openblas_warning(1, message);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#define LA_HWCAP_LSX (1U << 4)
|
||||
#define LA_HWCAP_LASX (1U << 5)
|
||||
|
||||
static gotoblas_t *get_coretype(void) {
|
||||
int hwcap = (int)getauxval(AT_HWCAP);
|
||||
/* Detect whether the OS supports the LASX instruction set */
|
||||
static int os_support_lasx() {
|
||||
int hwcap = (int)getauxval(AT_HWCAP);
|
||||
|
||||
if (hwcap & LA_HWCAP_LASX)
|
||||
return &gotoblas_LOONGSON3R5;
|
||||
else if (hwcap & LA_HWCAP_LSX)
|
||||
return &gotoblas_LOONGSON2K1000;
|
||||
return 1;
|
||||
else
|
||||
return &gotoblas_LOONGSONGENERIC;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Detect whether the OS supports the LSX instruction set */
|
||||
static int os_support_lsx() {
|
||||
int hwcap = (int)getauxval(AT_HWCAP);
|
||||
|
||||
if (hwcap & LA_HWCAP_LSX)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
static uint32_t get_prid() {
|
||||
uint32_t reg = 0;
|
||||
__asm__ volatile (
|
||||
"cpucfg %0, %1 \n\t"
|
||||
: "+&r"(reg)
|
||||
: "r"(LOONGARCH_CFG0)
|
||||
);
|
||||
return reg;
|
||||
}
|
||||
|
||||
/* Select core at runtime based on the
|
||||
* cpu name and SIMD instructions supported
|
||||
* by the system
|
||||
*/
|
||||
static gotoblas_t *get_coretype(void) {
|
||||
uint32_t prid = get_prid();
|
||||
switch (prid & PRID_SERIES_MASK) {
|
||||
case (PRID_SERIES_LA464):
|
||||
case (PRID_SERIES_LA664):
|
||||
if (os_support_lasx())
|
||||
return &gotoblas_LA464;
|
||||
else if (os_support_lsx())
|
||||
return &gotoblas_LA264;
|
||||
else
|
||||
return &gotoblas_LA64_GENERIC;
|
||||
break;
|
||||
|
||||
case (PRID_SERIES_LA264):
|
||||
case (PRID_SERIES_LA364):
|
||||
if (os_support_lsx())
|
||||
return &gotoblas_LA264;
|
||||
else
|
||||
return &gotoblas_LA64_GENERIC;
|
||||
break;
|
||||
|
||||
default:
|
||||
return &gotoblas_LA64_GENERIC;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void gotoblas_dynamic_init(void) {
|
||||
|
||||
@@ -752,7 +752,7 @@ int get_L3_size() {
|
||||
}
|
||||
|
||||
void blas_set_parameter(void){
|
||||
#if defined(LOONGSON3R5)
|
||||
#if defined(LA464)
|
||||
int L3_size = get_L3_size();
|
||||
#ifdef SMP
|
||||
if(blas_num_threads == 1){
|
||||
|
||||
Reference in New Issue
Block a user