2025-07-24 19:30:43 +08:00
###############################################################################
# Copyright (c) 2025, The OpenBLAS Project
# All rights reserved.
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
# 3. Neither the name of the OpenBLAS project nor the names of
# its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED. IN NO EVENT SHALL THE OPENBLAS PROJECT OR CONTRIBUTORS BE
# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
###############################################################################
2014-12-31 11:53:00 +08:00
##
## Author: Hank Anderson <hank@statease.com>
## Description: Ported from OpenBLAS/Makefile.system
##
2016-05-25 15:13:28 +08:00
set ( NETLIB_LAPACK_DIR "${PROJECT_SOURCE_DIR}/lapack-netlib" )
2014-12-31 11:53:00 +08:00
2017-08-20 22:37:29 +08:00
# System detection, via CMake.
include ( "${PROJECT_SOURCE_DIR}/cmake/system_check.cmake" )
if ( CMAKE_CROSSCOMPILING AND NOT DEFINED TARGET )
# Detect target without running getarch
if ( ARM64 )
set ( TARGET "ARMV8" )
elseif ( ARM )
set ( TARGET "ARMV7" ) # TODO: Ask compiler which arch this is
else ( )
message ( FATAL_ERROR "When cross compiling, a TARGET is required." )
endif ( )
endif ( )
# Other files expect CORE, which is actually TARGET and will become TARGET_CORE for kernel build. Confused yet?
# It seems we are meant to use TARGET as input and CORE internally as kernel.
if ( NOT DEFINED CORE AND DEFINED TARGET )
2024-12-05 14:11:05 +08:00
if ( ${ TARGET } STREQUAL "LOONGSON3R5" )
set ( CORE "LA464" )
elseif ( ${ TARGET } STREQUAL "LOONGSON2K1000" )
set ( CORE "LA264" )
elseif ( ${ TARGET } STREQUAL "LOONGSONGENERIC" )
set ( CORE "LA64_GENERIC)" )
else ( )
set ( CORE ${ TARGET } )
endif ( )
2017-08-20 22:37:29 +08:00
endif ( )
2014-12-31 11:53:00 +08:00
# TARGET_CORE will override TARGET which is used in DYNAMIC_ARCH=1.
if ( DEFINED TARGET_CORE )
set ( TARGET ${ TARGET_CORE } )
endif ( )
# Force fallbacks for 32bit
if ( DEFINED BINARY AND DEFINED TARGET AND BINARY EQUAL 32 )
message ( STATUS "Compiling a ${BINARY}-bit binary." )
set ( NO_AVX 1 )
2021-09-03 15:39:50 +08:00
if ( ${ TARGET } STREQUAL "HASWELL" OR ${ TARGET } STREQUAL "SANDYBRIDGE" OR ${ TARGET } STREQUAL "SKYLAKEX" OR ${ TARGET } STREQUAL "COOPERLAKE" OR ${ TARGET } STREQUAL "SAPPHIRERAPIDS" )
2014-12-31 11:53:00 +08:00
set ( TARGET "NEHALEM" )
endif ( )
2017-03-19 22:32:50 +08:00
if ( ${ TARGET } STREQUAL "BULLDOZER" OR ${ TARGET } STREQUAL "PILEDRIVER" OR ${ TARGET } STREQUAL "ZEN" )
2014-12-31 11:53:00 +08:00
set ( TARGET "BARCELONA" )
endif ( )
2021-06-20 21:32:42 +08:00
if ( ${ TARGET } STREQUAL "ARMV8" OR ${ TARGET } STREQUAL "CORTEXA57" OR ${ TARGET } STREQUAL "CORTEXA53" OR ${ TARGET } STREQUAL "CORTEXA55" )
2019-01-27 00:52:33 +08:00
set ( TARGET "ARMV7" )
endif ( )
2021-12-09 22:28:17 +08:00
if ( ${ TARGET } STREQUAL "POWER8" OR ${ TARGET } STREQUAL "POWER9" OR ${ TARGET } STREQUAL "POWER10" )
set ( TARGET "POWER6" )
endif ( )
2014-12-31 11:53:00 +08:00
endif ( )
2018-10-11 01:22:01 +08:00
2014-12-31 11:53:00 +08:00
if ( DEFINED TARGET )
2020-11-08 03:26:12 +08:00
message ( STATUS "-- -- -- -- -- -- -- -- -- -- -- -- --" )
2017-08-17 15:27:01 +08:00
message ( STATUS "Targeting the ${TARGET} architecture." )
2014-12-31 11:53:00 +08:00
set ( GETARCH_FLAGS "-DFORCE_${TARGET}" )
endif ( )
2019-05-04 03:07:14 +08:00
# On x86_64 build getarch with march=native. This is required to detect AVX512 support in getarch.
2023-06-10 01:01:15 +08:00
if ( X86_64 AND NOT ( ${ CMAKE_C_COMPILER_ID } STREQUAL "PGI" OR ${ CMAKE_C_COMPILER_ID } STREQUAL "NVHPC" ) )
2019-05-04 03:07:14 +08:00
set ( GETARCH_FLAGS "${GETARCH_FLAGS} -march=native" )
endif ( )
2019-07-06 21:02:39 +08:00
# On x86 no AVX support is available
if ( X86 OR X86_64 )
if ( ( DEFINED BINARY AND BINARY EQUAL 32 ) OR ( "$CMAKE_SIZEOF_VOID_P}" EQUAL "4" ) )
set ( GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX -DNO_AVX2 -DNO_AVX512" )
endif ( )
endif ( )
2015-02-16 07:44:37 +08:00
if ( INTERFACE64 )
2014-12-31 11:53:00 +08:00
message ( STATUS "Using 64-bit integers." )
set ( GETARCH_FLAGS "${GETARCH_FLAGS} -DUSE64BITINT" )
endif ( )
if ( NOT DEFINED GEMM_MULTITHREAD_THRESHOLD )
set ( GEMM_MULTITHREAD_THRESHOLD 4 )
endif ( )
message ( STATUS "GEMM multithread threshold set to ${GEMM_MULTITHREAD_THRESHOLD}." )
set ( GETARCH_FLAGS "${GETARCH_FLAGS} -DGEMM_MULTITHREAD_THRESHOLD=${GEMM_MULTITHREAD_THRESHOLD}" )
2015-02-16 07:44:37 +08:00
if ( NO_AVX )
2014-12-31 11:53:00 +08:00
message ( STATUS "Disabling Advanced Vector Extensions (AVX)." )
set ( GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX" )
endif ( )
2015-02-16 07:44:37 +08:00
if ( NO_AVX2 )
2014-12-31 11:53:00 +08:00
message ( STATUS "Disabling Advanced Vector Extensions 2 (AVX2)." )
set ( GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX2" )
endif ( )
2020-09-01 23:19:14 +08:00
if ( NO_AVX512 )
message ( STATUS "Disabling Advanced Vector Extensions 512 (AVX512)." )
set ( GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX512" )
endif ( )
2017-08-16 22:35:54 +08:00
if ( CMAKE_BUILD_TYPE STREQUAL "Debug" )
2017-08-17 01:32:04 +08:00
set ( GETARCH_FLAGS "${GETARCH_FLAGS} ${CMAKE_C_FLAGS_DEBUG}" )
2014-12-31 11:53:00 +08:00
endif ( )
if ( NOT DEFINED NO_PARALLEL_MAKE )
set ( NO_PARALLEL_MAKE 0 )
endif ( )
set ( GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_PARALLEL_MAKE=${NO_PARALLEL_MAKE}" )
2017-08-20 22:37:29 +08:00
if ( CMAKE_C_COMPILER STREQUAL loongcc )
2014-12-31 11:53:00 +08:00
set ( GETARCH_FLAGS "${GETARCH_FLAGS} -static" )
endif ( )
2021-12-09 22:28:17 +08:00
if ( POWER )
2021-12-11 07:35:28 +08:00
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 ( )
2021-12-09 22:28:17 +08:00
2014-12-31 11:53:00 +08:00
#if don't use Fortran, it will only compile CBLAS.
2015-02-04 05:09:37 +08:00
if ( ONLY_CBLAS )
2014-12-31 11:53:00 +08:00
set ( NO_LAPACK 1 )
else ( )
set ( ONLY_CBLAS 0 )
endif ( )
2017-08-17 00:04:36 +08:00
# N.B. this is NUM_THREAD in Makefile.system which is probably a bug -hpa
2017-08-17 01:32:04 +08:00
if ( NOT CMAKE_CROSSCOMPILING )
if ( NOT DEFINED NUM_CORES )
include ( ProcessorCount )
ProcessorCount ( NUM_CORES )
endif ( )
2017-12-01 15:39:46 +08:00
endif ( )
2018-04-24 10:34:53 +08:00
if ( NOT DEFINED NUM_PARALLEL )
set ( NUM_PARALLEL 1 )
endif ( )
2017-12-01 15:39:46 +08:00
if ( NOT DEFINED NUM_THREADS )
2018-02-28 08:25:25 +08:00
if ( DEFINED NUM_CORES AND NOT NUM_CORES EQUAL 0 )
2017-08-20 22:37:29 +08:00
# HT?
2017-08-17 01:32:04 +08:00
set ( NUM_THREADS ${ NUM_CORES } )
2017-12-01 15:39:46 +08:00
else ( )
set ( NUM_THREADS 0 )
2017-08-17 01:32:04 +08:00
endif ( )
endif ( )
2014-12-31 11:53:00 +08:00
2017-08-17 01:32:04 +08:00
if ( ${ NUM_THREADS } LESS 2 )
2014-12-31 11:53:00 +08:00
set ( USE_THREAD 0 )
2017-08-17 00:04:36 +08:00
elseif ( NOT DEFINED USE_THREAD )
set ( USE_THREAD 1 )
2014-12-31 11:53:00 +08:00
endif ( )
2017-08-17 00:04:36 +08:00
if ( USE_THREAD )
2017-08-17 01:32:04 +08:00
message ( STATUS "Multi-threading enabled with ${NUM_THREADS} threads." )
2019-05-16 05:19:30 +08:00
else ( )
if ( ${ USE_LOCKING } )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DUSE_LOCKING" )
endif ( )
2014-12-31 11:53:00 +08:00
endif ( )
2024-05-01 01:05:18 +08:00
if ( C_LAPACK )
if ( ${ CMAKE_C_COMPILER_ID } STREQUAL "GNU" )
set ( CCOMMON_OPT "${CCOMMON_OPT} -Wno-error=incompatible-pointer-types" )
endif ( )
endif ( )
2017-08-20 18:08:53 +08:00
include ( "${PROJECT_SOURCE_DIR}/cmake/prebuild.cmake" )
2020-11-08 03:26:12 +08:00
if ( DEFINED TARGET )
if ( ${ TARGET } STREQUAL COOPERLAKE AND NOT NO_AVX512 )
2021-02-02 02:45:25 +08:00
if ( ${ CMAKE_C_COMPILER_ID } STREQUAL "GNU" )
2021-02-02 03:18:53 +08:00
if ( ${ CMAKE_C_COMPILER_VERSION } VERSION_GREATER 10.09 )
2020-11-08 03:26:12 +08:00
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=cooperlake" )
else ( )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512" )
endif ( )
2021-02-02 17:53:46 +08:00
elseif ( ${ CMAKE_C_COMPILER_ID } STREQUAL "Clang" OR ${ CMAKE_C_COMPILER_ID } STREQUAL "AppleClang" )
2021-02-02 02:45:25 +08:00
if ( ${ CMAKE_C_COMPILER_VERSION } VERSION_GREATER 8.99 )
2024-04-06 12:54:48 +08:00
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=cooperlake -mllvm -exhaustive-register-search" )
2020-11-08 03:26:12 +08:00
else ( )
2024-04-06 12:54:48 +08:00
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512 -mllvm -exhaustive-register-search" )
2020-11-08 03:26:12 +08:00
endif ( )
2021-02-02 02:45:25 +08:00
endif ( )
2020-11-08 03:26:12 +08:00
endif ( )
2021-09-03 15:39:50 +08:00
if ( ${ TARGET } STREQUAL SAPPHIRERAPIDS AND NOT NO_AVX512 )
if ( ${ CMAKE_C_COMPILER_ID } STREQUAL "GNU" )
if ( ${ CMAKE_C_COMPILER_VERSION } VERSION_GREATER 11.0 )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=sapphirerapids" )
else ( )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512" )
endif ( )
elseif ( ${ CMAKE_C_COMPILER_ID } STREQUAL "Clang" OR ${ CMAKE_C_COMPILER_ID } STREQUAL "AppleClang" )
if ( ${ CMAKE_C_COMPILER_VERSION } VERSION_GREATER 12.0 )
2024-04-06 12:54:48 +08:00
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=sapphirerapids -mllvm -exhaustive-register-search" )
2021-09-03 15:39:50 +08:00
else ( )
2024-04-06 12:54:48 +08:00
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512 -mllvm -exhaustive-register-search" )
2021-09-03 15:39:50 +08:00
endif ( )
endif ( )
endif ( )
2020-11-08 03:26:12 +08:00
if ( ${ TARGET } STREQUAL SKYLAKEX AND NOT NO_AVX512 )
2023-02-03 02:04:05 +08:00
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512" )
2023-03-18 04:22:37 +08:00
if ( ${ CMAKE_C_COMPILER_ID } STREQUAL "Clang" OR ${ CMAKE_C_COMPILER_ID } STREQUAL "AppleClang" )
2024-04-06 12:54:48 +08:00
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mllvm -exhaustive-register-search" )
2023-03-18 04:22:37 +08:00
endif ( )
2020-11-08 03:26:12 +08:00
endif ( )
2023-02-03 02:04:05 +08:00
if ( ( ( ${ TARGET } STREQUAL ZEN ) AND HAVE_AVX512VL ) AND NOT NO_AVX512 )
if ( ${ CMAKE_C_COMPILER_ID } STREQUAL "GNU" )
if ( ${ CMAKE_C_COMPILER_VERSION } VERSION_GREATER 12.99 )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=znver4" )
else ( )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512" )
endif ( )
elseif ( ${ CMAKE_C_COMPILER_ID } STREQUAL "Clang" OR ${ CMAKE_C_COMPILER_ID } STREQUAL "AppleClang" )
if ( ${ CMAKE_C_COMPILER_VERSION } VERSION_GREATER 15.99 )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=znver4" )
else ( )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=skylake-avx512" )
endif ( )
2024-04-06 12:54:48 +08:00
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mllvm -exhaustive-register-search" )
2023-02-03 02:04:05 +08:00
endif ( )
endif ( )
if ( ( ${ TARGET } STREQUAL HASWELL OR ( ${ TARGET } STREQUAL ZEN AND NOT HAVE_AVX512VL ) ) AND NOT NO_AVX2 )
2020-11-08 03:26:12 +08:00
if ( ${ CMAKE_C_COMPILER_ID } STREQUAL "GNU" )
2024-05-16 15:25:53 +08:00
if ( CMAKE_C_COMPILER_VERSION VERSION_GREATER 4.7 OR CMAKE_C_COMPILER_VERSION VERSION_EQUAL 4.7 )
2020-11-08 03:26:12 +08:00
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mavx2" )
endif ( )
elseif ( ${ CMAKE_C_COMPILER_ID } STREQUAL "CLANG" )
2022-09-14 04:47:00 +08:00
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mavx2 -mfma" )
2020-11-08 03:26:12 +08:00
endif ( )
endif ( )
if ( DEFINED HAVE_AVX )
if ( NOT NO_AVX )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mavx" )
endif ( )
endif ( )
if ( DEFINED HAVE_AVX2 )
if ( NOT NO_AVX2 )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mavx2" )
endif ( )
endif ( )
2021-07-22 18:00:03 +08:00
# if (DEFINED HAVE_FMA3)
# if (NOT NO_AVX2)
# set (KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mfma")
# endif()
# endif()
2020-11-08 03:26:12 +08:00
if ( DEFINED HAVE_SSE )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -msse" )
endif ( )
if ( DEFINED HAVE_SSE2 )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -msse2" )
endif ( )
if ( DEFINED HAVE_SSE3 )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -msse3" )
endif ( )
if ( DEFINED HAVE_SSSE3 )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mssse3" )
endif ( )
if ( DEFINED HAVE_SSE4_1 )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -msse4.1" )
endif ( )
2021-12-09 22:28:17 +08:00
if ( ${ TARGET } STREQUAL POWER10 )
2024-08-10 02:38:05 +08:00
if ( CMAKE_C_COMPILER_VERSION VERSION_GREATER 10.2 OR CMAKE_C_COMPILER_VERSION VERSION_EQUAL 10.2 )
2021-12-09 22:28:17 +08:00
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mcpu=power10 -mtune=power10 -mvsx -fno-fast-math" )
else ( )
2024-05-16 05:58:14 +08:00
message ( FATAL_ERROR "Compiler GCC ${CMAKE_C_COMPILER_VERSION} does not support Power10." )
2021-12-09 22:28:17 +08:00
endif ( )
endif ( )
if ( ${ TARGET } STREQUAL POWER9 )
2024-05-16 05:58:14 +08:00
if ( CMAKE_C_COMPILER_VERSION VERSION_GREATER 5.0 OR CMAKE_C_COMPILER_VERSION VERSION_EQUAL 5.0 )
2021-12-09 22:28:17 +08:00
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" )
2024-05-16 05:58:14 +08:00
message ( WARNING "Compiler GCC ${CMAKE_C_COMPILER_VERSION} does not support fully Power9." )
2021-12-09 22:28:17 +08:00
endif ( )
endif ( )
if ( ${ TARGET } STREQUAL POWER8 )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mcpu=power8 -mtune=power8 -mvsx -fno-fast-math" )
endif ( )
2023-07-05 15:47:49 +08:00
2025-09-10 04:18:51 +08:00
if ( ${ TARGET } STREQUAL Z13 )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=z13 -mzvector" )
endif ( )
if ( ${ TARGET } STREQUAL Z14 )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=z14 -mzvector" )
endif ( )
2023-07-05 15:47:49 +08:00
if ( ${ TARGET } STREQUAL NEOVERSEV1 )
2023-08-25 23:11:04 +08:00
if ( ${ CMAKE_C_COMPILER_ID } STREQUAL "PGI" AND NOT NO_SVE )
2025-07-07 19:26:36 +08:00
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -Msve_intrinsics -march=armv8.4-a+sve+bf16 -mtune=neoverse-v1" )
2023-08-25 23:11:04 +08:00
else ( )
2024-05-16 05:58:14 +08:00
if ( CMAKE_C_COMPILER_VERSION VERSION_GREATER 10.4 OR CMAKE_C_COMPILER_VERSION VERSION_EQUAL 10.4 )
2025-07-07 19:26:36 +08:00
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv8.4-a+sve+bf16 -mtune=neoverse-v1" )
2023-07-05 15:47:49 +08:00
else ( )
2024-05-16 05:58:14 +08:00
message ( FATAL_ERROR "Compiler ${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_VERSION} does not support Neoverse V1." )
2023-07-05 15:47:49 +08:00
endif ( )
2023-08-25 23:11:04 +08:00
endif ( )
2023-07-05 15:47:49 +08:00
endif ( )
if ( ${ TARGET } STREQUAL NEOVERSEN2 )
2023-08-25 23:11:04 +08:00
if ( ${ CMAKE_C_COMPILER_ID } STREQUAL "PGI" AND NOT NO_SVE )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -Msve-intrinsics -march=armv8.5-a+sve+sve2+bf16 -mtune=neoverse-n2" )
else ( )
2024-05-16 05:58:14 +08:00
if ( CMAKE_C_COMPILER_VERSION VERSION_GREATER 10.4 OR CMAKE_C_COMPILER_VERSION VERSION_EQUAL 10.4 )
2023-07-05 15:47:49 +08:00
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv8.5-a+sve+sve2+bf16 -mtune=neoverse-n2" )
else ( )
2024-05-16 05:58:14 +08:00
message ( FATAL_ERROR "Compiler $${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_VERSION} does not support Neoverse N2." )
2023-07-05 15:47:49 +08:00
endif ( )
2023-08-25 23:11:04 +08:00
endif ( )
2023-07-05 15:47:49 +08:00
endif ( )
2025-07-25 21:43:37 +08:00
if ( ${ TARGET } STREQUAL NEOVERSEV2 )
2025-07-24 19:30:43 +08:00
if ( ${ CMAKE_C_COMPILER_ID } STREQUAL "PGI" AND NOT NO_SVE )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -Msve-intrinsics -march=armv9-a+sve+sve2+bf16 -mtune=neoverse-v2" )
else ( )
if ( CMAKE_C_COMPILER_VERSION VERSION_GREATER 13.0 OR CMAKE_C_COMPILER_VERSION VERSION_EQUAL 13.0 )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -mcpu=neoverse-v2" )
elseif ( CMAKE_C_COMPILER_VERSION VERSION_GREATER 10.4 OR CMAKE_C_COMPILER_VERSION VERSION_EQUAL 10.4 )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv8.4-a+sve+bf16 -mtune=neoverse-v1" )
else ( )
2025-07-25 21:43:37 +08:00
message ( FATAL_ERROR "Compiler $${CMAKE_C_COMPILER} ${CMAKE_C_COMPILER_VERSION} does not support Neoverse V2." )
2025-07-24 19:30:43 +08:00
endif ( )
endif ( )
endif ( )
2023-07-05 15:47:49 +08:00
if ( ${ TARGET } STREQUAL ARMV8SVE )
2023-08-25 23:11:04 +08:00
if ( ${ CMAKE_C_COMPILER_ID } STREQUAL "PGI" AND NOT NO_SVE )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -Msve-intrinsics -march=armv8.2-a+sve" )
else ( )
2023-07-05 15:47:49 +08:00
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv8.2-a+sve" )
2023-08-25 23:11:04 +08:00
endif ( )
2023-07-05 15:47:49 +08:00
endif ( )
2024-12-05 14:11:05 +08:00
if ( ${ TARGET } STREQUAL ARMV9SME )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv9-a+sme -O3" )
endif ( )
2025-08-19 05:35:36 +08:00
if ( ${ TARGET } STREQUAL VORTEXM4 )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv8.4-a+sme -O3" )
endif ( )
2024-07-23 19:44:39 +08:00
if ( ${ TARGET } STREQUAL A64FX )
if ( ${ CMAKE_C_COMPILER_ID } STREQUAL "PGI" AND NOT NO_SVE )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -Msve-intrinsics -march=armv8.2-a+sve -mtune=a64fx" )
else ( )
execute_process ( COMMAND ${ CMAKE_C_COMPILER } -dumpversion OUTPUT_VARIABLE GCC_VERSION )
if ( ${ GCC_VERSION } VERSION_GREATER 10.4 OR ${ GCC_VERSION } VERSION_EQUAL 10.4 )
set ( KERNEL_DEFINITIONS "${KERNEL_DEFINITIONS} -march=armv8.2-a+sve -mtune=a64fx" )
else ( )
message ( FATAL_ERROR "Compiler $${CMAKE_C_COMPILER} {GCC_VERSION} does not support A64FX." )
endif ( )
endif ( )
endif ( )
2023-07-05 15:47:49 +08:00
2020-11-08 03:26:12 +08:00
endif ( )
2023-07-05 15:47:49 +08:00
2019-07-06 21:02:39 +08:00
if ( DEFINED BINARY )
message ( STATUS "Compiling a ${BINARY}-bit binary." )
endif ( )
2014-12-31 11:53:00 +08:00
if ( NOT DEFINED NEED_PIC )
set ( NEED_PIC 1 )
endif ( )
2015-02-04 02:00:49 +08:00
# OS dependent settings
2016-05-25 15:13:28 +08:00
include ( "${PROJECT_SOURCE_DIR}/cmake/os.cmake" )
2015-01-28 06:17:17 +08:00
2015-02-04 02:00:49 +08:00
# Architecture dependent settings
2016-05-25 15:13:28 +08:00
include ( "${PROJECT_SOURCE_DIR}/cmake/arch.cmake" )
2015-02-04 01:32:20 +08:00
2015-02-04 02:00:49 +08:00
# C Compiler dependent settings
2016-05-25 15:13:28 +08:00
include ( "${PROJECT_SOURCE_DIR}/cmake/cc.cmake" )
2015-02-04 02:00:49 +08:00
2021-11-15 15:53:52 +08:00
if ( INTERFACE64 )
set ( SUFFIX64 64 )
set ( SUFFIX64_UNDERSCORE _64 )
endif ( )
2015-02-26 06:51:08 +08:00
if ( NOT NOFORTRAN )
# Fortran Compiler dependent settings
2016-05-25 15:13:28 +08:00
include ( "${PROJECT_SOURCE_DIR}/cmake/fc.cmake" )
2019-07-06 21:02:39 +08:00
else ( )
2022-04-17 23:49:38 +08:00
if ( NOT XXXX )
2022-04-10 04:38:58 +08:00
set ( C_LAPACK 1 )
if ( INTERFACE64 )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DLAPACK_ILP64" )
endif ( )
set ( TIMER "NONE" )
else ( )
set ( NO_LAPACK 1 )
endif ( )
2015-02-26 06:51:08 +08:00
endif ( )
2015-02-04 02:32:23 +08:00
2025-03-13 08:41:55 +08:00
if ( USE_OPENMP )
find_package ( OpenMP COMPONENTS C REQUIRED )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DUSE_OPENMP" )
if ( NOT NOFORTRAN )
find_package ( OpenMP COMPONENTS Fortran REQUIRED )
2025-03-13 14:25:52 +08:00
# Avoid mixed OpenMP linkage
get_target_property ( OMP_C_LIB OpenMP::OpenMP_C INTERFACE_LINK_LIBRARIES )
get_target_property ( OMP_Fortran_LIB OpenMP::OpenMP_Fortran INTERFACE_LINK_LIBRARIES )
if ( NOT OMP_C_LIB STREQUAL OMP_Fortran_LIB )
message ( FATAL_ERROR "Multiple OpenMP runtime libraries detected. Mixed OpenMP runtime linkage is dangerous. You may pass -DOpenMP_LANG_LIB_NAMES and -DOpenMP_omp_LIBRARY to manually choose the OpenMP library." )
endif ( )
2025-03-13 08:41:55 +08:00
endif ( )
endif ( )
2015-02-04 03:34:41 +08:00
if ( BINARY64 )
if ( INTERFACE64 )
# CCOMMON_OPT += -DUSE64BITINT
endif ( )
endif ( )
2021-01-19 22:57:44 +08:00
if ( EMBEDDED )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DOS_EMBEDDED" )
set ( CCOMMON_OPT "${CCOMMON_OPT} -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16" )
endif ( )
2015-02-04 03:34:41 +08:00
if ( NEED_PIC )
if ( ${ CMAKE_C_COMPILER } STREQUAL "IBM" )
set ( CCOMMON_OPT "${CCOMMON_OPT} -qpic=large" )
else ( )
set ( CCOMMON_OPT "${CCOMMON_OPT} -fPIC" )
endif ( )
2017-08-17 01:32:04 +08:00
if ( NOT NOFORTRAN )
if ( ${ F_COMPILER } STREQUAL "SUN" )
set ( FCOMMON_OPT "${FCOMMON_OPT} -pic" )
2024-12-05 14:11:05 +08:00
elseif ( ${ F_COMPILER } STREQUAL "NAGFOR" )
set ( FCOMMON_OPT "${FCOMMON_OPT} -PIC" )
2017-08-17 01:32:04 +08:00
else ( )
set ( FCOMMON_OPT "${FCOMMON_OPT} -fPIC" )
endif ( )
endif ( )
2015-02-04 03:34:41 +08:00
endif ( )
2024-10-04 02:04:52 +08:00
if ( X86_64 OR ${ CORE } STREQUAL POWER10 OR ARM64 OR LOONGARCH64 )
2021-08-05 10:57:58 +08:00
set ( SMALL_MATRIX_OPT TRUE )
endif ( )
2024-08-04 05:56:59 +08:00
if ( ARM64 )
2024-07-24 18:25:28 +08:00
set ( GEMM_GEMV_FORWARD TRUE )
2025-07-24 05:24:42 +08:00
set ( SBGEMM_GEMV_FORWARD TRUE )
set ( BGEMM_GEMV_FORWARD TRUE )
endif ( )
if ( POWER )
set ( GEMM_GEMV_FORWARD TRUE )
set ( SBGEMM_GEMV_FORWARD TRUE )
endif ( )
if ( RISCV64 )
set ( GEMM_GEMV_FORWARD TRUE )
2024-07-24 18:25:28 +08:00
endif ( )
2025-07-24 15:30:58 +08:00
if ( GEMM_GEMV_FORWARD )
2024-07-24 18:25:28 +08:00
set ( CCOMMON_OPT "${CCOMMON_OPT} -DGEMM_GEMV_FORWARD" )
endif ( )
2025-07-24 15:30:58 +08:00
if ( SBGEMM_GEMV_FORWARD )
2025-07-04 01:47:08 +08:00
set ( CCOMMON_OPT "${CCOMMON_OPT} -DSBGEMM_GEMV_FORWARD" )
2024-10-14 02:46:11 +08:00
endif ( )
2025-07-24 15:30:58 +08:00
if ( BGEMM_GEMV_FORWARD )
2025-07-24 05:24:42 +08:00
set ( CCOMMON_OPT "${CCOMMON_OPT} -DBGEMM_GEMV_FORWARD" )
endif ( )
2021-08-04 16:50:15 +08:00
if ( SMALL_MATRIX_OPT )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DSMALL_MATRIX_OPT" )
endif ( )
2015-02-04 03:34:41 +08:00
if ( DYNAMIC_ARCH )
2025-09-10 04:18:51 +08:00
if ( X86 OR X86_64 OR ARM64 OR POWER OR RISCV64 OR LOONGARCH64 OR ZARCH )
2019-07-06 21:02:39 +08:00
set ( CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_ARCH" )
if ( DYNAMIC_OLDER )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_OLDER" )
endif ( )
else ( )
unset ( DYNAMIC_ARCH )
message ( STATUS "DYNAMIC_ARCH is not supported on the target architecture, removing" )
2018-06-09 22:30:46 +08:00
endif ( )
2015-02-04 03:34:41 +08:00
endif ( )
2019-02-06 06:51:40 +08:00
if ( DYNAMIC_LIST )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_LIST" )
foreach ( DCORE ${ DYNAMIC_LIST } )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DDYN_${DCORE}" )
endforeach ( )
endif ( )
2015-02-04 03:34:41 +08:00
if ( NO_LAPACK )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DNO_LAPACK" )
#Disable LAPACK C interface
set ( NO_LAPACKE 1 )
endif ( )
if ( NO_LAPACKE )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DNO_LAPACKE" )
endif ( )
if ( NO_AVX )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX" )
endif ( )
2017-08-20 22:37:29 +08:00
if ( X86 )
2015-02-04 03:34:41 +08:00
set ( CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX" )
endif ( )
if ( NO_AVX2 )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX2" )
endif ( )
2021-04-07 00:10:41 +08:00
if ( NO_AVX512 )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX512" )
endif ( )
2017-08-17 00:04:36 +08:00
if ( USE_THREAD )
2017-08-17 15:27:01 +08:00
# USE_SIMPLE_THREADED_LEVEL3 = 1
# NO_AFFINITY = 1
2015-02-04 03:34:41 +08:00
set ( CCOMMON_OPT "${CCOMMON_OPT} -DSMP_SERVER" )
2017-08-20 22:37:29 +08:00
if ( MIPS64 )
2015-02-04 03:34:41 +08:00
if ( NOT ${ CORE } STREQUAL "LOONGSON3B" )
set ( USE_SIMPLE_THREADED_LEVEL3 1 )
endif ( )
endif ( )
if ( BIGNUMA )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DBIGNUMA" )
endif ( )
endif ( )
if ( NO_WARMUP )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DNO_WARMUP" )
endif ( )
if ( CONSISTENT_FPCSR )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DCONSISTENT_FPCSR" )
endif ( )
2018-08-26 01:36:12 +08:00
if ( USE_TLS )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DUSE_TLS" )
endif ( )
2015-02-04 03:34:41 +08:00
# Only for development
# set(CCOMMON_OPT "${CCOMMON_OPT} -DPARAMTEST")
# set(CCOMMON_OPT "${CCOMMON_OPT} -DPREFETCHTEST")
# set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_SWITCHING")
# set(USE_PAPI 1)
if ( USE_PAPI )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DUSE_PAPI" )
set ( EXTRALIB "${EXTRALIB} -lpapi -lperfctr" )
endif ( )
if ( DYNAMIC_THREADS )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DDYNAMIC_THREADS" )
endif ( )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DMAX_CPU_NUMBER=${NUM_THREADS}" )
2018-04-24 10:34:53 +08:00
set ( CCOMMON_OPT "${CCOMMON_OPT} -DMAX_PARALLEL_NUMBER=${NUM_PARALLEL}" )
2020-02-10 06:32:57 +08:00
if ( BUFFERSIZE )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DBUFFERSIZE=${BUFFERSIZE}" )
endif ( )
2015-02-04 03:34:41 +08:00
if ( USE_SIMPLE_THREADED_LEVEL3 )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DUSE_SIMPLE_THREADED_LEVEL3" )
endif ( )
2020-06-05 01:07:27 +08:00
if ( NOT ${ CMAKE_SYSTEM_NAME } STREQUAL "Windows" )
2020-06-04 20:45:31 +08:00
if ( DEFINED MAX_STACK_ALLOC )
if ( NOT ${ MAX_STACK_ALLOC } EQUAL 0 )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DMAX_STACK_ALLOC=${MAX_STACK_ALLOC}" )
endif ( )
else ( )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DMAX_STACK_ALLOC=2048" )
endif ( )
2020-06-05 01:07:27 +08:00
endif ( )
2020-10-12 06:07:37 +08:00
if ( NOT ${ CMAKE_SYSTEM_NAME } STREQUAL "Windows" )
if ( DEFINED BLAS3_MEM_ALLOC_THRESHOLD )
if ( NOT ${ BLAS3_MEM_ALLOC_THRESHOLD } EQUAL 32 )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DBLAS3_MEM_ALLOC_THRESHOLD=${BLAS3_MEM_ALLOC_THRESHOLD}" )
endif ( )
endif ( )
endif ( )
2024-02-15 19:17:38 +08:00
set ( LIBPREFIX "lib${LIBNAMEPREFIX}openblas" )
2015-02-04 03:34:41 +08:00
if ( DEFINED LIBNAMESUFFIX )
2024-02-15 19:17:38 +08:00
set ( LIBPREFIX "${LIBNAMEPREFIX}_${LIBNAMESUFFIX}" )
2015-02-04 03:34:41 +08:00
endif ( )
if ( NOT DEFINED SYMBOLPREFIX )
set ( SYMBOLPREFIX "" )
endif ( )
if ( NOT DEFINED SYMBOLSUFFIX )
set ( SYMBOLSUFFIX "" )
endif ( )
2016-05-25 15:13:28 +08:00
set ( KERNELDIR "${PROJECT_SOURCE_DIR}/kernel/${ARCH}" )
2015-02-04 03:34:41 +08:00
2019-04-30 05:03:56 +08:00
# TODO: need to convert these Makefiles
2016-05-25 15:13:28 +08:00
# include ${PROJECT_SOURCE_DIR}/cmake/${ARCH}.cmake
2015-02-04 03:34:41 +08:00
if ( ${ CORE } STREQUAL "PPC440" )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_QALLOC" )
endif ( )
if ( ${ CORE } STREQUAL "PPC440FP2" )
set ( STATIC_ALLOCATION 1 )
endif ( )
if ( NOT ${ CMAKE_SYSTEM_NAME } STREQUAL "Linux" )
set ( NO_AFFINITY 1 )
endif ( )
2017-08-20 22:37:29 +08:00
if ( NOT X86_64 AND NOT X86 AND NOT ${ CORE } STREQUAL "LOONGSON3B" )
2015-02-04 03:34:41 +08:00
set ( NO_AFFINITY 1 )
endif ( )
if ( NO_AFFINITY )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DNO_AFFINITY" )
endif ( )
if ( FUNCTION_PROFILE )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DFUNCTION_PROFILE" )
endif ( )
if ( HUGETLB_ALLOCATION )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_HUGETLB" )
endif ( )
if ( DEFINED HUGETLBFILE_ALLOCATION )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_HUGETLBFILE -DHUGETLB_FILE_NAME=${HUGETLBFILE_ALLOCATION})" )
endif ( )
if ( STATIC_ALLOCATION )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_STATIC" )
endif ( )
if ( DEVICEDRIVER_ALLOCATION )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DALLOC_DEVICEDRIVER -DDEVICEDRIVER_NAME=\" /dev/mapper\ "" )
endif ( )
if ( MIXED_MEMORY_ALLOCATION )
set ( CCOMMON_OPT "${CCOMMON_OPT} -DMIXED_MEMORY_ALLOCATION" )
endif ( )
2018-11-29 07:12:04 +08:00
set ( CCOMMON_OPT "${CCOMMON_OPT} -DVERSION=\" \\\"${OpenBLAS_VERSION}\\\"\"")
2015-02-04 04:21:22 +08:00
set ( REVISION "-r${OpenBLAS_VERSION}" )
set ( MAJOR_VERSION ${ OpenBLAS_MAJOR_VERSION } )
2015-02-04 03:34:41 +08:00
2017-08-17 01:32:04 +08:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CCOMMON_OPT}" )
2020-09-16 05:15:34 +08:00
if ( NOT BUILD_SINGLE AND NOT BUILD_DOUBLE AND NOT BUILD_COMPLEX AND NOT BUILD_COMPLEX16 )
set ( BUILD_SINGLE ON )
set ( BUILD_DOUBLE ON )
set ( BUILD_COMPLEX ON )
set ( BUILD_COMPLEX16 ON )
endif ( )
2020-09-14 03:47:55 +08:00
if ( BUILD_SINGLE )
2020-10-12 06:07:37 +08:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_SINGLE" )
2020-09-14 03:47:55 +08:00
endif ( )
if ( BUILD_DOUBLE )
2020-10-12 06:07:37 +08:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_DOUBLE" )
2020-09-14 03:47:55 +08:00
endif ( )
if ( BUILD_COMPLEX )
2020-10-12 06:07:37 +08:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_COMPLEX" )
2020-09-14 03:47:55 +08:00
endif ( )
if ( BUILD_COMPLEX16 )
2020-10-12 06:07:37 +08:00
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_COMPLEX16" )
2020-09-14 03:47:55 +08:00
endif ( )
2021-09-14 22:12:27 +08:00
if ( BUILD_BFLOAT16 )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_BFLOAT16" )
endif ( )
2025-05-27 14:34:57 +08:00
if ( BUILD_HFLOAT16 )
set ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DBUILD_HFLOAT16" )
endif ( )
2015-10-27 03:52:13 +08:00
if ( NOT MSVC )
2017-08-17 01:32:04 +08:00
set ( CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${CCOMMON_OPT}" )
2015-10-27 03:52:13 +08:00
endif ( )
2015-02-04 05:33:56 +08:00
# TODO: not sure what PFLAGS is -hpa
2017-08-17 01:32:04 +08:00
set ( PFLAGS "${PFLAGS} ${CCOMMON_OPT} -I${TOPDIR} -DPROFILE ${COMMON_PROF}" )
2025-02-13 00:01:06 +08:00
if ( "${CMAKE_BUILD_TYPE}" STREQUAL "Release" )
2025-05-27 14:34:57 +08:00
if ( "${F_COMPILER}" STREQUAL "FLANG" )
if ( ${ CMAKE_Fortran_COMPILER_VERSION } VERSION_LESS_EQUAL 3 )
set ( CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -fno-unroll-loops" )
endif ( )
endif ( )
if ( ARM64 AND CMAKE_Fortran_COMPILER_ID MATCHES "LLVMFlang.*" AND CMAKE_SYSTEM_NAME STREQUAL "Windows" )
set ( CMAKE_Fortran_FLAGS_RELEASE "${CMAKE_Fortran_FLAGS_RELEASE} -O2" )
endif ( )
2025-02-13 00:01:06 +08:00
endif ( )
2015-02-04 05:33:56 +08:00
2017-08-17 01:32:04 +08:00
set ( CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${FCOMMON_OPT}" )
2015-02-04 05:33:56 +08:00
# TODO: not sure what FPFLAGS is -hpa
2017-08-17 01:32:04 +08:00
set ( FPFLAGS "${FPFLAGS} ${FCOMMON_OPT} ${COMMON_PROF}" )
2015-02-04 05:33:56 +08:00
#For LAPACK Fortran codes.
2024-08-06 23:31:03 +08:00
set ( LAPACK_FFLAGS "${LAPACK_FFLAGS} ${CMAKE_Fortran_FLAGS}" )
if ( LAPACK_STRLEN )
set ( LAPACK_FFLAGS "${LAPACK_FFLAGS} -DLAPACK_STRLEN=${LAPACK_STRLEN}" )
endif ( )
2015-02-04 05:33:56 +08:00
set ( LAPACK_FPFLAGS "${LAPACK_FPFLAGS} ${FPFLAGS}" )
2024-03-23 00:02:39 +08:00
if ( CMAKE_Fortran_COMPILER )
2024-12-05 14:11:05 +08:00
if ( "${F_COMPILER}" STREQUAL "NAGFOR" OR "${F_COMPILER}" STREQUAL "CRAY" OR CMAKE_Fortran_COMPILER_ID MATCHES "LLVMFlang.*" )
set ( FILTER_FLAGS "-msse3;-mssse3;-msse4.1;-mavx;-mavx2,-mskylake-avx512" )
if ( CMAKE_Fortran_COMPILER_ID MATCHES "LLVMFlang.*" )
2025-02-13 00:01:06 +08:00
message ( STATUS "removing fortran flags not supported by the compiler" )
2024-12-05 14:11:05 +08:00
set ( FILTER_FLAGS "${FILTER_FLAGS};-m32;-m64" )
endif ( )
foreach ( FILTER_FLAG ${ FILTER_FLAGS } )
string ( REPLACE ${ FILTER_FLAG } "" LAPACK_FFLAGS ${ LAPACK_FFLAGS } )
string ( REPLACE ${ FILTER_FLAG } "" LAPACK_FPFLAGS ${ LAPACK_FPFLAGS } )
endforeach ( )
2024-03-23 00:02:39 +08:00
endif ( )
endif ( )
2015-02-04 05:33:56 +08:00
2015-02-26 06:51:08 +08:00
if ( "${F_COMPILER}" STREQUAL "GFORTRAN" )
2015-02-11 04:36:43 +08:00
# lapack-netlib is rife with uninitialized warnings -hpa
set ( LAPACK_FFLAGS "${LAPACK_FFLAGS} -Wno-maybe-uninitialized" )
endif ( )
2015-02-04 05:33:56 +08:00
set ( LAPACK_CFLAGS "${CMAKE_C_CFLAGS} -DHAVE_LAPACK_CONFIG_H" )
if ( INTERFACE64 )
set ( LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_ILP64" )
endif ( )
if ( ${ CMAKE_SYSTEM_NAME } STREQUAL "Windows" )
set ( LAPACK_CFLAGS "${LAPACK_CFLAGS} -DOPENBLAS_OS_WINDOWS" )
endif ( )
2015-02-26 06:51:08 +08:00
if ( ${ CMAKE_C_COMPILER } STREQUAL "LSB" OR ${ CMAKE_SYSTEM_NAME } STREQUAL "Windows" )
2015-02-04 05:33:56 +08:00
set ( LAPACK_CFLAGS "${LAPACK_CFLAGS} -DLAPACK_COMPLEX_STRUCTURE" )
endif ( )
2024-12-05 14:11:05 +08:00
if ( ${ CMAKE_C_COMPILER_ID } MATCHES "IntelLLVM" AND ${ CMAKE_SYSTEM_NAME } STREQUAL "Windows" )
set ( LAPACK_CFLAGS "${LAPACK_CFLAGS} -DNOCHANGE" )
endif ( )
2015-02-04 03:34:41 +08:00
2020-06-09 22:11:13 +08:00
2015-02-04 06:05:01 +08:00
if ( NOT DEFINED SUFFIX )
set ( SUFFIX o )
endif ( )
if ( NOT DEFINED PSUFFIX )
set ( PSUFFIX po )
endif ( )
if ( NOT DEFINED LIBSUFFIX )
set ( LIBSUFFIX a )
endif ( )
if ( DYNAMIC_ARCH )
2017-08-17 00:04:36 +08:00
if ( USE_THREAD )
2015-02-04 06:05:01 +08:00
set ( LIBNAME "${LIBPREFIX}p${REVISION}.${LIBSUFFIX}" )
set ( LIBNAME_P "${LIBPREFIX}p${REVISION}_p.${LIBSUFFIX}" )
else ( )
set ( LIBNAME "${LIBPREFIX}${REVISION}.${LIBSUFFIX}" )
set ( LIBNAME_P "${LIBPREFIX}${REVISION}_p.${LIBSUFFIX}" )
endif ( )
else ( )
2017-08-17 00:04:36 +08:00
if ( USE_THREAD )
2015-02-04 06:05:01 +08:00
set ( LIBNAME "${LIBPREFIX}_${LIBCORE}p${REVISION}.${LIBSUFFIX}" )
set ( LIBNAME_P "${LIBPREFIX}_${LIBCORE}p${REVISION}_p.${LIBSUFFIX}" )
else ( )
set ( LIBNAME "${LIBPREFIX}_${LIBCORE}${REVISION}.${LIBSUFFIX}" )
set ( LIBNAME_P "${LIBPREFIX}_${LIBCORE}${REVISION}_p.${LIBSUFFIX}" )
endif ( )
endif ( )
2024-02-15 19:17:38 +08:00
if ( DEFINED FIXED_LIBNAME )
set ( LIBNAME "${LIBPREFIX}.${LIBSUFFIX}" )
set ( LIBNAME "${LIBPREFIX}_p.${LIBSUFFIX}" )
endif ( )
2015-02-04 06:05:01 +08:00
set ( LIBDLLNAME "${LIBPREFIX}.dll" )
set ( LIBSONAME "${LIBNAME}.${LIBSUFFIX}.so" )
set ( LIBDYNNAME "${LIBNAME}.${LIBSUFFIX}.dylib" )
set ( LIBDEFNAME "${LIBNAME}.${LIBSUFFIX}.def" )
set ( LIBEXPNAME "${LIBNAME}.${LIBSUFFIX}.exp" )
set ( LIBZIPNAME "${LIBNAME}.${LIBSUFFIX}.zip" )
2016-05-25 15:13:28 +08:00
set ( LIBS "${PROJECT_SOURCE_DIR}/${LIBNAME}" )
set ( LIBS_P "${PROJECT_SOURCE_DIR}/${LIBNAME_P}" )
2015-02-04 06:05:01 +08:00
set ( LIB_COMPONENTS BLAS )
if ( NOT NO_CBLAS )
set ( LIB_COMPONENTS "${LIB_COMPONENTS} CBLAS" )
endif ( )
if ( NOT NO_LAPACK )
set ( LIB_COMPONENTS "${LIB_COMPONENTS} LAPACK" )
if ( NOT NO_LAPACKE )
set ( LIB_COMPONENTS "${LIB_COMPONENTS} LAPACKE" )
endif ( )
2017-10-12 23:02:01 +08:00
if ( BUILD_RELAPACK )
set ( LIB_COMPONENTS "${LIB_COMPONENTS} ReLAPACK" )
endif ( )
2015-02-04 06:05:01 +08:00
endif ( )
if ( ONLY_CBLAS )
set ( LIB_COMPONENTS CBLAS )
endif ( )
2015-08-11 03:10:44 +08:00
# For GEMM3M
set ( USE_GEMM3M 0 )
if ( DEFINED ARCH )
2017-08-20 22:37:29 +08:00
if ( X86 OR X86_64 OR ${ ARCH } STREQUAL "ia64" OR MIPS64 )
2015-08-11 03:10:44 +08:00
set ( USE_GEMM3M 1 )
endif ( )
if ( ${ CORE } STREQUAL "generic" )
set ( USE_GEMM3M 0 )
endif ( )
endif ( )
2015-02-04 06:05:01 +08:00
#export OSNAME
#export ARCH
#export CORE
#export LIBCORE
#export PGCPATH
#export CONFIG
#export CC
#export FC
#export BU
#export FU
#export NEED2UNDERSCORES
#export USE_THREAD
#export NUM_THREADS
#export NUM_CORES
#export SMP
#export MAKEFILE_RULE
#export NEED_PIC
#export BINARY
#export BINARY32
#export BINARY64
#export F_COMPILER
#export C_COMPILER
#export USE_OPENMP
#export CROSS
#export CROSS_SUFFIX
#export NOFORTRAN
#export NO_FBLAS
#export EXTRALIB
#export CEXTRALIB
#export FEXTRALIB
#export HAVE_SSE
#export HAVE_SSE2
#export HAVE_SSE3
#export HAVE_SSSE3
#export HAVE_SSE4_1
#export HAVE_SSE4_2
#export HAVE_SSE4A
#export HAVE_SSE5
#export HAVE_AVX
#export HAVE_VFP
#export HAVE_VFPV3
#export HAVE_VFPV4
#export HAVE_NEON
#export KERNELDIR
#export FUNCTION_PROFILE
#export TARGET_CORE
#
2020-10-12 06:07:37 +08:00
#export SBGEMM_UNROLL_M
#export SBGEMM_UNROLL_N
2015-02-04 06:05:01 +08:00
#export SGEMM_UNROLL_M
#export SGEMM_UNROLL_N
#export DGEMM_UNROLL_M
#export DGEMM_UNROLL_N
#export QGEMM_UNROLL_M
#export QGEMM_UNROLL_N
#export CGEMM_UNROLL_M
#export CGEMM_UNROLL_N
#export ZGEMM_UNROLL_M
#export ZGEMM_UNROLL_N
#export XGEMM_UNROLL_M
#export XGEMM_UNROLL_N
#export CGEMM3M_UNROLL_M
#export CGEMM3M_UNROLL_N
#export ZGEMM3M_UNROLL_M
#export ZGEMM3M_UNROLL_N
#export XGEMM3M_UNROLL_M
#export XGEMM3M_UNROLL_N
#if (USE_CUDA)
# export CUDADIR
# export CUCC
# export CUFLAGS
# export CULIB
#endif