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] 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 ()