From 214fbcee1549a152ec1a2ef21d3f00479f6cc299 Mon Sep 17 00:00:00 2001 From: Rafael Cardoso Fernandes Sousa Date: Thu, 9 Dec 2021 08:28:17 -0600 Subject: [PATCH 1/3] Fix cmake for power --- cmake/cc.cmake | 28 ++++++++++++++++++++++++++++ cmake/system.cmake | 34 ++++++++++++++++++++++++++++++++-- cmake/system_check.cmake | 6 +++--- driver/others/CMakeLists.txt | 2 ++ 4 files changed, 65 insertions(+), 5 deletions(-) diff --git a/cmake/cc.cmake b/cmake/cc.cmake index b28209c0c..06bc14986 100644 --- a/cmake/cc.cmake +++ b/cmake/cc.cmake @@ -161,6 +161,34 @@ if (${CORE} STREQUAL ARMV8SVE) endif () endif () +if (${CORE} STREQUAL POWER10) + if (NOT DYNAMIC_ARCH) + execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) + if (${GCC_VERSION} VERSION_GREATER 10.2 OR ${GCC_VERSION} VERSION_EQUAL 10.2) + set (CCOMMON_OPT "${CCOMMON_OPT} -mcpu=power10 -mtune=power10 -mvsx -fno-fast-math") + else () + message(FATAL_ERROR "Compiler GCC.${GCC_VERSION} does not support Power10." ) + endif() + endif () +endif () + +if (${CORE} STREQUAL POWER9) + if (NOT DYNAMIC_ARCH) + execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) + if (${GCC_VERSION} VERSION_GREATER 5.0 OR ${GCC_VERSION} VERSION_EQUAL 5.0) + set (CCOMMON_OPT "${CCOMMON_OPT} -mcpu=power9 -mtune=power9 -mvsx -fno-fast-math") + else () + set (CCOMMON_OPT "${CCOMMON_OPT} -mcpu=power8 -mtune=power8 -mvsx -fno-fast-math") + message(WARNING "Compiler GCC.${GCC_VERSION} does not fully support Power9.") + endif () + endif () +endif () + +if (${CORE} STREQUAL POWER8) + if (NOT DYNAMIC_ARCH) + set (CCOMMON_OPT "${CCOMMON_OPT} -mcpu=power8 -mtune=power8 -mvsx -fno-fast-math") + endif () +endif () if (NOT DYNAMIC_ARCH) if (HAVE_AVX2) diff --git a/cmake/system.cmake b/cmake/system.cmake index 410cf01e5..b4cce20f5 100644 --- a/cmake/system.cmake +++ b/cmake/system.cmake @@ -42,6 +42,9 @@ if (DEFINED BINARY AND DEFINED TARGET AND BINARY EQUAL 32) if (${TARGET} STREQUAL "ARMV8" OR ${TARGET} STREQUAL "CORTEXA57" OR ${TARGET} STREQUAL "CORTEXA53" OR ${TARGET} STREQUAL "CORTEXA55") set(TARGET "ARMV7") endif () + if (${TARGET} STREQUAL "POWER8" OR ${TARGET} STREQUAL "POWER9" OR ${TARGET} STREQUAL "POWER10") + set(TARGET "POWER6") + endif () endif () @@ -102,6 +105,12 @@ if (CMAKE_C_COMPILER STREQUAL loongcc) set(GETARCH_FLAGS "${GETARCH_FLAGS} -static") endif () +if (POWER) + set (NO_WARMUP 1) + execute_process(COMMAND bash -c "as -v < /dev/null 2>&1 | grep GNU 2>&1 >/dev/null" RESULT_VARIABLE HAVE_GAS) + set(GETARCH_FLAGS "${GETARCH_FLAGS} -DHAVE_GAS=${HAVE_GAS}") +endif() + #if don't use Fortran, it will only compile CBLAS. if (ONLY_CBLAS) set(NO_LAPACK 1) @@ -222,6 +231,27 @@ if (DEFINED TARGET) if (DEFINED HAVE_SSE4_1) set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -msse4.1") endif() + + if (${TARGET} STREQUAL POWER10) + execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) + if (${GCC_VERSION} VERSION_GREATER 10.2 OR ${GCC_VERSION} VERSION_EQUAL 10.2) + set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mcpu=power10 -mtune=power10 -mvsx -fno-fast-math") + else () + message(FATAL_ERROR "Compiler GCC.${GCC_VERSION} does not support Power10.") + endif() + endif() + if (${TARGET} STREQUAL POWER9) + execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION) + if (${GCC_VERSION} VERSION_GREATER 5.0 OR ${GCC_VERSION} VERSION_EQUAL 5.0) + set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mcpu=power9 -mtune=power9 -mvsx -fno-fast-math") + else () + set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mcpu=power8 -mtune=power8 -mvsx -fno-fast-math") + message(WARNING "Compiler GCC.${GCC_VERSION} does not support fully Power9.") + endif() + endif() + if (${TARGET} STREQUAL POWER8) + set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mcpu=power8 -mtune=power8 -mvsx -fno-fast-math") + endif() endif() if (DEFINED BINARY) message(STATUS "Compiling a ${BINARY}-bit binary.") @@ -279,7 +309,7 @@ if (NEED_PIC) endif() endif () -if (X86_64) +if (X86_64 OR ${CORE} STREQUAL POWER10) set(SMALL_MATRIX_OPT TRUE) endif () if (SMALL_MATRIX_OPT) @@ -287,7 +317,7 @@ if (SMALL_MATRIX_OPT) endif () if (DYNAMIC_ARCH) - if (X86 OR X86_64 OR ARM64 OR PPC) + if (X86 OR X86_64 OR ARM64 OR POWER) set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_ARCH") if (DYNAMIC_OLDER) set(CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_OLDER") diff --git a/cmake/system_check.cmake b/cmake/system_check.cmake index f71ec4555..86ce3dfb0 100644 --- a/cmake/system_check.cmake +++ b/cmake/system_check.cmake @@ -35,7 +35,7 @@ if(CMAKE_CL_64 OR MINGW64) elseif(MINGW OR (MSVC AND NOT CMAKE_CROSSCOMPILING)) set(X86 1) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc.*|power.*|Power.*") - set(PPC 1) + set(POWER 1) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "mips64.*") set(MIPS64 1) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "loongarch64.*") @@ -88,7 +88,7 @@ if (X86_64) set(ARCH "x86_64") elseif(X86) set(ARCH "x86") -elseif(PPC) +elseif(POWER) set(ARCH "power") elseif(MIPS32) set(ARCH "mips") @@ -103,7 +103,7 @@ else() endif () if (NOT BINARY) - if (X86_64 OR ARM64 OR PPC OR MIPS64 OR LOONGARCH64) + if (X86_64 OR ARM64 OR POWER OR MIPS64 OR LOONGARCH64) set(BINARY 64) else () set(BINARY 32) diff --git a/driver/others/CMakeLists.txt b/driver/others/CMakeLists.txt index a07e00b3b..1a38740a3 100644 --- a/driver/others/CMakeLists.txt +++ b/driver/others/CMakeLists.txt @@ -49,6 +49,8 @@ GenerateNamedObjects("openblas_get_config.c;openblas_get_parallel.c" "" "" 0 "" if (DYNAMIC_ARCH) if (ARM64) list(APPEND COMMON_SOURCES dynamic_arm64.c) + elseif (POWER) + list(APPEND COMMON_SOURCES dynamic_power.c) else () list(APPEND COMMON_SOURCES dynamic.c) endif () From 23a756135388d919b3dbdcc026e4c961f6db7ef6 Mon Sep 17 00:00:00 2001 From: Rafael Cardoso Fernandes Sousa Date: Thu, 9 Dec 2021 09:57:39 -0600 Subject: [PATCH 2/3] Fix error cmake (small kernels) --- kernel/CMakeLists.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index d49b4ea64..9849ddc93 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -596,11 +596,11 @@ endif () GenerateNamedObjects("${KERNELDIR}/${${float_char}GEMM_SMALL_K_NN}" "" "gemm_small_kernel_nn" false "" "" false ${float_type}) GenerateNamedObjects("${KERNELDIR}/${${float_char}GEMM_SMALL_K_NT}" "" "gemm_small_kernel_nt" false "" "" false ${float_type}) GenerateNamedObjects("${KERNELDIR}/${${float_char}GEMM_SMALL_K_TN}" "" "gemm_small_kernel_tn" false "" "" false ${float_type}) - GenerateNamedObjects("${KERNELDIR}/${${float_char}GEMM_SMALL_K_NT}" "" "gemm_small_kernel_tt" false "" "" false ${float_type}) + GenerateNamedObjects("${KERNELDIR}/${${float_char}GEMM_SMALL_K_TT}" "" "gemm_small_kernel_tt" false "" "" false ${float_type}) GenerateNamedObjects("${KERNELDIR}/${${float_char}GEMM_SMALL_K_B0_NN}" "B0" "gemm_small_kernel_b0_nn" false "" "" false ${float_type}) GenerateNamedObjects("${KERNELDIR}/${${float_char}GEMM_SMALL_K_B0_NT}" "B0" "gemm_small_kernel_b0_nt" false "" "" false ${float_type}) GenerateNamedObjects("${KERNELDIR}/${${float_char}GEMM_SMALL_K_B0_TN}" "B0" "gemm_small_kernel_b0_tn" false "" "" false ${float_type}) - GenerateNamedObjects("${KERNELDIR}/${${float_char}GEMM_SMALL_K_B0_NT}" "B0" "gemm_small_kernel_b0_tt" false "" "" false ${float_type}) + GenerateNamedObjects("${KERNELDIR}/${${float_char}GEMM_SMALL_K_B0_TT}" "B0" "gemm_small_kernel_b0_tt" false "" "" false ${float_type}) endif () if (BUILD_BFLOAT16) if (NOT DEFINED SBGEMM_SMALL_M_PERMIT) @@ -634,11 +634,11 @@ endif () GenerateNamedObjects("${KERNELDIR}/${SBGEMM_SMALL_K_NN}" "" "gemm_small_kernel_nn" false "" "" false "BFLOAT16") GenerateNamedObjects("${KERNELDIR}/${SBGEMM_SMALL_K_NT}" "" "gemm_small_kernel_nt" false "" "" false "BFLOAT16") GenerateNamedObjects("${KERNELDIR}/${SBGEMM_SMALL_K_TN}" "" "gemm_small_kernel_tn" false "" "" false "BFLOAT16") - GenerateNamedObjects("${KERNELDIR}/${SBGEMM_SMALL_K_NT}" "" "gemm_small_kernel_tt" false "" "" false "BFLOAT16") + GenerateNamedObjects("${KERNELDIR}/${SBGEMM_SMALL_K_TT}" "" "gemm_small_kernel_tt" false "" "" false "BFLOAT16") GenerateNamedObjects("${KERNELDIR}/${SBGEMM_SMALL_K_B0_NN}" "B0" "gemm_small_kernel_b0_nn" false "" "" false "BFLOAT16") GenerateNamedObjects("${KERNELDIR}/${SBGEMM_SMALL_K_B0_NT}" "B0" "gemm_small_kernel_b0_nt" false "" "" false "BFLOAT16") GenerateNamedObjects("${KERNELDIR}/${SBGEMM_SMALL_K_B0_TN}" "B0" "gemm_small_kernel_b0_tn" false "" "" false "BFLOAT16") - GenerateNamedObjects("${KERNELDIR}/${SBGEMM_SMALL_K_B0_NT}" "B0" "gemm_small_kernel_b0_tt" false "" "" false "BFLOAT16") + GenerateNamedObjects("${KERNELDIR}/${SBGEMM_SMALL_K_B0_TT}" "B0" "gemm_small_kernel_b0_tt" false "" "" false "BFLOAT16") endif () endif () From d38110a5cee593feb96e851d65e77e49c48c3702 Mon Sep 17 00:00:00 2001 From: Rafael Cardoso Fernandes Sousa Date: Fri, 10 Dec 2021 17:35:28 -0600 Subject: [PATCH 3/3] Use CMake variables instead of as --- cmake/system.cmake | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/cmake/system.cmake b/cmake/system.cmake index b4cce20f5..e0e92bde7 100644 --- a/cmake/system.cmake +++ b/cmake/system.cmake @@ -106,10 +106,16 @@ if (CMAKE_C_COMPILER STREQUAL loongcc) endif () if (POWER) - set (NO_WARMUP 1) - execute_process(COMMAND bash -c "as -v < /dev/null 2>&1 | grep GNU 2>&1 >/dev/null" RESULT_VARIABLE HAVE_GAS) - set(GETARCH_FLAGS "${GETARCH_FLAGS} -DHAVE_GAS=${HAVE_GAS}") -endif() + set(NO_WARMUP 1) + set(HAVE_GAS 1) + if (CMAKE_ASM_COMPILER_ID STREQUAL "GNU") + set(HAVE_GAS 0) + elseif (CMAKE_ASM_COMPILER_ID STREQUAL "Clang") + set(CCOMMON_OPT "${CCOMMON_OPT} -fno-integrated-as") + set(HAVE_GAS 0) + endif () + set(GETARCH_FLAGS "${GETARCH_FLAGS} -DHAVE_GAS=${HAVE_GAS}") +endif () #if don't use Fortran, it will only compile CBLAS. if (ONLY_CBLAS)