From d16261fbc67d08358bbe65a3aa7e34f9d3422597 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Sun, 25 Dec 2022 10:19:02 +0100 Subject: [PATCH 1/9] SVE-enabled targets in ARM64 DYNAMIC_ARCH require a recent compiler --- Makefile.system | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile.system b/Makefile.system index 4350165f5..ae62873f5 100644 --- a/Makefile.system +++ b/Makefile.system @@ -664,8 +664,10 @@ DYNAMIC_CORE += CORTEXA57 DYNAMIC_CORE += CORTEXA72 DYNAMIC_CORE += CORTEXA73 DYNAMIC_CORE += NEOVERSEN1 +ifeq ($(GCCVERSIONGTEQ10), 1) DYNAMIC_CORE += NEOVERSEV1 DYNAMIC_CORE += NEOVERSEN2 +endif DYNAMIC_CORE += CORTEXA55 DYNAMIC_CORE += FALKOR DYNAMIC_CORE += THUNDERX From 18cac5a34c6a590029ff698ff7d08aa213dc7c72 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Sun, 25 Dec 2022 10:25:13 +0100 Subject: [PATCH 2/9] SVE-enabled ARM64 targets in DYNAMIC_ARCH require a recent compiler --- cmake/arch.cmake | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/cmake/arch.cmake b/cmake/arch.cmake index f4a135e82..2865d36eb 100644 --- a/cmake/arch.cmake +++ b/cmake/arch.cmake @@ -44,9 +44,12 @@ endif () if (DYNAMIC_ARCH) if (ARM64) - set(DYNAMIC_CORE ARMV8 CORTEXA53 CORTEXA55 CORTEXA57 CORTEXA72 CORTEXA73 FALKOR THUNDERX THUNDERX2T99 TSV110 EMAG8180 NEOVERSEN1 NEOVERSEV1 NEOVERSEN2 THUNDERX3T110) + set(DYNAMIC_CORE ARMV8 CORTEXA53 CORTEXA55 CORTEXA57 CORTEXA72 CORTEXA73 FALKOR THUNDERX THUNDERX2T99 TSV110 EMAG8180 NEOVERSEN1 THUNDERX3T110) + if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER 9.99) + set(DYNAMIC_CORE "${DYNAMIC_CORE} NEOVERSEV1 NEOVERSEN2" + endif () if (DYNAMIC_LIST) - set(DYNAMIC_CORE ARMV8 ${DYNAMIC_LIST}) + set(DYNAMIC_CORE ARMV8 ${DYNAMIC_LIST}) endif () endif () From 5ddcc5ffa24478104c2d6b1a7fa9500d45719bcf Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Sun, 25 Dec 2022 10:37:39 +0100 Subject: [PATCH 3/9] Update arch.cmake --- cmake/arch.cmake | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmake/arch.cmake b/cmake/arch.cmake index 2865d36eb..c1f0d5f62 100644 --- a/cmake/arch.cmake +++ b/cmake/arch.cmake @@ -46,7 +46,7 @@ if (DYNAMIC_ARCH) if (ARM64) set(DYNAMIC_CORE ARMV8 CORTEXA53 CORTEXA55 CORTEXA57 CORTEXA72 CORTEXA73 FALKOR THUNDERX THUNDERX2T99 TSV110 EMAG8180 NEOVERSEN1 THUNDERX3T110) if (${CMAKE_C_COMPILER_VERSION} VERSION_GREATER 9.99) - set(DYNAMIC_CORE "${DYNAMIC_CORE} NEOVERSEV1 NEOVERSEN2" + set(DYNAMIC_CORE "${DYNAMIC_CORE} NEOVERSEV1 NEOVERSEN2") endif () if (DYNAMIC_LIST) set(DYNAMIC_CORE ARMV8 ${DYNAMIC_LIST}) From f07f4db1ce5ccdf22fa9c84ce5dc9e6ccbe0f9b1 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Sun, 25 Dec 2022 12:12:38 +0100 Subject: [PATCH 4/9] On ARM64, check for SVE support --- c_check | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/c_check b/c_check index d2bd47524..178e755fb 100755 --- a/c_check +++ b/c_check @@ -240,6 +240,21 @@ if [ "$architecture" = "riscv64" ]; then rm -rf "$tmpd" fi +no_sve=0 +if [ "$architecture" = "arm64" ]; then + tmpd=`mktemp -d` + tmpf="$tmpd/a.c" + printf "#include \n\n int main(void){}\n">> "$tmpf" + args=" -march=armv8-a+sve -c -o $tmpf.o $tmpf" + no_sve=0 + { + $compiler_name $flags $args >/dev/null 2>&1 + } || { + no_sve=1 + } + rm -rf "$tmpd" +fi + c11_atomics=0 case "$data" in *HAVE_C11*) @@ -379,6 +394,7 @@ done printf "HAVE_MSA=1\n" printf "MSA_FLAGS=%s\n" "$msa_flags" } + [ "$no_sve" -eq 1 ] && printf "NO_SVE=1\n" [ "$no_rv64gv" -eq 1 ] && printf "NO_RV64GV=1\n" [ "$no_avx512" -eq 1 ] && printf "NO_AVX512=1\n" [ "$no_avx2" -eq 1 ] && printf "NO_AVX2=1\n" From ca3b5ae3f0b20461db41d97b52fb3c8ecfcb569b Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Sun, 25 Dec 2022 12:19:20 +0100 Subject: [PATCH 5/9] Pass NO_SVE if set --- Makefile.system | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Makefile.system b/Makefile.system index ae62873f5..ccae33ca2 100644 --- a/Makefile.system +++ b/Makefile.system @@ -664,7 +664,7 @@ DYNAMIC_CORE += CORTEXA57 DYNAMIC_CORE += CORTEXA72 DYNAMIC_CORE += CORTEXA73 DYNAMIC_CORE += NEOVERSEN1 -ifeq ($(GCCVERSIONGTEQ10), 1) +ifneq ($(NO_SVE), 1) DYNAMIC_CORE += NEOVERSEV1 DYNAMIC_CORE += NEOVERSEN2 endif @@ -1384,6 +1384,10 @@ ifeq ($(NO_AVX512), 1) CCOMMON_OPT += -DNO_AVX512 endif +ifeq ($(NO_SVE), 1) +CCOMMON_OPT += -DNO_SVE +endif + ifdef SMP CCOMMON_OPT += -DSMP_SERVER From 186a310f920f8cbf21370bdaddcfbbd4ec56a94e Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Sun, 25 Dec 2022 12:22:48 +0100 Subject: [PATCH 6/9] Update dynamic_arm64.c --- driver/others/dynamic_arm64.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/driver/others/dynamic_arm64.c b/driver/others/dynamic_arm64.c index d88b1da40..55e507796 100644 --- a/driver/others/dynamic_arm64.c +++ b/driver/others/dynamic_arm64.c @@ -125,8 +125,10 @@ extern gotoblas_t gotoblas_THUNDERX2T99; extern gotoblas_t gotoblas_TSV110; extern gotoblas_t gotoblas_EMAG8180; extern gotoblas_t gotoblas_NEOVERSEN1; +#ifndef NO_SVE extern gotoblas_t gotoblas_NEOVERSEV1; extern gotoblas_t gotoblas_NEOVERSEN2; +#endif extern gotoblas_t gotoblas_THUNDERX3T110; extern gotoblas_t gotoblas_CORTEXA55; #endif @@ -274,10 +276,12 @@ static gotoblas_t *get_coretype(void) { return &gotoblas_CORTEXA73; case 0xd0c: // Neoverse N1 return &gotoblas_NEOVERSEN1; +#ifndef NO_SVE case 0xd49: return &gotoblas_NEOVERSEN2; case 0xd40: return &gotoblas_NEOVERSEV1; +#endif case 0xd05: // Cortex A55 return &gotoblas_CORTEXA55; } From 18c99d3e630d8392a85328ae10bcecb21f75b6c8 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Sun, 25 Dec 2022 13:31:38 +0100 Subject: [PATCH 7/9] Update dynamic_arm64.c --- driver/others/dynamic_arm64.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/driver/others/dynamic_arm64.c b/driver/others/dynamic_arm64.c index 55e507796..13d5d3731 100644 --- a/driver/others/dynamic_arm64.c +++ b/driver/others/dynamic_arm64.c @@ -128,6 +128,9 @@ extern gotoblas_t gotoblas_NEOVERSEN1; #ifndef NO_SVE extern gotoblas_t gotoblas_NEOVERSEV1; extern gotoblas_t gotoblas_NEOVERSEN2; +#else +#define gotoblas_NEOVERSEV1 gotoblas_ARMV8; +#define gotoblas_NEOVERSEN2 gotoblas_ARMV8; #endif extern gotoblas_t gotoblas_THUNDERX3T110; extern gotoblas_t gotoblas_CORTEXA55; @@ -239,7 +242,7 @@ static gotoblas_t *get_coretype(void) { p = (char *) NULL ; infile = fopen("/sys/devices/system/cpu/cpu0/regs/identification/midr_el1","r"); if (!infile) return NULL; - fgets(buffer, sizeof(buffer), infile); + (void)fgets(buffer, sizeof(buffer), infile); midr_el1=strtoul(buffer,NULL,16); fclose(infile); #else From 3e64fa72c4a9dc3c916b533c70783a860ac56638 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Thu, 29 Dec 2022 23:05:22 +0100 Subject: [PATCH 8/9] Settings from Makefile(_kernel).conf should be available to DYNAMIC_ARCH kernel builds --- Makefile.system | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Makefile.system b/Makefile.system index ccae33ca2..6e98b3fc8 100644 --- a/Makefile.system +++ b/Makefile.system @@ -284,8 +284,10 @@ GETARCH_FLAGS += -DHAVE_GAS=$(HAVE_GAS) # Generating Makefile.conf and config.h DUMMY := $(shell $(MAKE) -C $(TOPDIR) -f Makefile.prebuild CC="$(CC)" FC="$(FC)" HOSTCC="$(HOSTCC)" HOST_CFLAGS="$(GETARCH_FLAGS)" CFLAGS="$(CFLAGS)" BINARY=$(BINARY) USE_OPENMP=$(USE_OPENMP) DYNAMIC_ARCH=$(DYNAMIC_ARCH) TARGET_CORE=$(TARGET_CORE) ONLY_CBLAS=$(ONLY_CBLAS) TARGET=$(TARGET) all) +endif + ifndef TARGET_CORE -include $(TOPDIR)/Makefile.conf +-include $(TOPDIR)/Makefile.conf else HAVE_NEON= HAVE_VFP= @@ -306,7 +308,6 @@ HAVE_FMA3= include $(TOPDIR)/Makefile_kernel.conf endif -endif ifndef NUM_PARALLEL NUM_PARALLEL = 1 From d4868babbc7dd39307755b039a13d1f95f13c880 Mon Sep 17 00:00:00 2001 From: Martin Kroeker Date: Thu, 29 Dec 2022 23:07:55 +0100 Subject: [PATCH 9/9] Fix typos --- driver/others/dynamic_arm64.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/driver/others/dynamic_arm64.c b/driver/others/dynamic_arm64.c index 13d5d3731..0f47b287c 100644 --- a/driver/others/dynamic_arm64.c +++ b/driver/others/dynamic_arm64.c @@ -129,8 +129,8 @@ extern gotoblas_t gotoblas_NEOVERSEN1; extern gotoblas_t gotoblas_NEOVERSEV1; extern gotoblas_t gotoblas_NEOVERSEN2; #else -#define gotoblas_NEOVERSEV1 gotoblas_ARMV8; -#define gotoblas_NEOVERSEN2 gotoblas_ARMV8; +#define gotoblas_NEOVERSEV1 gotoblas_ARMV8 +#define gotoblas_NEOVERSEN2 gotoblas_ARMV8 #endif extern gotoblas_t gotoblas_THUNDERX3T110; extern gotoblas_t gotoblas_CORTEXA55; @@ -279,7 +279,7 @@ static gotoblas_t *get_coretype(void) { return &gotoblas_CORTEXA73; case 0xd0c: // Neoverse N1 return &gotoblas_NEOVERSEN1; -#ifndef NO_SVE +#ifndef NO_SVE case 0xd49: return &gotoblas_NEOVERSEN2; case 0xd40: