From 90a4dab501ce11947981c92af85106dec98ca7ba Mon Sep 17 00:00:00 2001 From: Date: Thu, 17 Aug 2017 00:35:54 +1000 Subject: [PATCH 01/16] Let CMake deal with build type. --- CMakeLists.txt | 17 ----------------- cmake/system.cmake | 4 ++-- 2 files changed, 2 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index a91ea5ff7..4575fd390 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -26,7 +26,6 @@ if(MSVC) option(BUILD_WITHOUT_LAPACK "Without LAPACK and LAPACKE (Only BLAS or CBLAS)" ON) endif() option(BUILD_WITHOUT_CBLAS "Without CBLAS" OFF) -option(BUILD_DEBUG "Build Debug Version" OFF) option(DYNAMIC_ARCH "Build with DYNAMIC_ARCH" OFF) ####### if(BUILD_WITHOUT_LAPACK) @@ -34,22 +33,6 @@ set(NO_LAPACK 1) set(NO_LAPACKE 1) endif() -if(CMAKE_CONFIGURATION_TYPES) # multiconfig generator? - set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "" FORCE) - set(CMAKE_BUILD_TYPE - Debug Debug - Release Release - ) -else() - if( NOT CMAKE_BUILD_TYPE ) - if(BUILD_DEBUG) - set(CMAKE_BUILD_TYPE Debug) - else() - set(CMAKE_BUILD_TYPE Release) - endif() - endif() -endif() - if(BUILD_WITHOUT_CBLAS) set(NO_CBLAS 1) endif() diff --git a/cmake/system.cmake b/cmake/system.cmake index 3d3270778..5fe9081ac 100644 --- a/cmake/system.cmake +++ b/cmake/system.cmake @@ -52,7 +52,7 @@ if (NO_AVX2) set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX2") endif () -if (CMAKE_BUILD_TYPE STREQUAL Debug) +if (CMAKE_BUILD_TYPE STREQUAL "Debug") set(GETARCH_FLAGS "${GETARCH_FLAGS} -g") endif () @@ -316,7 +316,7 @@ set(SED sed) set(REVISION "-r${OpenBLAS_VERSION}") set(MAJOR_VERSION ${OpenBLAS_MAJOR_VERSION}) -if (DEBUG) +if (CMAKE_BUILD_TYPE STREQUAL "Debug") set(COMMON_OPT "${COMMON_OPT} -g") endif () From 7242cdc4ecc761e565db4e0ff163cbf3172df3bc Mon Sep 17 00:00:00 2001 From: Date: Thu, 17 Aug 2017 00:51:04 +1000 Subject: [PATCH 02/16] Allow CMake to determine if it is building static or shared. --- CMakeLists.txt | 43 ++++++++++++++++--------------------------- 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4575fd390..8c4bd8b98 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,14 +3,13 @@ ## cmake_minimum_required(VERSION 2.8.5) -project(OpenBLAS) +project(OpenBLAS C) set(OpenBLAS_MAJOR_VERSION 0) set(OpenBLAS_MINOR_VERSION 3) set(OpenBLAS_PATCH_VERSION 0.dev) set(OpenBLAS_VERSION "${OpenBLAS_MAJOR_VERSION}.${OpenBLAS_MINOR_VERSION}.${OpenBLAS_PATCH_VERSION}") enable_language(ASM) -enable_language(C) # Adhere to GNU filesystem layout conventions include(GNUInstallDirs) @@ -99,10 +98,6 @@ if (NOT DEFINED CORE OR "${CORE}" STREQUAL "UNKNOWN") message(FATAL_ERROR "Detecting CPU failed. Please set TARGET explicitly, e.g. make TARGET=your_cpu_target. Please read README for details.") endif () -if (${NO_STATIC} AND ${NO_SHARED}) - message(FATAL_ERROR "Neither static nor shared are enabled.") -endif () - #Set default output directory set( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) @@ -152,9 +147,14 @@ if (${DYNAMIC_ARCH}) endforeach() endif () +# Only build shared libs for MSVC +if (MSVC) + set(BUILD_SHARED_LIBS ON) +endif() + # add objects to the openblas lib -add_library(${OpenBLAS_LIBNAME} SHARED ${LA_SOURCES} ${LAPACKE_SOURCES} ${TARGET_OBJS} ${OpenBLAS_DEF_FILE}) +add_library(${OpenBLAS_LIBNAME} ${LA_SOURCES} ${LAPACKE_SOURCES} ${TARGET_OBJS} ${OpenBLAS_DEF_FILE}) include("${PROJECT_SOURCE_DIR}/cmake/export.cmake") @@ -173,23 +173,16 @@ endforeach() enable_testing() add_subdirectory(utest) +# Add threading library to linker +find_package(Threads) +target_link_libraries(${OpenBLAS_LIBNAME} ${CMAKE_THREAD_LIBS_INIT}) + if (NOT MSVC) - #only build shared library for MSVC - - add_library(${OpenBLAS_LIBNAME}_static STATIC ${LA_SOURCES} ${LAPACKE_SOURCES} ${TARGET_OBJS}) - set_target_properties(${OpenBLAS_LIBNAME}_static PROPERTIES OUTPUT_NAME ${OpenBLAS_LIBNAME}) - set_target_properties(${OpenBLAS_LIBNAME}_static PROPERTIES CLEAN_DIRECT_OUTPUT 1) - - if(SMP) - target_link_libraries(${OpenBLAS_LIBNAME} pthread) - target_link_libraries(${OpenBLAS_LIBNAME}_static pthread) -endif() - -#build test and ctest -add_subdirectory(test) -if(NOT NO_CBLAS) -add_subdirectory(ctest) -endif() + # Build test and ctest + add_subdirectory(test) + if(NOT NO_CBLAS) + add_subdirectory(ctest) + endif() endif() set_target_properties(${OpenBLAS_LIBNAME} PROPERTIES @@ -265,10 +258,6 @@ if(NOT NO_LAPACKE) ) install (FILES ${CMAKE_BINARY_DIR}/lapacke_mangling.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) endif() - -if(NOT MSVC) - install (TARGETS ${OpenBLAS_LIBNAME}_static DESTINATION ${CMAKE_INSTALL_LIBDIR}) -endif() include(FindPkgConfig QUIET) if(PKG_CONFIG_FOUND) From 38d273ea03e4438001fb752835bd1d67e616c6d9 Mon Sep 17 00:00:00 2001 From: Date: Thu, 17 Aug 2017 02:04:36 +1000 Subject: [PATCH 03/16] Drop some redundant vars and improve arch detection in CMake. --- CMakeLists.txt | 8 +++-- cmake/c_check.cmake | 88 +++++++++++++++++++++++++-------------------- cmake/os.cmake | 2 +- cmake/system.cmake | 31 ++++------------ 4 files changed, 62 insertions(+), 67 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 8c4bd8b98..95dbdf9ed 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -173,9 +173,11 @@ endforeach() enable_testing() add_subdirectory(utest) -# Add threading library to linker -find_package(Threads) -target_link_libraries(${OpenBLAS_LIBNAME} ${CMAKE_THREAD_LIBS_INIT}) +if (USE_THREAD) + # Add threading library to linker + find_package(Threads) + target_link_libraries(${OpenBLAS_LIBNAME} ${CMAKE_THREAD_LIBS_INIT}) +endif() if (NOT MSVC) # Build test and ctest diff --git a/cmake/c_check.cmake b/cmake/c_check.cmake index 2249a873f..4ac661f47 100644 --- a/cmake/c_check.cmake +++ b/cmake/c_check.cmake @@ -26,14 +26,8 @@ # N.B. c_check (and ctest.c) is not cross-platform, so instead try to use CMake variables. set(FU "") -if(APPLE) -set(FU "_") -elseif(MSVC AND ${CMAKE_C_COMPILER_ID} MATCHES "Clang") -set(FU "") -elseif(MSVC) -set(FU "_") -elseif(UNIX) -set(FU "") +if (APPLE OR (MSVC AND NOT ${CMAKE_C_COMPILER_ID} MATCHES "Clang")) + set(FU "_") endif() # Convert CMake vars into the format that OpenBLAS expects @@ -42,43 +36,59 @@ if (${HOST_OS} STREQUAL "WINDOWS") set(HOST_OS WINNT) endif () -# added by hpa - check size of void ptr to detect 64-bit compile -if (NOT DEFINED BINARY) - set(BINARY 32) - if (CMAKE_SIZEOF_VOID_P EQUAL 8) - set(BINARY 64) - endif () -endif () +if(CMAKE_COMPILER_IS_GNUCC AND WIN32) + execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine + OUTPUT_VARIABLE OPENBLAS_GCC_TARGET_MACHINE + OUTPUT_STRIP_TRAILING_WHITESPACE) + if(OPENBLAS_GCC_TARGET_MACHINE MATCHES "amd64|x86_64|AMD64") + set(MINGW64 1) + endif() +endif() -if (BINARY EQUAL 64) - set(BINARY64 1) -else () - set(BINARY32 1) -endif () +# Pretty thorough determination of arch. Add more if needed +if(CMAKE_CL_64 OR MINGW64) + set(X86_64 1) +elseif(MINGW OR (MSVC AND NOT CMAKE_CROSSCOMPILING)) + set(X86 1) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc") + set(PPC 1) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*") + set(X86_64 1) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686.*|i386.*|x86.*|amd64.*|AMD64.*") + set(X86 1) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm.*|ARM.*)") + set(ARM 1) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "^(aarch64.*|AARCH64.*)") + set(ARM64 1) +endif() -# CMake docs define these: -# CMAKE_SYSTEM_PROCESSOR - The name of the CPU CMake is building for. -# CMAKE_HOST_SYSTEM_PROCESSOR - The name of the CPU CMake is running on. -# -# TODO: CMAKE_SYSTEM_PROCESSOR doesn't seem to be correct - instead get it from the compiler a la c_check -set(ARCH ${CMAKE_SYSTEM_PROCESSOR} CACHE STRING "Target Architecture") - -if (${ARCH} STREQUAL "AMD64") +if (X86_64) set(ARCH "x86_64") +elseif(X86) + set(ARCH "x86") +elseif(PPC) + set(ARCH "power") +elseif(ARM) + set(ARCH "arm") +elseif(ARM64) + set(ARCH "arm64") +else() + set(ARCH ${CMAKE_SYSTEM_PROCESSOR} CACHE STRING "Target Architecture") endif () -# If you are using a 32-bit compiler on a 64-bit system CMAKE_SYSTEM_PROCESSOR will be wrong -if (${ARCH} STREQUAL "x86_64" AND BINARY EQUAL 32) - set(ARCH x86) -endif () +if (NOT BINARY) + if (X86_64 OR ARM64 OR PPC OR ARCH STREQUAL "mips64") + set(BINARY 64) + else () + set(BINARY 32) + endif () +endif() -if (${ARCH} STREQUAL "X86") - set(ARCH x86) -endif () - -if (${ARCH} MATCHES "ppc") - set(ARCH power) -endif () +if(BINARY EQUAL 64) + set(BINARY64 1) +else() + set(BINARY32 1) +endif() set(COMPILER_ID ${CMAKE_CXX_COMPILER_ID}) if (${COMPILER_ID} STREQUAL "GNU") diff --git a/cmake/os.cmake b/cmake/os.cmake index e9df68d7f..1e9458ccf 100644 --- a/cmake/os.cmake +++ b/cmake/os.cmake @@ -78,7 +78,7 @@ if (CYGWIN) endif () if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Windows" AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Interix" AND NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Android") - if (SMP) + if (USE_THREAD) set(EXTRALIB "${EXTRALIB} -lpthread") endif () endif () diff --git a/cmake/system.cmake b/cmake/system.cmake index 5fe9081ac..c0957c715 100644 --- a/cmake/system.cmake +++ b/cmake/system.cmake @@ -56,11 +56,6 @@ if (CMAKE_BUILD_TYPE STREQUAL "Debug") set(GETARCH_FLAGS "${GETARCH_FLAGS} -g") endif () -# TODO: let CMake handle this? -hpa -#if (${QUIET_MAKE}) -# set(MAKE "${MAKE} -s") -#endif() - if (NOT DEFINED NO_PARALLEL_MAKE) set(NO_PARALLEL_MAKE 0) endif () @@ -79,30 +74,18 @@ endif () include("${PROJECT_SOURCE_DIR}/cmake/prebuild.cmake") +# N.B. this is NUM_THREAD in Makefile.system which is probably a bug -hpa if (NOT DEFINED NUM_THREADS) set(NUM_THREADS ${NUM_CORES}) endif () if (${NUM_THREADS} EQUAL 1) set(USE_THREAD 0) +elseif(NOT DEFINED USE_THREAD) + set(USE_THREAD 1) endif () -if (DEFINED USE_THREAD) - if (NOT ${USE_THREAD}) - unset(SMP) - else () - set(SMP 1) - endif () -else () - # N.B. this is NUM_THREAD in Makefile.system which is probably a bug -hpa - if (${NUM_THREADS} EQUAL 1) - unset(SMP) - else () - set(SMP 1) - endif () -endif () - -if (${SMP}) +if (USE_THREAD) message(STATUS "SMP enabled.") endif () @@ -182,7 +165,7 @@ if (NO_AVX2) set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX2") endif () -if (SMP) +if (USE_THREAD) set(CCOMMON_OPT "${CCOMMON_OPT} -DSMP_SERVER") if (${ARCH} STREQUAL "mips64") @@ -386,7 +369,7 @@ if (NOT DEFINED LIBSUFFIX) endif () if (DYNAMIC_ARCH) - if (DEFINED SMP) + if (USE_THREAD) set(LIBNAME "${LIBPREFIX}p${REVISION}.${LIBSUFFIX}") set(LIBNAME_P "${LIBPREFIX}p${REVISION}_p.${LIBSUFFIX}") else () @@ -394,7 +377,7 @@ if (DYNAMIC_ARCH) set(LIBNAME_P "${LIBPREFIX}${REVISION}_p.${LIBSUFFIX}") endif () else () - if (DEFINED SMP) + if (USE_THREAD) set(LIBNAME "${LIBPREFIX}_${LIBCORE}p${REVISION}.${LIBSUFFIX}") set(LIBNAME_P "${LIBPREFIX}_${LIBCORE}p${REVISION}_p.${LIBSUFFIX}") else () From 7c1acc07f09ab8e99082fabac9651c2c367d82fd Mon Sep 17 00:00:00 2001 From: Date: Thu, 17 Aug 2017 03:32:04 +1000 Subject: [PATCH 04/16] Fix bug that required fortran. Fix bug that needed CXX var. Remove redundant set vars. Fix threading detection. Do not attempt to run code if cross compiling. --- CMakeLists.txt | 4 +-- cmake/c_check.cmake | 2 +- cmake/os.cmake | 13 ------- cmake/prebuild.cmake | 5 +++ cmake/system.cmake | 83 +++++++++++++------------------------------- 5 files changed, 33 insertions(+), 74 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 95dbdf9ed..3bafeb9dd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -179,10 +179,10 @@ if (USE_THREAD) target_link_libraries(${OpenBLAS_LIBNAME} ${CMAKE_THREAD_LIBS_INIT}) endif() -if (NOT MSVC) +if (NOT MSVC AND NOT NOFORTRAN) # Build test and ctest add_subdirectory(test) - if(NOT NO_CBLAS) + if(NOT NO_CBLAS) add_subdirectory(ctest) endif() endif() diff --git a/cmake/c_check.cmake b/cmake/c_check.cmake index 4ac661f47..99590c975 100644 --- a/cmake/c_check.cmake +++ b/cmake/c_check.cmake @@ -90,7 +90,7 @@ else() set(BINARY32 1) endif() -set(COMPILER_ID ${CMAKE_CXX_COMPILER_ID}) +set(COMPILER_ID ${CMAKE_C_COMPILER_ID}) if (${COMPILER_ID} STREQUAL "GNU") set(COMPILER_ID "GCC") endif () diff --git a/cmake/os.cmake b/cmake/os.cmake index 1e9458ccf..f50097aaf 100644 --- a/cmake/os.cmake +++ b/cmake/os.cmake @@ -3,19 +3,6 @@ ## Description: Ported from portion of OpenBLAS/Makefile.system ## Detects the OS and sets appropriate variables. -if (${CMAKE_SYSTEM_NAME} STREQUAL "Darwin") - set(ENV{MACOSX_DEPLOYMENT_TARGET} "10.2") # TODO: should be exported as an env var - set(MD5SUM "md5 -r") -endif () - -if (${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") - set(MD5SUM "md5 -r") -endif () - -if (${CMAKE_SYSTEM_NAME} STREQUAL "NetBSD") - set(MD5SUM "md5 -n") -endif () - if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux") set(EXTRALIB "${EXTRALIB} -lm") set(NO_EXPRECISION 1) diff --git a/cmake/prebuild.cmake b/cmake/prebuild.cmake index 2c262b0b6..d66b0ccc0 100644 --- a/cmake/prebuild.cmake +++ b/cmake/prebuild.cmake @@ -37,6 +37,9 @@ # CPUIDEMU = ../../cpuid/table.o + +# Cannot run getarch on target if we are cross-compiling +if(NOT CMAKE_CROSSCOMPILING) if (DEFINED CPUIDEMU) set(EXFLAGS "-DCPUIDEMU -DVENDOR=99") endif () @@ -157,3 +160,5 @@ if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") MESSAGE(FATAL_ERROR "Compiling gen_config_h failed ${GEN_CONFIG_H_LOG}") endif () endif () + +endif(NOT CMAKE_CROSSCOMPILING) diff --git a/cmake/system.cmake b/cmake/system.cmake index c0957c715..880223758 100644 --- a/cmake/system.cmake +++ b/cmake/system.cmake @@ -53,7 +53,7 @@ if (NO_AVX2) endif () if (CMAKE_BUILD_TYPE STREQUAL "Debug") - set(GETARCH_FLAGS "${GETARCH_FLAGS} -g") + set(GETARCH_FLAGS "${GETARCH_FLAGS} ${CMAKE_C_FLAGS_DEBUG}") endif () if (NOT DEFINED NO_PARALLEL_MAKE) @@ -75,18 +75,25 @@ endif () include("${PROJECT_SOURCE_DIR}/cmake/prebuild.cmake") # N.B. this is NUM_THREAD in Makefile.system which is probably a bug -hpa -if (NOT DEFINED NUM_THREADS) - set(NUM_THREADS ${NUM_CORES}) -endif () +if (NOT CMAKE_CROSSCOMPILING) + if (NOT DEFINED NUM_CORES) + include(ProcessorCount) + ProcessorCount(NUM_CORES) + endif() -if (${NUM_THREADS} EQUAL 1) + if (NOT NUM_CORES EQUAL 0) + set(NUM_THREADS ${NUM_CORES}) + endif () +endif() + +if (${NUM_THREADS} LESS 2) set(USE_THREAD 0) elseif(NOT DEFINED USE_THREAD) set(USE_THREAD 1) endif () if (USE_THREAD) - message(STATUS "SMP enabled.") + message(STATUS "Multi-threading enabled with ${NUM_THREADS} threads.") endif () if (NOT DEFINED NEED_PIC) @@ -95,15 +102,6 @@ endif () # TODO: I think CMake should be handling all this stuff -hpa unset(ARFLAGS) -set(CPP "${COMPILER} -E") -set(AR "${CROSS_SUFFIX}ar") -set(AS "${CROSS_SUFFIX}as") -set(LD "${CROSS_SUFFIX}ld") -set(RANLIB "${CROSS_SUFFIX}ranlib") -set(NM "${CROSS_SUFFIX}nm") -set(DLLWRAP "${CROSS_SUFFIX}dllwrap") -set(OBJCOPY "${CROSS_SUFFIX}objcopy") -set(OBJCONV "${CROSS_SUFFIX}objconv") # OS dependent settings include("${PROJECT_SOURCE_DIR}/cmake/os.cmake") @@ -132,11 +130,13 @@ if (NEED_PIC) set(CCOMMON_OPT "${CCOMMON_OPT} -fPIC") endif () - if (${F_COMPILER} STREQUAL "SUN") - set(FCOMMON_OPT "${FCOMMON_OPT} -pic") - else () - set(FCOMMON_OPT "${FCOMMON_OPT} -fPIC") - endif () + if (NOT NOFORTRAN) + if (${F_COMPILER} STREQUAL "SUN") + set(FCOMMON_OPT "${FCOMMON_OPT} -pic") + else () + set(FCOMMON_OPT "${FCOMMON_OPT} -fPIC") + endif () + endif() endif () if (DYNAMIC_ARCH) @@ -278,52 +278,19 @@ if (MIXED_MEMORY_ALLOCATION) set(CCOMMON_OPT "${CCOMMON_OPT} -DMIXED_MEMORY_ALLOCATION") endif () -if (${CMAKE_SYSTEM_NAME} STREQUAL "SunOS") - set(TAR gtar) - set(PATCH gpatch) - set(GREP ggrep) -else () - set(TAR tar) - set(PATCH patch) - set(GREP grep) -endif () - -if (NOT DEFINED MD5SUM) - set(MD5SUM md5sum) -endif () - -set(AWK awk) - -set(SED sed) - set(REVISION "-r${OpenBLAS_VERSION}") set(MAJOR_VERSION ${OpenBLAS_MAJOR_VERSION}) -if (CMAKE_BUILD_TYPE STREQUAL "Debug") - set(COMMON_OPT "${COMMON_OPT} -g") -endif () - -if (NOT DEFINED COMMON_OPT) - set(COMMON_OPT "-O2") -endif () - -#For x86 32-bit -if (DEFINED BINARY AND BINARY EQUAL 32) -if (NOT MSVC) - set(COMMON_OPT "${COMMON_OPT} -m32") -endif() -endif() - -set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_OPT} ${CCOMMON_OPT}") +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CCOMMON_OPT}") if(NOT MSVC) -set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${COMMON_OPT} ${CCOMMON_OPT}") +set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${CCOMMON_OPT}") endif() # TODO: not sure what PFLAGS is -hpa -set(PFLAGS "${PFLAGS} ${COMMON_OPT} ${CCOMMON_OPT} -I${TOPDIR} -DPROFILE ${COMMON_PROF}") +set(PFLAGS "${PFLAGS} ${CCOMMON_OPT} -I${TOPDIR} -DPROFILE ${COMMON_PROF}") -set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${COMMON_OPT} ${FCOMMON_OPT}") +set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} ${FCOMMON_OPT}") # TODO: not sure what FPFLAGS is -hpa -set(FPFLAGS "${FPFLAGS} ${COMMON_OPT} ${FCOMMON_OPT} ${COMMON_PROF}") +set(FPFLAGS "${FPFLAGS} ${FCOMMON_OPT} ${COMMON_PROF}") #For LAPACK Fortran codes. set(LAPACK_FFLAGS "${LAPACK_FFLAGS} ${CMAKE_Fortran_FLAGS}") From 6aac06587d289d7b734caecfc968df67a5d808c6 Mon Sep 17 00:00:00 2001 From: Sacha Refshauge Date: Thu, 17 Aug 2017 17:27:01 +1000 Subject: [PATCH 05/16] Fix typos and use CMake OpenMP support. --- CMakeLists.txt | 41 +++++++++++++++++++++++------------------ cmake/arch.cmake | 35 +++++++++-------------------------- cmake/system.cmake | 19 ++++++++++--------- 3 files changed, 42 insertions(+), 53 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 3bafeb9dd..db59f5b3f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,14 +3,12 @@ ## cmake_minimum_required(VERSION 2.8.5) -project(OpenBLAS C) +project(OpenBLAS C ASM) set(OpenBLAS_MAJOR_VERSION 0) set(OpenBLAS_MINOR_VERSION 3) set(OpenBLAS_PATCH_VERSION 0.dev) set(OpenBLAS_VERSION "${OpenBLAS_MAJOR_VERSION}.${OpenBLAS_MINOR_VERSION}.${OpenBLAS_PATCH_VERSION}") -enable_language(ASM) - # Adhere to GNU filesystem layout conventions include(GNUInstallDirs) @@ -176,6 +174,11 @@ add_subdirectory(utest) if (USE_THREAD) # Add threading library to linker find_package(Threads) + if (THREADS_HAVE_PTHREAD_ARG) + set_property(TARGET ${OpenBLAS_LIBNAME} PROPERTY COMPILE_OPTIONS "-pthread") + set_property(TARGET ${OpenBLAS_LIBNAME} PROPERTY INTERFACE_COMPILE_OPTIONS "-pthread") + endif() + message("PTHREAD: ${CMAKE_THREAD_LIBS_INIT}") target_link_libraries(${OpenBLAS_LIBNAME} ${CMAKE_THREAD_LIBS_INIT}) endif() @@ -219,26 +222,28 @@ install(TARGETS ${OpenBLAS_LIBNAME} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ) # Install include files - set (GENCONFIG_BIN ${CMAKE_BINARY_DIR}/gen_config_h${CMAKE_EXECUTABLE_SUFFIX}) +set (GENCONFIG_BIN ${CMAKE_BINARY_DIR}/gen_config_h${CMAKE_EXECUTABLE_SUFFIX}) - execute_process(COMMAND ${GENCONFIG_BIN} - ${CMAKE_CURRENT_SOURCE_DIR}/config.h - ${CMAKE_CURRENT_SOURCE_DIR}/openblas_config_template.h - OUTPUT_VARIABLE OPENBLAS_CONFIG_H_CONTENTS) +execute_process(COMMAND ${GENCONFIG_BIN} + ${CMAKE_CURRENT_SOURCE_DIR}/config.h + ${CMAKE_CURRENT_SOURCE_DIR}/openblas_config_template.h + OUTPUT_VARIABLE OPENBLAS_CONFIG_H_CONTENTS) - file(WRITE ${CMAKE_BINARY_DIR}/openblas_config.tmp "${OPENBLAS_CONFIG_H_CONTENTS}") - configure_file(${CMAKE_BINARY_DIR}/openblas_config.tmp ${CMAKE_BINARY_DIR}/openblas_config.h COPYONLY) +file(WRITE ${CMAKE_BINARY_DIR}/openblas_config.tmp "${OPENBLAS_CONFIG_H_CONTENTS}") +configure_file(${CMAKE_BINARY_DIR}/openblas_config.tmp ${CMAKE_BINARY_DIR}/openblas_config.h COPYONLY) - install (FILES ${CMAKE_BINARY_DIR}/openblas_config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +install (FILES ${CMAKE_BINARY_DIR}/openblas_config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) - message(STATUS "Generating f77blas.h in ${CMAKE_INSTALL_INCLUDEDIR}") +if(NOT NOFORTRAN) + message(STATUS "Generating f77blas.h in ${CMAKE_INSTALL_INCLUDEDIR}") - file(WRITE ${CMAKE_BINARY_DIR}/f77blas.h "") - file(APPEND ${CMAKE_BINARY_DIR}/f77blas.h "#ifndef OPENBLAS_F77BLAS_H\n#define OPENBLAS_F77BLAS_H\n#include \"openblas_config.h\"\n") - file(READ ${CMAKE_CURRENT_SOURCE_DIR}/common_interface.h COMMON_INTERFACE_H_CONTENTS) - file(APPEND ${CMAKE_BINARY_DIR}/f77blas.h "${COMMON_INTERFACE_H_CONTENTS}") - file(APPEND ${CMAKE_BINARY_DIR}/f77blas.h "#endif") - install (FILES ${CMAKE_BINARY_DIR}/f77blas.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + file(WRITE ${CMAKE_BINARY_DIR}/f77blas.h "") + file(APPEND ${CMAKE_BINARY_DIR}/f77blas.h "#ifndef OPENBLAS_F77BLAS_H\n#define OPENBLAS_F77BLAS_H\n#include \"openblas_config.h\"\n") + file(READ ${CMAKE_CURRENT_SOURCE_DIR}/common_interface.h COMMON_INTERFACE_H_CONTENTS) + file(APPEND ${CMAKE_BINARY_DIR}/f77blas.h "${COMMON_INTERFACE_H_CONTENTS}") + file(APPEND ${CMAKE_BINARY_DIR}/f77blas.h "#endif") + install (FILES ${CMAKE_BINARY_DIR}/f77blas.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +endif() if(NOT NO_CBLAS) message (STATUS "Generating cblas.h in ${CMAKE_INSTALL_INCLUDEDIR}") diff --git a/cmake/arch.cmake b/cmake/arch.cmake index 5b897d857..bc9a7621c 100644 --- a/cmake/arch.cmake +++ b/cmake/arch.cmake @@ -33,32 +33,15 @@ if (${CMAKE_C_COMPILER_ID} STREQUAL "Intel") endif () if (USE_OPENMP) - - if (${CMAKE_C_COMPILER_ID} STREQUAL "GNU" OR ${CMAKE_C_COMPILER_ID} STREQUAL "LSB") - set(CCOMMON_OPT "${CCOMMON_OPT} -fopenmp") - endif () - - if (${CMAKE_C_COMPILER_ID} STREQUAL "Clang") - message(WARNING "Clang doesn't support OpenMP yet.") - set(CCOMMON_OPT "${CCOMMON_OPT} -fopenmp") - endif () - - if (${CMAKE_C_COMPILER_ID} STREQUAL "Intel") - set(CCOMMON_OPT "${CCOMMON_OPT} -openmp") - endif () - - if (${CMAKE_C_COMPILER_ID} STREQUAL "PGI") - set(CCOMMON_OPT "${CCOMMON_OPT} -mp") - endif () - - if (${CMAKE_C_COMPILER_ID} STREQUAL "OPEN64") - set(CCOMMON_OPT "${CCOMMON_OPT} -mp") - set(CEXTRALIB "${CEXTRALIB} -lstdc++") - endif () - - if (${CMAKE_C_COMPILER_ID} STREQUAL "PATHSCALE") - set(CCOMMON_OPT "${CCOMMON_OPT} -mp") - endif () + # USE_SIMPLE_THREADED_LEVEL3 = 1 + # NO_AFFINITY = 1 + find_package(OpenMP) + if (OpenMP_FOUND) + set(CCOMMON_OPT "${CCOMMON_OPT} ${OpenMP_C_FLAGS} -DUSE_OPENMP") + set(FCOMMON_OPT "${FCOMMON_OPT} ${OpenMP_Fortran_FLAGS}") + elseif (UNIX) + set(USE_OPENMP 0) + endif() endif () diff --git a/cmake/system.cmake b/cmake/system.cmake index 880223758..e31e74a42 100644 --- a/cmake/system.cmake +++ b/cmake/system.cmake @@ -27,7 +27,7 @@ if (DEFINED BINARY AND DEFINED TARGET AND BINARY EQUAL 32) endif () if (DEFINED TARGET) - message(STATUS "Targetting the ${TARGET} architecture.") + message(STATUS "Targeting the ${TARGET} architecture.") set(GETARCH_FLAGS "-DFORCE_${TARGET}") endif () @@ -92,6 +92,12 @@ elseif(NOT DEFINED USE_THREAD) set(USE_THREAD 1) endif () +# TODO: Fix. Isn't working. Was never working in CMake. +# Undefined reference to get_num_procs, blas_thread_shutdown, ... +if (UNIX) + set(USE_THREAD 0) +endif() + if (USE_THREAD) message(STATUS "Multi-threading enabled with ${NUM_THREADS} threads.") endif () @@ -166,6 +172,8 @@ if (NO_AVX2) endif () if (USE_THREAD) + # USE_SIMPLE_THREADED_LEVEL3 = 1 + # NO_AFFINITY = 1 set(CCOMMON_OPT "${CCOMMON_OPT} -DSMP_SERVER") if (${ARCH} STREQUAL "mips64") @@ -174,16 +182,9 @@ if (USE_THREAD) endif () endif () - if (USE_OPENMP) - # USE_SIMPLE_THREADED_LEVEL3 = 1 - # NO_AFFINITY = 1 - set(CCOMMON_OPT "${CCOMMON_OPT} -DUSE_OPENMP") - endif () - if (BIGNUMA) set(CCOMMON_OPT "${CCOMMON_OPT} -DBIGNUMA") endif () - endif () if (NO_WARMUP) @@ -298,7 +299,7 @@ set(LAPACK_FPFLAGS "${LAPACK_FPFLAGS} ${FPFLAGS}") #Disable -fopenmp for LAPACK Fortran codes on Windows. if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") - set(FILTER_FLAGS "-fopenmp;-mp;-openmp;-xopenmp=parralel") + set(FILTER_FLAGS "-fopenmp;-mp;-openmp;-xopenmp=parallel") foreach (FILTER_FLAG ${FILTER_FLAGS}) string(REPLACE ${FILTER_FLAG} "" LAPACK_FFLAGS ${LAPACK_FFLAGS}) string(REPLACE ${FILTER_FLAG} "" LAPACK_FPFLAGS ${LAPACK_FPFLAGS}) From 37858d11462110a9f5b3c28dd6ed5915c6010925 Mon Sep 17 00:00:00 2001 From: Sacha Refshauge Date: Sat, 19 Aug 2017 15:07:42 +1000 Subject: [PATCH 06/16] Fix threading usage in CMake: s/SMP/USE_THREAD/ --- driver/level2/CMakeLists.txt | 8 ++++---- driver/level3/CMakeLists.txt | 10 +++++----- driver/others/CMakeLists.txt | 2 +- lapack/CMakeLists.txt | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/driver/level2/CMakeLists.txt b/driver/level2/CMakeLists.txt index aa5f03107..8fceba905 100644 --- a/driver/level2/CMakeLists.txt +++ b/driver/level2/CMakeLists.txt @@ -73,7 +73,7 @@ GenerateNamedObjects("zgbmv_k.c" "TRANS;CONJ;XCONJ" "gbmv_d" false "" "" "" 2) # special defines for complex foreach (float_type ${FLOAT_TYPES}) - if (SMP) + if (USE_THREAD) GenerateNamedObjects("gemv_thread.c" "" "gemv_thread_n" false "" "" false ${float_type}) GenerateNamedObjects("gemv_thread.c" "TRANSA" "gemv_thread_t" false "" "" false ${float_type}) @@ -107,7 +107,7 @@ foreach (float_type ${FLOAT_TYPES}) GenerateNamedObjects("z${ulvm_source}" "LOWER;HEMVREV" "${op_name}_M" false "" "" false ${float_type}) endforeach() - if (SMP) + if (USE_THREAD) GenerateNamedObjects("gemv_thread.c" "CONJ" "gemv_thread_r" false "" "" false ${float_type}) GenerateNamedObjects("gemv_thread.c" "CONJ;TRANSA" "gemv_thread_c" false "" "" false ${float_type}) @@ -186,7 +186,7 @@ foreach (float_type ${FLOAT_TYPES}) GenerateCombinationObjects("${l_source}" "UNIT" "N" "TRANSA" 0 "${op_name}_TU" false ${float_type}) endforeach () - if (SMP) + if (USE_THREAD) GenerateNamedObjects("ger_thread.c" "" "" false "" "" false ${float_type}) foreach(nu_smp_source ${NU_SMP_SOURCES}) string(REGEX MATCH "[a-z]+_[a-z]+" op_name ${nu_smp_source}) @@ -197,7 +197,7 @@ foreach (float_type ${FLOAT_TYPES}) endif () endforeach () -if (SMP) +if (USE_THREAD) GenerateCombinationObjects("${UL_SMP_SOURCES}" "LOWER" "U" "" 2) endif () diff --git a/driver/level3/CMakeLists.txt b/driver/level3/CMakeLists.txt index c91e85f9c..f788c45b9 100644 --- a/driver/level3/CMakeLists.txt +++ b/driver/level3/CMakeLists.txt @@ -9,7 +9,7 @@ set(GEMM_COMPLEX_DEFINES RN CN RT CT NR TR RR CR NC TC RC CC) foreach (GEMM_DEFINE ${GEMM_DEFINES}) string(TOLOWER ${GEMM_DEFINE} GEMM_DEFINE_LC) GenerateNamedObjects("gemm.c" "${GEMM_DEFINE}" "gemm_${GEMM_DEFINE_LC}" 0) - if (SMP AND NOT USE_SIMPLE_THREADED_LEVEL3) + if (USE_THREAD AND NOT USE_SIMPLE_THREADED_LEVEL3) GenerateNamedObjects("gemm.c" "${GEMM_DEFINE};THREADED_LEVEL3" "gemm_thread_${GEMM_DEFINE_LC}" 0) endif () endforeach () @@ -32,7 +32,7 @@ GenerateCombinationObjects("syrk_k.c" "LOWER;TRANS" "U;N" "" 1) GenerateCombinationObjects("syr2k_k.c" "LOWER;TRANS" "U;N" "" 1) GenerateCombinationObjects("syrk_kernel.c" "LOWER" "U" "" 2) GenerateCombinationObjects("syr2k_kernel.c" "LOWER" "U" "" 2) -if (SMP) +if (USE_THREAD) # N.B. these do NOT have a float type (e.g. DOUBLE) defined! GenerateNamedObjects("gemm_thread_m.c;gemm_thread_n.c;gemm_thread_mn.c;gemm_thread_variable.c;syrk_thread.c" "" "" 0 "" "" 1) @@ -71,7 +71,7 @@ foreach (float_type ${FLOAT_TYPES}) GenerateNamedObjects("zher2k_k.c" "HER2K;LOWER" "her2k_LN" false "" "" false ${float_type}) GenerateNamedObjects("zher2k_k.c" "HER2K;LOWER;TRANS;CONJ" "her2k_LC" false "" "" false ${float_type}) - if (SMP AND NOT USE_SIMPLE_THREADED_LEVEL3) + if (USE_THREAD AND NOT USE_SIMPLE_THREADED_LEVEL3) #herk GenerateCombinationObjects("zherk_k.c" "LOWER" "U" "HERK;THREADED_LEVEL3" 3 "herk_thread_N" false ${float_type}) GenerateCombinationObjects("zherk_k.c" "LOWER" "U" "HERK;THREADED_LEVEL3;TRANS;CONJ" 3 "herk_thread_C" false ${float_type}) @@ -93,7 +93,7 @@ foreach (float_type ${FLOAT_TYPES}) if(USE_GEMM3M) GenerateNamedObjects("gemm3m.c" "${gemm_define}" "gemm3m_${gemm_define_LC}" false "" "" false ${float_type}) endif() - if (SMP AND NOT USE_SIMPLE_THREADED_LEVEL3) + if (USE_THREAD AND NOT USE_SIMPLE_THREADED_LEVEL3) GenerateNamedObjects("gemm.c" "${gemm_define};THREADED_LEVEL3" "gemm_thread_${gemm_define_LC}" false "" "" false ${float_type}) if(USE_GEMM3M) GenerateNamedObjects("gemm3m.c" "${gemm_define};THREADED_LEVEL3" "gemm3m_thread_${gemm_define_LC}" false "" "" false ${float_type}) @@ -106,7 +106,7 @@ foreach (float_type ${FLOAT_TYPES}) foreach (GEMM_DEFINE ${GEMM_DEFINES}) string(TOLOWER ${GEMM_DEFINE} GEMM_DEFINE_LC) GenerateNamedObjects("gemm3m.c" "${GEMM_DEFINE}" "gemm3m_${GEMM_DEFINE_LC}" false "" "" false ${float_type}) - if (SMP AND NOT USE_SIMPLE_THREADED_LEVEL3) + if (USE_THREAD AND NOT USE_SIMPLE_THREADED_LEVEL3) GenerateNamedObjects("gemm3m.c" "${GEMM_DEFINE};THREADED_LEVEL3" "gemm3m_thread_${GEMM_DEFINE_LC}" false "" "" false ${float_type}) endif () endforeach () diff --git a/driver/others/CMakeLists.txt b/driver/others/CMakeLists.txt index 376cc66c4..e20b14e79 100644 --- a/driver/others/CMakeLists.txt +++ b/driver/others/CMakeLists.txt @@ -7,7 +7,7 @@ else () set(MEMORY memory.c) endif () -if (SMP) +if (USE_THREAD) if (USE_OPENMP) set(BLAS_SERVER blas_server_omp.c) diff --git a/lapack/CMakeLists.txt b/lapack/CMakeLists.txt index b613c6c2b..9fb000651 100644 --- a/lapack/CMakeLists.txt +++ b/lapack/CMakeLists.txt @@ -46,7 +46,7 @@ GenerateNamedObjects("${LAPACK_MANGLED_SOURCES}" "" "" false "" "" false 3) GenerateNamedObjects("laswp/generic/laswp_k.c" "" "laswp_plus" false "" "" false 3) GenerateNamedObjects("laswp/generic/laswp_k.c" "MINUS" "laswp_minus" false "" "" false 3) -if (SMP) +if (USE_THREAD) if (USE_OPENMP) set(GETRF_SRC getrf/getrf_parallel_omp.c) From b9ec72546c499591f43a54bf03d11194839a3ccf Mon Sep 17 00:00:00 2001 From: Sacha Refshauge Date: Sun, 20 Aug 2017 00:13:24 +1000 Subject: [PATCH 07/16] Only run utest without NOFORTRAN, same as Makefile. Linux now compiles. --- CMakeLists.txt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index db59f5b3f..bb65944d0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -117,9 +117,9 @@ endforeach () # Not using add_subdirectory here because lapack-netlib already has its own CMakeLists.txt. Instead include a cmake script with the sources we want. if (NOT NOFORTRAN AND NOT NO_LAPACK) include("${PROJECT_SOURCE_DIR}/cmake/lapack.cmake") -if (NOT NO_LAPACKE) - include("${PROJECT_SOURCE_DIR}/cmake/lapacke.cmake") -endif () + if (NOT NO_LAPACKE) + include("${PROJECT_SOURCE_DIR}/cmake/lapacke.cmake") + endif () endif () # Only generate .def for dll on MSVC and always produce pdb files for debug and release @@ -169,7 +169,6 @@ foreach (OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) endforeach() enable_testing() -add_subdirectory(utest) if (USE_THREAD) # Add threading library to linker @@ -183,11 +182,14 @@ if (USE_THREAD) endif() if (NOT MSVC AND NOT NOFORTRAN) + add_subdirectory(utest) # Build test and ctest add_subdirectory(test) - if(NOT NO_CBLAS) + if(NOT NO_CBLAS) add_subdirectory(ctest) endif() +elseif(MSVC) + add_subdirectory(utest) endif() set_target_properties(${OpenBLAS_LIBNAME} PROPERTIES From 4474465438b55fb8204d85477efabd419693742b Mon Sep 17 00:00:00 2001 From: Sacha Refshauge Date: Sun, 20 Aug 2017 00:13:46 +1000 Subject: [PATCH 08/16] Remove _static usages for tests --- ctest/CMakeLists.txt | 6 +++--- test/CMakeLists.txt | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/ctest/CMakeLists.txt b/ctest/CMakeLists.txt index 73070d429..14c9d1944 100644 --- a/ctest/CMakeLists.txt +++ b/ctest/CMakeLists.txt @@ -16,7 +16,7 @@ foreach(float_type ${FLOAT_TYPES}) add_executable(x${float_char}cblat1 c_${float_char}blat1.f c_${float_char}blas1.c) - target_link_libraries(x${float_char}cblat1 ${OpenBLAS_LIBNAME}_static) + target_link_libraries(x${float_char}cblat1 ${OpenBLAS_LIBNAME}) add_test(NAME "x${float_char}cblat1" COMMAND "${CMAKE_CURRENT_BINARY_DIR}/x${float_char}cblat1") @@ -28,7 +28,7 @@ foreach(float_type ${FLOAT_TYPES}) auxiliary.c c_xerbla.c constant.c) - target_link_libraries(x${float_char}cblat2 ${OpenBLAS_LIBNAME}_static) + target_link_libraries(x${float_char}cblat2 ${OpenBLAS_LIBNAME}) add_test(NAME "x${float_char}cblat2" COMMAND sh "${CMAKE_CURRENT_BINARY_DIR}/test_cblas_helper.sh" "${CMAKE_CURRENT_BINARY_DIR}/x${float_char}cblat2" "${PROJECT_SOURCE_DIR}/ctest/${float_char}in2") @@ -40,7 +40,7 @@ foreach(float_type ${FLOAT_TYPES}) auxiliary.c c_xerbla.c constant.c) - target_link_libraries(x${float_char}cblat3 ${OpenBLAS_LIBNAME}_static) + target_link_libraries(x${float_char}cblat3 ${OpenBLAS_LIBNAME}) add_test(NAME "x${float_char}cblat3" COMMAND sh "${CMAKE_CURRENT_BINARY_DIR}/test_cblas_helper.sh" "${CMAKE_CURRENT_BINARY_DIR}/x${float_char}cblat3" "${PROJECT_SOURCE_DIR}/ctest/${float_char}in3") diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 69a1ceb91..adeee3452 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -11,7 +11,7 @@ set(OpenBLAS_Tests foreach(test_bin ${OpenBLAS_Tests}) add_executable(${test_bin} ${test_bin}.f) -target_link_libraries(${test_bin} ${OpenBLAS_LIBNAME}_static) +target_link_libraries(${test_bin} ${OpenBLAS_LIBNAME}) endforeach() # $1 exec, $2 input, $3 output_result From 408b4fe83f1cf592b16b9781840e4f15bb67e59a Mon Sep 17 00:00:00 2001 From: Sacha Refshauge Date: Sun, 20 Aug 2017 00:59:00 +1000 Subject: [PATCH 09/16] Add a CMake GCC and Clang target to Travis CI --- .travis.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/.travis.yml b/.travis.yml index e86f28137..c6d43cd92 100644 --- a/.travis.yml +++ b/.travis.yml @@ -119,6 +119,34 @@ jobs: - TARGET_BOX=LINUX64_MUSL - BTYPE="BINARY=64 NO_AFFINITY=1 USE_OPENMP=0 NO_LAPACK=0 TARGET=core2" + - &test-cmake + stage: test + compiler: clang + addons: + apt: + packages: + - gfortran + - cmake + dist: trusty + sudo: true + before_script: + - COMMON_ARGS="-DTARGET=NEHALEM -DNUM_THREADS=32" + script: + - set -e + - mkdir build + - CONFIG=Release + - cmake -Bbuild -H. $CMAKE_ARGS $COMMON_ARGS -DCMAKE_BUILD_TYPE=$CONFIG + - cmake --build build --config $CONFIG -- -j2 + env: + - CMAKE=1 + - <<: *test-cmake + env: + - CMAKE=1 CMAKE_ARGS="-DNOFORTRAN=1" + - <<: *test-cmake + compiler: gcc + env: + - CMAKE=1 + # whitelist branches: only: From 11911fd941c74341decd07ba27a226ff28d44fb9 Mon Sep 17 00:00:00 2001 From: Sacha Refshauge Date: Sun, 20 Aug 2017 00:59:14 +1000 Subject: [PATCH 10/16] Add kernel/Makefile.LA to CMake --- kernel/CMakeLists.txt | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 849ef21d4..2295829c9 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -464,6 +464,30 @@ function (build_core TARGET_CORE KDIR TSUFFIX KERNEL_DEFINITIONS) GenerateNamedObjects("${KERNELDIR}/${${float_char}GEADD_KERNEL}" "" "geadd_k" false "" "" false ${float_type}) endforeach () + # Makefile.LA + if(NOT NO_LAPACK) + foreach (float_type ${FLOAT_TYPES}) + if (NOT DEFINED ${float_char}NEG_TCOPY) + if (${float_char} STREQUAL "Z" OR ${float_char} STREQUAL "C" OR ${float_char} STREQUAL "X") + set(${float_char}NEG_TCOPY ../generic/zneg_tcopy.c) + else () + set(${float_char}NEG_TCOPY ../generic/neg_tcopy.c) + endif () + endif () + + if (NOT DEFINED ${float_char}LASWP_NCOPY) + if (${float_char} STREQUAL "Z" OR ${float_char} STREQUAL "C" OR ${float_char} STREQUAL "X") + set(${float_char}LASWP_NCOPY ../generic/zlaswp_ncopy.c) + else () + set(${float_char}LASWP_NCOPY ../generic/laswp_ncopy.c) + endif () + endif () + string(SUBSTRING ${float_type} 0 1 float_char) + GenerateNamedObjects("${KERNELDIR}/${${float_char}NEG_TCOPY}_${${float_char}GEMM_UNROLL_M}" "" "neg_tcopy" false "" "" false ${float_type}) + GenerateNamedObjects("${KERNELDIR}/${${float_char}LASWP_NCOPY}_${${float_char}GEMM_UNROLL_N}" "" "laswp_ncopy" false "" "" false ${float_type}) + endforeach() + endif() + if (${DYNAMIC_ARCH}) set(SETPARAM_TARGET_DIR ${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}) file(READ ${CMAKE_CURRENT_SOURCE_DIR}/setparam-ref.c SETPARAM_REF_CONTENTS) @@ -484,9 +508,6 @@ function (build_core TARGET_CORE KDIR TSUFFIX KERNEL_DEFINITIONS) file(REMOVE ${SETPARAM_TARGET_DIR}/kernel${TSUFFIX}.tmp) endif () - # Makefile.LA - #DBLASOBJS += dneg_tcopy$(TSUFFIX).$(SUFFIX) dlaswp_ncopy$(TSUFFIX).$(SUFFIX) - add_library(kernel${TSUFFIX} OBJECT ${OPENBLAS_SRC}) set_target_properties(kernel${TSUFFIX} PROPERTIES COMPILE_FLAGS "${KERNEL_DEFINITIONS}") get_target_property(KERNEL_INCLUDE_DIRECTORIES kernel${TSUFFIX} INCLUDE_DIRECTORIES) From 0a7a527a92d2724d99eb43daa7302d11bd5a7012 Mon Sep 17 00:00:00 2001 From: Sacha Refshauge Date: Sun, 20 Aug 2017 20:08:53 +1000 Subject: [PATCH 11/16] Add support for cross compiling. Add support for not having host compiler as CMake cannot detect such a compiler. Add support for not using getarch. Successfully builds Android ARMV8. Any target can be added by supplying the TARGET_CORE config in prebuild.cmake. --- cmake/prebuild.cmake | 80 ++++++++++++++++++++++++++++++++++++++++++-- cmake/system.cmake | 17 +++++----- 2 files changed, 86 insertions(+), 11 deletions(-) diff --git a/cmake/prebuild.cmake b/cmake/prebuild.cmake index d66b0ccc0..a1b3e0f57 100644 --- a/cmake/prebuild.cmake +++ b/cmake/prebuild.cmake @@ -38,12 +38,19 @@ # CPUIDEMU = ../../cpuid/table.o -# Cannot run getarch on target if we are cross-compiling -if(NOT CMAKE_CROSSCOMPILING) if (DEFINED CPUIDEMU) set(EXFLAGS "-DCPUIDEMU -DVENDOR=99") endif () +if(CMAKE_CROSSCOMPILING AND NOT DEFINED TARGET_CORE) + # Detect target without running getarch + if(AARCH64) + set(TARGET_CORE "ARMV8") + else() + message(FATAL_ERROR "When cross compiling, a TARGET_CORE is required.") + endif() +endif() + if (DEFINED TARGET_CORE) # set the C flags for just this file set(GETARCH2_FLAGS "-DBUILD_KERNEL") @@ -63,6 +70,73 @@ if (NOT NOFORTRAN) include("${PROJECT_SOURCE_DIR}/cmake/f_check.cmake") endif () +# Cannot run getarch on target if we are cross-compiling +if (CMAKE_CROSSCOMPILING) + # Write to config as getarch would + + # TODO: Set up defines that getarch sets up based on every other target + # Perhaps this should be inside a different file as it grows larger + file(APPEND ${TARGET_CONF_TEMP} + "#define ${TARGET_CORE}\n" + "#define CHAR_CORENAME \"${TARGET_CORE}\"\n") + if ("${TARGET_CORE}" STREQUAL "ARMV8") + file(APPEND ${TARGET_CONF_TEMP} + "#define L1_DATA_SIZE\t32768\n" + "#define L1_DATA_LINESIZE\t64\n" + "#define L2_SIZE\t262144\n" + "#define L2_LINESIZE\t64\n" + "#define DTB_DEFAULT_ENTRIES\t64\n" + "#define DTB_SIZE\t4096\n" + "#define L2_ASSOCIATIVE\t32\n") + set(SGEMM_UNROLL_M 4) + set(SGEMM_UNROLL_N 4) + elseif ("${TARGET_CORE}" STREQUAL "CORTEXA57") + file(APPEND ${TARGET_CONF_TEMP} + "#define L1_CODE_SIZE\t49152\n" + "#define L1_CODE_LINESIZE\t64\n" + "#define L1_CODE_ASSOCIATIVE\t3\n" + "#define L1_DATA_SIZE\t32768\n" + "#define L1_DATA_LINESIZE\t64\n" + "#define L1_DATA_ASSOCIATIVE\t2\n" + "#define L2_SIZE\t2097152\n" + "#define L2_LINESIZE\t64\n" + "#define L2_ASSOCIATIVE\t16\n" + "#define DTB_DEFAULT_ENTRIES\t64\n" + "#define DTB_SIZE\t4096\n" + "#define HAVE_VFPV4\n" + "#define HAVE_VFPV3\n" + "#define HAVE_VFP\n" + "#define HAVE_NEON\n") + set(SGEMM_DEFAULT_UNROLL_M 16) + set(SGEMM_DEFAULT_UNROLL_N 4) + set(DGEMM_DEFAULT_UNROLL_M 8) + set(DGEMM_DEFAULT_UNROLL_N 4) + set(CGEMM_DEFAULT_UNROLL_M 8) + set(CGEMM_DEFAULT_UNROLL_N 4) + set(ZGEMM_DEFAULT_UNROLL_M 8) + set(ZGEMM_DEFAULT_UNROLL_N 4) + endif() + + # Or should this actually be NUM_CORES? + if (${NUM_THREADS} GREATER 0) + file(APPEND ${TARGET_CONF_TEMP} "#define NUM_CORES\t${NUM_THREADS}\n") + endif() + + # GetArch_2nd + foreach(float_char S;D;Q;C;Z;X) + if (NOT DEFINED ${float_char}GEMM_UNROLL_M) + set(${float_char}GEMM_UNROLL_M 2) + endif() + if (NOT DEFINED ${float_char}GEMM_UNROLL_N) + set(${float_char}GEMM_UNROLL_N 2) + endif() + endforeach() + file(APPEND ${TARGET_CONF_TEMP} + "#define GEMM_MULTITHREAD_THRESHOLD\t${GEMM_MULTITHREAD_THRESHOLD}\n") + # Move to where gen_config_h would place it + file(RENAME ${TARGET_CONF_TEMP} "${PROJECT_BINARY_DIR}/config.h") + +else() # compile getarch set(GETARCH_SRC ${PROJECT_SOURCE_DIR}/getarch.c @@ -161,4 +235,4 @@ if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") endif () endif () -endif(NOT CMAKE_CROSSCOMPILING) +endif(CMAKE_CROSSCOMPILING) diff --git a/cmake/system.cmake b/cmake/system.cmake index e31e74a42..310b714f0 100644 --- a/cmake/system.cmake +++ b/cmake/system.cmake @@ -12,6 +12,9 @@ set(NETLIB_LAPACK_DIR "${PROJECT_SOURCE_DIR}/lapack-netlib") # TARGET_CORE will override TARGET which is used in DYNAMIC_ARCH=1. if (DEFINED TARGET_CORE) set(TARGET ${TARGET_CORE}) + if(NOT DEFINED CORE) + set(CORE ${TARGET_CORE}) + endif() endif () # Force fallbacks for 32bit @@ -72,8 +75,6 @@ else () set(ONLY_CBLAS 0) endif () -include("${PROJECT_SOURCE_DIR}/cmake/prebuild.cmake") - # N.B. this is NUM_THREAD in Makefile.system which is probably a bug -hpa if (NOT CMAKE_CROSSCOMPILING) if (NOT DEFINED NUM_CORES) @@ -86,22 +87,22 @@ if (NOT CMAKE_CROSSCOMPILING) endif () endif() +if (NOT DEFINED NUM_THREADS) + set(NUM_THREADS 0) +endif() + if (${NUM_THREADS} LESS 2) set(USE_THREAD 0) elseif(NOT DEFINED USE_THREAD) set(USE_THREAD 1) endif () -# TODO: Fix. Isn't working. Was never working in CMake. -# Undefined reference to get_num_procs, blas_thread_shutdown, ... -if (UNIX) - set(USE_THREAD 0) -endif() - if (USE_THREAD) message(STATUS "Multi-threading enabled with ${NUM_THREADS} threads.") endif () +include("${PROJECT_SOURCE_DIR}/cmake/prebuild.cmake") + if (NOT DEFINED NEED_PIC) set(NEED_PIC 1) endif () From 69b560751c8b18784a18e7fb87f9f7d3b8521696 Mon Sep 17 00:00:00 2001 From: Sacha Refshauge Date: Sun, 20 Aug 2017 22:50:31 +1000 Subject: [PATCH 12/16] Improvements to previous commit (cross-compile). Fix typos and bad if statements discovered in 0.2.20. --- cmake/f_check.cmake | 4 - cmake/prebuild.cmake | 229 +++++++++++++++++++++--------------------- cmake/system.cmake | 11 -- kernel/CMakeLists.txt | 2 +- 4 files changed, 113 insertions(+), 133 deletions(-) diff --git a/cmake/f_check.cmake b/cmake/f_check.cmake index 6eee027a5..4848553d9 100644 --- a/cmake/f_check.cmake +++ b/cmake/f_check.cmake @@ -34,11 +34,7 @@ else() endif() if (NOT ONLY_CBLAS) - # N.B. f_check is not cross-platform, so instead try to use CMake variables # run f_check (appends to TARGET files) -# message(STATUS "Running f_check...") -# execute_process(COMMAND perl f_check ${TARGET_MAKE} ${TARGET_CONF} ${CMAKE_Fortran_COMPILER} -# WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) # TODO: detect whether underscore needed, set #defines and BU appropriately - use try_compile # TODO: set FEXTRALIB flags a la f_check? diff --git a/cmake/prebuild.cmake b/cmake/prebuild.cmake index a1b3e0f57..6ecb9f08f 100644 --- a/cmake/prebuild.cmake +++ b/cmake/prebuild.cmake @@ -42,23 +42,12 @@ if (DEFINED CPUIDEMU) set(EXFLAGS "-DCPUIDEMU -DVENDOR=99") endif () -if(CMAKE_CROSSCOMPILING AND NOT DEFINED TARGET_CORE) - # Detect target without running getarch - if(AARCH64) - set(TARGET_CORE "ARMV8") - else() - message(FATAL_ERROR "When cross compiling, a TARGET_CORE is required.") - endif() -endif() - -if (DEFINED TARGET_CORE) +if (BUILD_KERNEL) # set the C flags for just this file set(GETARCH2_FLAGS "-DBUILD_KERNEL") - set(TARGET_MAKE "Makefile_kernel.conf") set(TARGET_CONF "config_kernel.h") set(TARGET_CONF_DIR ${PROJECT_BINARY_DIR}/kernel_config/${TARGET_CORE}) else() - set(TARGET_MAKE "Makefile.conf") set(TARGET_CONF "config.h") set(TARGET_CONF_DIR ${PROJECT_BINARY_DIR}) endif () @@ -70,16 +59,26 @@ if (NOT NOFORTRAN) include("${PROJECT_SOURCE_DIR}/cmake/f_check.cmake") endif () +# This check requires c_check for arch but it should probably be done earlier +if(CMAKE_CROSSCOMPILING AND NOT DEFINED CORE) + # Detect target without running getarch + if(ARM64) + set(CORE "ARMV8") + else() + message(FATAL_ERROR "When cross compiling, a CORE is required.") + endif() +endif() + # Cannot run getarch on target if we are cross-compiling -if (CMAKE_CROSSCOMPILING) +if (DEFINED CORE AND CMAKE_CROSSCOMPILING) # Write to config as getarch would # TODO: Set up defines that getarch sets up based on every other target # Perhaps this should be inside a different file as it grows larger file(APPEND ${TARGET_CONF_TEMP} - "#define ${TARGET_CORE}\n" - "#define CHAR_CORENAME \"${TARGET_CORE}\"\n") - if ("${TARGET_CORE}" STREQUAL "ARMV8") + "#define ${CORE}\n" + "#define CHAR_CORENAME \"${CORE}\"\n") + if ("${CORE}" STREQUAL "ARMV8") file(APPEND ${TARGET_CONF_TEMP} "#define L1_DATA_SIZE\t32768\n" "#define L1_DATA_LINESIZE\t64\n" @@ -90,7 +89,7 @@ if (CMAKE_CROSSCOMPILING) "#define L2_ASSOCIATIVE\t32\n") set(SGEMM_UNROLL_M 4) set(SGEMM_UNROLL_N 4) - elseif ("${TARGET_CORE}" STREQUAL "CORTEXA57") + elseif ("${CORE}" STREQUAL "CORTEXA57") file(APPEND ${TARGET_CONF_TEMP} "#define L1_CODE_SIZE\t49152\n" "#define L1_CODE_LINESIZE\t64\n" @@ -107,14 +106,14 @@ if (CMAKE_CROSSCOMPILING) "#define HAVE_VFPV3\n" "#define HAVE_VFP\n" "#define HAVE_NEON\n") - set(SGEMM_DEFAULT_UNROLL_M 16) - set(SGEMM_DEFAULT_UNROLL_N 4) - set(DGEMM_DEFAULT_UNROLL_M 8) - set(DGEMM_DEFAULT_UNROLL_N 4) - set(CGEMM_DEFAULT_UNROLL_M 8) - set(CGEMM_DEFAULT_UNROLL_N 4) - set(ZGEMM_DEFAULT_UNROLL_M 8) - set(ZGEMM_DEFAULT_UNROLL_N 4) + set(SGEMM_UNROLL_M 16) + set(SGEMM_UNROLL_N 4) + set(DGEMM_UNROLL_M 8) + set(DGEMM_UNROLL_N 4) + set(CGEMM_UNROLL_M 8) + set(CGEMM_UNROLL_N 4) + set(ZGEMM_UNROLL_M 8) + set(ZGEMM_UNROLL_N 4) endif() # Or should this actually be NUM_CORES? @@ -134,105 +133,101 @@ if (CMAKE_CROSSCOMPILING) file(APPEND ${TARGET_CONF_TEMP} "#define GEMM_MULTITHREAD_THRESHOLD\t${GEMM_MULTITHREAD_THRESHOLD}\n") # Move to where gen_config_h would place it - file(RENAME ${TARGET_CONF_TEMP} "${PROJECT_BINARY_DIR}/config.h") + file(RENAME ${TARGET_CONF_TEMP} "${TARGET_CONF_DIR}/${TARGET_CONF}") -else() -# compile getarch -set(GETARCH_SRC - ${PROJECT_SOURCE_DIR}/getarch.c - ${CPUIDEMO} -) - -if ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") - #Use generic for MSVC now - message("MSVC") - set(GETARCH_FLAGS ${GETARCH_FLAGS} -DFORCE_GENERIC) -else() - list(APPEND GETARCH_SRC ${PROJECT_SOURCE_DIR}/cpuid.S) -endif () - -if ("${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") - # disable WindowsStore strict CRT checks - set(GETARCH_FLAGS ${GETARCH_FLAGS} -D_CRT_SECURE_NO_WARNINGS) -endif () - -set(GETARCH_DIR "${PROJECT_BINARY_DIR}/getarch_build") -set(GETARCH_BIN "getarch${CMAKE_EXECUTABLE_SUFFIX}") -file(MAKE_DIRECTORY ${GETARCH_DIR}) -configure_file(${TARGET_CONF_TEMP} ${GETARCH_DIR}/${TARGET_CONF} COPYONLY) -if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") - try_compile(GETARCH_RESULT ${GETARCH_DIR} - SOURCES ${GETARCH_SRC} - COMPILE_DEFINITIONS ${EXFLAGS} ${GETARCH_FLAGS} -I${GETARCH_DIR} -I${PROJECT_SOURCE_DIR} -I${PROJECT_BINARY_DIR} - OUTPUT_VARIABLE GETARCH_LOG - COPY_FILE ${PROJECT_BINARY_DIR}/${GETARCH_BIN} +else(NOT CMAKE_CROSSCOMPILING) + # compile getarch + set(GETARCH_SRC + ${PROJECT_SOURCE_DIR}/getarch.c + ${CPUIDEMU} ) - if (NOT ${GETARCH_RESULT}) - MESSAGE(FATAL_ERROR "Compiling getarch failed ${GETARCH_LOG}") + if ("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") + #Use generic for MSVC now + message("MSVC") + set(GETARCH_FLAGS ${GETARCH_FLAGS} -DFORCE_GENERIC) + else() + list(APPEND GETARCH_SRC ${PROJECT_SOURCE_DIR}/cpuid.S) endif () -endif () -message(STATUS "Running getarch") -# use the cmake binary w/ the -E param to run a shell command in a cross-platform way -execute_process(COMMAND ${PROJECT_BINARY_DIR}/${GETARCH_BIN} 0 OUTPUT_VARIABLE GETARCH_MAKE_OUT) -execute_process(COMMAND ${PROJECT_BINARY_DIR}/${GETARCH_BIN} 1 OUTPUT_VARIABLE GETARCH_CONF_OUT) - -message(STATUS "GETARCH results:\n${GETARCH_MAKE_OUT}") - -# append config data from getarch to the TARGET file and read in CMake vars -file(APPEND ${TARGET_CONF_TEMP} ${GETARCH_CONF_OUT}) -ParseGetArchVars(${GETARCH_MAKE_OUT}) - -set(GETARCH2_DIR "${PROJECT_BINARY_DIR}/getarch2_build") -set(GETARCH2_BIN "getarch_2nd${CMAKE_EXECUTABLE_SUFFIX}") -file(MAKE_DIRECTORY ${GETARCH2_DIR}) -configure_file(${TARGET_CONF_TEMP} ${GETARCH2_DIR}/${TARGET_CONF} COPYONLY) -if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") - try_compile(GETARCH2_RESULT ${GETARCH2_DIR} - SOURCES ${PROJECT_SOURCE_DIR}/getarch_2nd.c - COMPILE_DEFINITIONS ${EXFLAGS} ${GETARCH_FLAGS} ${GETARCH2_FLAGS} -I${GETARCH2_DIR} -I${PROJECT_SOURCE_DIR} -I${PROJECT_BINARY_DIR} - OUTPUT_VARIABLE GETARCH2_LOG - COPY_FILE ${PROJECT_BINARY_DIR}/${GETARCH2_BIN} - ) - - if (NOT ${GETARCH2_RESULT}) - MESSAGE(FATAL_ERROR "Compiling getarch_2nd failed ${GETARCH2_LOG}") + if ("${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") + # disable WindowsStore strict CRT checks + set(GETARCH_FLAGS ${GETARCH_FLAGS} -D_CRT_SECURE_NO_WARNINGS) endif () -endif () -# use the cmake binary w/ the -E param to run a shell command in a cross-platform way -execute_process(COMMAND ${PROJECT_BINARY_DIR}/${GETARCH2_BIN} 0 OUTPUT_VARIABLE GETARCH2_MAKE_OUT) -execute_process(COMMAND ${PROJECT_BINARY_DIR}/${GETARCH2_BIN} 1 OUTPUT_VARIABLE GETARCH2_CONF_OUT) - -# append config data from getarch_2nd to the TARGET file and read in CMake vars -file(APPEND ${TARGET_CONF_TEMP} ${GETARCH2_CONF_OUT}) - -if (${BUILD_KERNEL}) - configure_file(${TARGET_CONF_TEMP} ${PROJECT_BINARY_DIR}/kernel_config/${TARGET_CORE}/${TARGET_CONF} COPYONLY) -else () - configure_file(${TARGET_CONF_TEMP} ${PROJECT_BINARY_DIR}/${TARGET_CONF} COPYONLY) -endif () - -ParseGetArchVars(${GETARCH2_MAKE_OUT}) - -# compile get_config_h -set(GEN_CONFIG_H_DIR "${PROJECT_BINARY_DIR}/genconfig_h_build") -set(GEN_CONFIG_H_BIN "gen_config_h${CMAKE_EXECUTABLE_SUFFIX}") -set(GEN_CONFIG_H_FLAGS "-DVERSION=\"${OpenBLAS_VERSION}\"") -file(MAKE_DIRECTORY ${GEN_CONFIG_H_DIR}) - -if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") - try_compile(GEN_CONFIG_H_RESULT ${GEN_CONFIG_H_DIR} - SOURCES ${PROJECT_SOURCE_DIR}/gen_config_h.c - COMPILE_DEFINITIONS ${EXFLAGS} ${GETARCH_FLAGS} ${GEN_CONFIG_H_FLAGS} -I${PROJECT_SOURCE_DIR} - OUTPUT_VARIABLE GEN_CONFIG_H_LOG - COPY_FILE ${PROJECT_BINARY_DIR}/${GEN_CONFIG_H_BIN} - ) - - if (NOT ${GEN_CONFIG_H_RESULT}) - MESSAGE(FATAL_ERROR "Compiling gen_config_h failed ${GEN_CONFIG_H_LOG}") + set(GETARCH_DIR "${PROJECT_BINARY_DIR}/getarch_build") + set(GETARCH_BIN "getarch${CMAKE_EXECUTABLE_SUFFIX}") + file(MAKE_DIRECTORY ${GETARCH_DIR}) + configure_file(${TARGET_CONF_TEMP} ${GETARCH_DIR}/${TARGET_CONF} COPYONLY) + if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") + try_compile(GETARCH_RESULT ${GETARCH_DIR} + SOURCES ${GETARCH_SRC} + COMPILE_DEFINITIONS ${EXFLAGS} ${GETARCH_FLAGS} -I${GETARCH_DIR} -I${PROJECT_SOURCE_DIR} -I${PROJECT_BINARY_DIR} + OUTPUT_VARIABLE GETARCH_LOG + COPY_FILE ${PROJECT_BINARY_DIR}/${GETARCH_BIN} + ) + + if (NOT ${GETARCH_RESULT}) + MESSAGE(FATAL_ERROR "Compiling getarch failed ${GETARCH_LOG}") + endif () endif () + message(STATUS "Running getarch") + + # use the cmake binary w/ the -E param to run a shell command in a cross-platform way + execute_process(COMMAND ${PROJECT_BINARY_DIR}/${GETARCH_BIN} 0 OUTPUT_VARIABLE GETARCH_MAKE_OUT) + execute_process(COMMAND ${PROJECT_BINARY_DIR}/${GETARCH_BIN} 1 OUTPUT_VARIABLE GETARCH_CONF_OUT) + + message(STATUS "GETARCH results:\n${GETARCH_MAKE_OUT}") + + # append config data from getarch to the TARGET file and read in CMake vars + file(APPEND ${TARGET_CONF_TEMP} ${GETARCH_CONF_OUT}) + ParseGetArchVars(${GETARCH_MAKE_OUT}) + + set(GETARCH2_DIR "${PROJECT_BINARY_DIR}/getarch2_build") + set(GETARCH2_BIN "getarch_2nd${CMAKE_EXECUTABLE_SUFFIX}") + file(MAKE_DIRECTORY ${GETARCH2_DIR}) + configure_file(${TARGET_CONF_TEMP} ${GETARCH2_DIR}/${TARGET_CONF} COPYONLY) + if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") + try_compile(GETARCH2_RESULT ${GETARCH2_DIR} + SOURCES ${PROJECT_SOURCE_DIR}/getarch_2nd.c + COMPILE_DEFINITIONS ${EXFLAGS} ${GETARCH_FLAGS} ${GETARCH2_FLAGS} -I${GETARCH2_DIR} -I${PROJECT_SOURCE_DIR} -I${PROJECT_BINARY_DIR} + OUTPUT_VARIABLE GETARCH2_LOG + COPY_FILE ${PROJECT_BINARY_DIR}/${GETARCH2_BIN} + ) + + if (NOT ${GETARCH2_RESULT}) + MESSAGE(FATAL_ERROR "Compiling getarch_2nd failed ${GETARCH2_LOG}") + endif () + endif () + + # use the cmake binary w/ the -E param to run a shell command in a cross-platform way + execute_process(COMMAND ${PROJECT_BINARY_DIR}/${GETARCH2_BIN} 0 OUTPUT_VARIABLE GETARCH2_MAKE_OUT) + execute_process(COMMAND ${PROJECT_BINARY_DIR}/${GETARCH2_BIN} 1 OUTPUT_VARIABLE GETARCH2_CONF_OUT) + + # append config data from getarch_2nd to the TARGET file and read in CMake vars + file(APPEND ${TARGET_CONF_TEMP} ${GETARCH2_CONF_OUT}) + + configure_file(${TARGET_CONF_TEMP} ${TARGET_CONF_DIR}/${TARGET_CONF} COPYONLY) + + ParseGetArchVars(${GETARCH2_MAKE_OUT}) + + # compile get_config_h + set(GEN_CONFIG_H_DIR "${PROJECT_BINARY_DIR}/genconfig_h_build") + set(GEN_CONFIG_H_BIN "gen_config_h${CMAKE_EXECUTABLE_SUFFIX}") + set(GEN_CONFIG_H_FLAGS "-DVERSION=\"${OpenBLAS_VERSION}\"") + file(MAKE_DIRECTORY ${GEN_CONFIG_H_DIR}) + + if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") + try_compile(GEN_CONFIG_H_RESULT ${GEN_CONFIG_H_DIR} + SOURCES ${PROJECT_SOURCE_DIR}/gen_config_h.c + COMPILE_DEFINITIONS ${EXFLAGS} ${GETARCH_FLAGS} ${GEN_CONFIG_H_FLAGS} -I${PROJECT_SOURCE_DIR} + OUTPUT_VARIABLE GEN_CONFIG_H_LOG + COPY_FILE ${PROJECT_BINARY_DIR}/${GEN_CONFIG_H_BIN} + ) + + if (NOT ${GEN_CONFIG_H_RESULT}) + MESSAGE(FATAL_ERROR "Compiling gen_config_h failed ${GEN_CONFIG_H_LOG}") + endif () endif () -endif(CMAKE_CROSSCOMPILING) +endif() diff --git a/cmake/system.cmake b/cmake/system.cmake index 310b714f0..a66550245 100644 --- a/cmake/system.cmake +++ b/cmake/system.cmake @@ -4,17 +4,9 @@ ## set(NETLIB_LAPACK_DIR "${PROJECT_SOURCE_DIR}/lapack-netlib") -# TODO: Makefile.system detects Darwin (mac) and switches to clang here -hpa -# http://stackoverflow.com/questions/714100/os-detecting-makefile - -# TODO: Makefile.system sets HOSTCC = $(CC) here if not already set -hpa - # TARGET_CORE will override TARGET which is used in DYNAMIC_ARCH=1. if (DEFINED TARGET_CORE) set(TARGET ${TARGET_CORE}) - if(NOT DEFINED CORE) - set(CORE ${TARGET_CORE}) - endif() endif () # Force fallbacks for 32bit @@ -107,9 +99,6 @@ if (NOT DEFINED NEED_PIC) set(NEED_PIC 1) endif () -# TODO: I think CMake should be handling all this stuff -hpa -unset(ARFLAGS) - # OS dependent settings include("${PROJECT_SOURCE_DIR}/cmake/os.cmake") diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 2295829c9..9178ba745 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -22,7 +22,7 @@ function (build_core TARGET_CORE KDIR TSUFFIX KERNEL_DEFINITIONS) if (${ADD_COMMONOBJS}) if (${ARCH} STREQUAL "x86") - if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") + if (NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") GenerateNamedObjects("${KERNELDIR}/cpuid.S" "" "" false "" "" true) else() GenerateNamedObjects("${KERNELDIR}/cpuid_win.c" "" "" false "" "" true) From 47ebce4d1a9b04ebf18c3a11859a07af8114794e Mon Sep 17 00:00:00 2001 From: Sacha Refshauge Date: Mon, 21 Aug 2017 00:37:29 +1000 Subject: [PATCH 13/16] Clean up, fix old typos. Simplify arch usages. Move system arch check to earlier position. --- CMakeLists.txt | 31 ---------- cmake/arch.cmake | 14 ++--- cmake/cc.cmake | 17 ++---- cmake/fc.cmake | 8 +-- cmake/os.cmake | 4 +- cmake/prebuild.cmake | 54 ++++++++++++++---- cmake/system.cmake | 63 +++++++++------------ cmake/{c_check.cmake => system_check.cmake} | 53 ++--------------- kernel/CMakeLists.txt | 4 +- 9 files changed, 94 insertions(+), 154 deletions(-) rename cmake/{c_check.cmake => system_check.cmake} (59%) diff --git a/CMakeLists.txt b/CMakeLists.txt index bb65944d0..235a48747 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,11 +87,6 @@ if (BUILD_COMPLEX16) list(APPEND FLOAT_TYPES "ZCOMPLEX") # defines COMPLEX and DOUBLE endif () -set(SUBDIRS_ALL ${SUBDIRS} test ctest utest exports benchmark ../laswp ../bench) - -# all :: libs netlib tests shared - -# libs : if (NOT DEFINED CORE OR "${CORE}" STREQUAL "UNKNOWN") message(FATAL_ERROR "Detecting CPU failed. Please set TARGET explicitly, e.g. make TARGET=your_cpu_target. Please read README for details.") endif () @@ -125,18 +120,10 @@ endif () # Only generate .def for dll on MSVC and always produce pdb files for debug and release if(MSVC) set(OpenBLAS_DEF_FILE "${PROJECT_BINARY_DIR}/openblas.def") -set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Zi") set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Zi") set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF") endif() -#ifeq ($(DYNAMIC_ARCH), 1) -# @$(MAKE) -C kernel commonlibs || exit 1 -# @for d in $(DYNAMIC_CORE) ; \ -# do $(MAKE) GOTOBLAS_MAKEFILE= -C kernel TARGET_CORE=$$d kernel || exit 1 ;\ -# done -# @echo DYNAMIC_ARCH=1 >> Makefile.conf_last -#endif if (${DYNAMIC_ARCH}) add_subdirectory(kernel) foreach(TARGET_CORE ${DYNAMIC_CORE}) @@ -197,24 +184,6 @@ set_target_properties(${OpenBLAS_LIBNAME} PROPERTIES SOVERSION ${OpenBLAS_MAJOR_VERSION} ) - -# TODO: Why is the config saved here? Is this necessary with CMake? -#Save the config files for installation -# @cp Makefile.conf Makefile.conf_last -# @cp config.h config_last.h -#ifdef QUAD_PRECISION -# @echo "#define QUAD_PRECISION">> config_last.h -#endif -#ifeq ($(EXPRECISION), 1) -# @echo "#define EXPRECISION">> config_last.h -#endif -### - -#ifdef USE_THREAD -# @echo USE_THREAD=$(USE_THREAD) >> Makefile.conf_last -#endif -# @touch lib.grd - # Install project # Install libraries diff --git a/cmake/arch.cmake b/cmake/arch.cmake index bc9a7621c..69a117ca9 100644 --- a/cmake/arch.cmake +++ b/cmake/arch.cmake @@ -3,9 +3,9 @@ ## Description: Ported from portion of OpenBLAS/Makefile.system ## Sets various variables based on architecture. -if (${ARCH} STREQUAL "x86" OR ${ARCH} STREQUAL "x86_64") +if (X86 OR X86_64) - if (${ARCH} STREQUAL "x86") + if (X86) if (NOT BINARY) set(NO_BINARY_MODE 1) endif () @@ -46,11 +46,11 @@ endif () if (DYNAMIC_ARCH) - if (${ARCH} STREQUAL "x86") + if (X86) set(DYNAMIC_CORE KATMAI COPPERMINE NORTHWOOD PRESCOTT BANIAS CORE2 PENRYN DUNNINGTON NEHALEM ATHLON OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO) endif () - if (${ARCH} STREQUAL "x86_64") + if (X86_64) set(DYNAMIC_CORE PRESCOTT CORE2 PENRYN DUNNINGTON NEHALEM OPTERON OPTERON_SSE3 BARCELONA BOBCAT ATOM NANO) if (NOT NO_AVX) set(DYNAMIC_CORE ${DYNAMIC_CORE} SANDYBRIDGE BULLDOZER PILEDRIVER STEAMROLLER EXCAVATOR) @@ -77,7 +77,7 @@ if (${ARCH} STREQUAL "ia64") endif () endif () -if (${ARCH} STREQUAL "mips64") +if (MIPS64) set(NO_BINARY_MODE 1) endif () @@ -86,12 +86,12 @@ if (${ARCH} STREQUAL "alpha") set(BINARY_DEFINED 1) endif () -if (${ARCH} STREQUAL "arm") +if (ARM) set(NO_BINARY_MODE 1) set(BINARY_DEFINED 1) endif () -if (${ARCH} STREQUAL "arm64") +if (ARM64) set(NO_BINARY_MODE 1) set(BINARY_DEFINED 1) endif () diff --git a/cmake/cc.cmake b/cmake/cc.cmake index de196524f..98f9298f8 100644 --- a/cmake/cc.cmake +++ b/cmake/cc.cmake @@ -15,7 +15,7 @@ if (${CMAKE_C_COMPILER} STREQUAL "GNU" OR ${CMAKE_C_COMPILER} STREQUAL "LSB" OR if (NO_BINARY_MODE) - if (${ARCH} STREQUAL "mips64") + if (MIPS64) if (BINARY64) set(CCOMMON_OPT "${CCOMMON_OPT} -mabi=64") else () @@ -24,17 +24,12 @@ if (${CMAKE_C_COMPILER} STREQUAL "GNU" OR ${CMAKE_C_COMPILER} STREQUAL "LSB" OR set(BINARY_DEFINED 1) endif () - if (${CORE} STREQUAL "LOONGSON3A") + if (${CORE} STREQUAL "LOONGSON3A" OR ${CORE} STREQUAL "LOONGSON3B") set(CCOMMON_OPT "${CCOMMON_OPT} -march=mips64") set(FCOMMON_OPT "${FCOMMON_OPT} -march=mips64") endif () - if (${CORE} STREQUAL "LOONGSON3B") - set(CCOMMON_OPT "${CCOMMON_OPT} -march=mips64") - set(FCOMMON_OPT "${FCOMMON_OPT} -march=mips64") - endif () - - if (${OSNAME} STREQUAL "AIX") + if (CMAKE_SYSTEM_NAME STREQUAL "AIX") set(BINARY_DEFINED 1) endif () endif () @@ -66,7 +61,7 @@ endif () if (${CMAKE_C_COMPILER} STREQUAL "OPEN64") - if (${ARCH} STREQUAL "mips64") + if (MIPS64) if (NOT BINARY64) set(CCOMMON_OPT "${CCOMMON_OPT} -n32") @@ -94,10 +89,10 @@ endif () if (${CMAKE_C_COMPILER} STREQUAL "SUN") set(CCOMMON_OPT "${CCOMMON_OPT} -w") - if (${ARCH} STREQUAL "x86") + if (X86) set(CCOMMON_OPT "${CCOMMON_OPT} -m32") else () - set(FCOMMON_OPT "${FCOMMON_OPT} -m64") + set(CCOMMON_OPT "${CCOMMON_OPT} -m64") endif () endif () diff --git a/cmake/fc.cmake b/cmake/fc.cmake index ee9d2051b..f1c69d923 100644 --- a/cmake/fc.cmake +++ b/cmake/fc.cmake @@ -50,7 +50,7 @@ if (${F_COMPILER} STREQUAL "GFORTRAN") set(EXTRALIB "{EXTRALIB} -lgfortran") endif () if (NO_BINARY_MODE) - if (${ARCH} STREQUAL "mips64") + if (MIPS64) if (BINARY64) set(FCOMMON_OPT "${FCOMMON_OPT} -mabi=64") else () @@ -130,7 +130,7 @@ if (${F_COMPILER} STREQUAL "PATHSCALE") endif () endif () - if (NOT ${ARCH} STREQUAL "mips64") + if (NOT MIPS64) if (NOT BINARY64) set(FCOMMON_OPT "${FCOMMON_OPT} -m32") else () @@ -158,7 +158,7 @@ if (${F_COMPILER} STREQUAL "OPEN64") endif () endif () - if (${ARCH} STREQUAL "mips64") + if (MIPS64) if (NOT BINARY64) set(FCOMMON_OPT "${FCOMMON_OPT} -n32") @@ -189,7 +189,7 @@ endif () if (${F_COMPILER} STREQUAL "SUN") set(CCOMMON_OPT "${CCOMMON_OPT} -DF_INTERFACE_SUN") - if (${ARCH} STREQUAL "x86") + if (X86) set(FCOMMON_OPT "${FCOMMON_OPT} -m32") else () set(FCOMMON_OPT "${FCOMMON_OPT} -m64") diff --git a/cmake/os.cmake b/cmake/os.cmake index f50097aaf..1321ef619 100644 --- a/cmake/os.cmake +++ b/cmake/os.cmake @@ -43,7 +43,7 @@ if (${CMAKE_SYSTEM_NAME} STREQUAL "Windows") # Ensure the correct stack alignment on Win32 # http://permalink.gmane.org/gmane.comp.lib.openblas.general/97 - if (${ARCH} STREQUAL "x86") + if (X86) if (NOT MSVC AND NOT ${CMAKE_C_COMPILER_ID} STREQUAL "Clang") set(CCOMMON_OPT "${CCOMMON_OPT} -mincoming-stack-boundary=2") endif () @@ -75,7 +75,7 @@ if (QUAD_PRECISION) set(NO_EXPRECISION 1) endif () -if (${ARCH} STREQUAL "x86") +if (X86) set(NO_EXPRECISION 1) endif () diff --git a/cmake/prebuild.cmake b/cmake/prebuild.cmake index 6ecb9f08f..3b8ab9be6 100644 --- a/cmake/prebuild.cmake +++ b/cmake/prebuild.cmake @@ -53,22 +53,37 @@ else() endif () set(TARGET_CONF_TEMP "${PROJECT_BINARY_DIR}/${TARGET_CONF}.tmp") -include("${PROJECT_SOURCE_DIR}/cmake/c_check.cmake") +# c_check +set(FU "") +if (APPLE OR (MSVC AND NOT ${CMAKE_C_COMPILER_ID} MATCHES "Clang")) + set(FU "_") +endif() + +set(COMPILER_ID ${CMAKE_C_COMPILER_ID}) +if (${COMPILER_ID} STREQUAL "GNU") + set(COMPILER_ID "GCC") +endif () + +string(TOUPPER ${ARCH} UC_ARCH) + +file(WRITE ${TARGET_CONF_TEMP} + "#define OS_${HOST_OS}\t1\n" + "#define ARCH_${UC_ARCH}\t1\n" + "#define C_${COMPILER_ID}\t1\n" + "#define __${BINARY}BIT__\t1\n" + "#define FUNDERSCORE\t${FU}\n") + +if (${HOST_OS} STREQUAL "WINDOWSSTORE") + file(APPEND ${TARGET_CONF_TEMP} + "#define OS_WINNT\t1\n") +endif () + +# f_check if (NOT NOFORTRAN) include("${PROJECT_SOURCE_DIR}/cmake/f_check.cmake") endif () -# This check requires c_check for arch but it should probably be done earlier -if(CMAKE_CROSSCOMPILING AND NOT DEFINED CORE) - # Detect target without running getarch - if(ARM64) - set(CORE "ARMV8") - else() - message(FATAL_ERROR "When cross compiling, a CORE is required.") - endif() -endif() - # Cannot run getarch on target if we are cross-compiling if (DEFINED CORE AND CMAKE_CROSSCOMPILING) # Write to config as getarch would @@ -78,7 +93,22 @@ if (DEFINED CORE AND CMAKE_CROSSCOMPILING) file(APPEND ${TARGET_CONF_TEMP} "#define ${CORE}\n" "#define CHAR_CORENAME \"${CORE}\"\n") - if ("${CORE}" STREQUAL "ARMV8") + if ("${CORE}" STREQUAL "ARMV7") + file(APPEND ${TARGET_CONF_TEMP} + "#define L1_DATA_SIZE\t65536\n" + "#define L1_DATA_LINESIZE\t32\n" + "#define L2_SIZE\t512488\n" + "#define L2_LINESIZE\t32\n" + "#define DTB_DEFAULT_ENTRIES\t64\n" + "#define DTB_SIZE\t4096\n" + "#define L2_ASSOCIATIVE\t4\n" + "#define HAVE_VFPV3\n" + "#define HAVE_VFP\n") + set(SGEMM_UNROLL_M 4) + set(SGEMM_UNROLL_N 4) + set(DGEMM_UNROLL_M 4) + set(DGEMM_UNROLL_N 4) + elseif ("${CORE}" STREQUAL "ARMV8") file(APPEND ${TARGET_CONF_TEMP} "#define L1_DATA_SIZE\t32768\n" "#define L1_DATA_LINESIZE\t64\n" diff --git a/cmake/system.cmake b/cmake/system.cmake index a66550245..daa2683d2 100644 --- a/cmake/system.cmake +++ b/cmake/system.cmake @@ -4,6 +4,26 @@ ## set(NETLIB_LAPACK_DIR "${PROJECT_SOURCE_DIR}/lapack-netlib") +# 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) + set(CORE ${TARGET}) +endif() + # TARGET_CORE will override TARGET which is used in DYNAMIC_ARCH=1. if (DEFINED TARGET_CORE) set(TARGET ${TARGET_CORE}) @@ -56,7 +76,7 @@ if (NOT DEFINED NO_PARALLEL_MAKE) endif () set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_PARALLEL_MAKE=${NO_PARALLEL_MAKE}") -if (CMAKE_CXX_COMPILER STREQUAL loongcc) +if (CMAKE_C_COMPILER STREQUAL loongcc) set(GETARCH_FLAGS "${GETARCH_FLAGS} -static") endif () @@ -75,6 +95,7 @@ if (NOT CMAKE_CROSSCOMPILING) endif() if (NOT NUM_CORES EQUAL 0) + # HT? set(NUM_THREADS ${NUM_CORES}) endif () endif() @@ -153,7 +174,7 @@ if (NO_AVX) set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX") endif () -if (${ARCH} STREQUAL "x86") +if (X86) set(CCOMMON_OPT "${CCOMMON_OPT} -DNO_AVX") endif () @@ -166,7 +187,7 @@ if (USE_THREAD) # NO_AFFINITY = 1 set(CCOMMON_OPT "${CCOMMON_OPT} -DSMP_SERVER") - if (${ARCH} STREQUAL "mips64") + if (MIPS64) if (NOT ${CORE} STREQUAL "LOONGSON3B") set(USE_SIMPLE_THREADED_LEVEL3 1) endif () @@ -237,7 +258,7 @@ if (NOT ${CMAKE_SYSTEM_NAME} STREQUAL "Linux") set(NO_AFFINITY 1) endif () -if (NOT ${ARCH} STREQUAL "x86_64" AND NOT ${ARCH} STREQUAL "x86" AND NOT ${CORE} STREQUAL "LOONGSON3B") +if (NOT X86_64 AND NOT X86 AND NOT ${CORE} STREQUAL "LOONGSON3B") set(NO_AFFINITY 1) endif () @@ -377,7 +398,7 @@ endif () set(USE_GEMM3M 0) if (DEFINED ARCH) - if (${ARCH} STREQUAL "x86" OR ${ARCH} STREQUAL "x86_64" OR ${ARCH} STREQUAL "ia64" OR ${ARCH} STREQUAL "MIPS") + if (X86 OR X86_64 OR ${ARCH} STREQUAL "ia64" OR MIPS64) set(USE_GEMM3M 1) endif () @@ -460,35 +481,3 @@ endif () # export CUFLAGS # export CULIB #endif - -#.SUFFIXES: .$(PSUFFIX) .$(SUFFIX) .f -# -#.f.$(SUFFIX): -# $(FC) $(FFLAGS) -c $< -o $(@F) -# -#.f.$(PSUFFIX): -# $(FC) $(FPFLAGS) -pg -c $< -o $(@F) - -# these are not cross-platform -#ifdef BINARY64 -#PATHSCALEPATH = /opt/pathscale/lib/3.1 -#PGIPATH = /opt/pgi/linux86-64/7.1-5/lib -#else -#PATHSCALEPATH = /opt/pathscale/lib/3.1/32 -#PGIPATH = /opt/pgi/linux86/7.1-5/lib -#endif - -#ACMLPATH = /opt/acml/4.3.0 -#ifneq ($(OSNAME), Darwin) -#MKLPATH = /opt/intel/mkl/10.2.2.025/lib -#else -#MKLPATH = /Library/Frameworks/Intel_MKL.framework/Versions/10.0.1.014/lib -#endif -#ATLASPATH = /opt/atlas/3.9.17/opteron -#FLAMEPATH = $(HOME)/flame/lib -#ifneq ($(OSNAME), SunOS) -#SUNPATH = /opt/sunstudio12.1 -#else -#SUNPATH = /opt/SUNWspro -#endif - diff --git a/cmake/c_check.cmake b/cmake/system_check.cmake similarity index 59% rename from cmake/c_check.cmake rename to cmake/system_check.cmake index 99590c975..d47c38cdd 100644 --- a/cmake/c_check.cmake +++ b/cmake/system_check.cmake @@ -4,32 +4,6 @@ ## This is triggered by prebuild.cmake and runs before any of the code is built. ## Creates config.h and Makefile.conf. -# CMake vars set by this file: -# OSNAME (use CMAKE_SYSTEM_NAME) -# ARCH -# C_COMPILER (use CMAKE_C_COMPILER) -# BINARY32 -# BINARY64 -# FU -# CROSS_SUFFIX -# CROSS -# CEXTRALIB - -# Defines set by this file: -# OS_ -# ARCH_ -# C_ -# __32BIT__ -# __64BIT__ -# FUNDERSCORE -# PTHREAD_CREATE_FUNC - -# N.B. c_check (and ctest.c) is not cross-platform, so instead try to use CMake variables. -set(FU "") -if (APPLE OR (MSVC AND NOT ${CMAKE_C_COMPILER_ID} MATCHES "Clang")) - set(FU "_") -endif() - # Convert CMake vars into the format that OpenBLAS expects string(TOUPPER ${CMAKE_SYSTEM_NAME} HOST_OS) if (${HOST_OS} STREQUAL "WINDOWS") @@ -37,7 +11,7 @@ if (${HOST_OS} STREQUAL "WINDOWS") endif () if(CMAKE_COMPILER_IS_GNUCC AND WIN32) - execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine + execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpmachine OUTPUT_VARIABLE OPENBLAS_GCC_TARGET_MACHINE OUTPUT_STRIP_TRAILING_WHITESPACE) if(OPENBLAS_GCC_TARGET_MACHINE MATCHES "amd64|x86_64|AMD64") @@ -50,8 +24,10 @@ if(CMAKE_CL_64 OR MINGW64) set(X86_64 1) elseif(MINGW OR (MSVC AND NOT CMAKE_CROSSCOMPILING)) set(X86 1) -elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc") +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "ppc.*|power.*|Power.*") set(PPC 1) +elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "mips64.*") + set(MIPS64 1) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "amd64.*|x86_64.*|AMD64.*") set(X86_64 1) elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "i686.*|i386.*|x86.*|amd64.*|AMD64.*") @@ -77,7 +53,7 @@ else() endif () if (NOT BINARY) - if (X86_64 OR ARM64 OR PPC OR ARCH STREQUAL "mips64") + if (X86_64 OR ARM64 OR PPC OR MIPS64) set(BINARY 64) else () set(BINARY 32) @@ -90,22 +66,3 @@ else() set(BINARY32 1) endif() -set(COMPILER_ID ${CMAKE_C_COMPILER_ID}) -if (${COMPILER_ID} STREQUAL "GNU") - set(COMPILER_ID "GCC") -endif () - -string(TOUPPER ${ARCH} UC_ARCH) - -file(WRITE ${TARGET_CONF_TEMP} - "#define OS_${HOST_OS}\t1\n" - "#define ARCH_${UC_ARCH}\t1\n" - "#define C_${COMPILER_ID}\t1\n" - "#define __${BINARY}BIT__\t1\n" - "#define FUNDERSCORE\t${FU}\n") - -if (${HOST_OS} STREQUAL "WINDOWSSTORE") - file(APPEND ${TARGET_CONF_TEMP} - "#define OS_WINNT\t1\n") -endif () - diff --git a/kernel/CMakeLists.txt b/kernel/CMakeLists.txt index 9178ba745..09e513ca5 100644 --- a/kernel/CMakeLists.txt +++ b/kernel/CMakeLists.txt @@ -21,7 +21,7 @@ function (build_core TARGET_CORE KDIR TSUFFIX KERNEL_DEFINITIONS) endif () if (${ADD_COMMONOBJS}) - if (${ARCH} STREQUAL "x86") + if (X86) if (NOT "${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") GenerateNamedObjects("${KERNELDIR}/cpuid.S" "" "" false "" "" true) else() @@ -121,7 +121,7 @@ function (build_core TARGET_CORE KDIR TSUFFIX KERNEL_DEFINITIONS) # Makefile.L3 set(USE_TRMM false) - if (${ARCH} STREQUAL "arm" OR ${ARCH} STREQUAL "arm64" OR "${TARGET}" STREQUAL "LONGSOON3B" OR "${TARGET}" STREQUAL "GENERIC" OR "${CORE}" STREQUAL "generic" OR "${TARGET}" STREQUAL "HASWELL" OR "${CORE}" STREQUAL "haswell" OR "{CORE}" STREQUAL "zen") + if (ARM OR ARM64 OR "${TARGET}" STREQUAL "LONGSOON3B" OR "${TARGET}" STREQUAL "GENERIC" OR "${CORE}" STREQUAL "generic" OR "${TARGET}" STREQUAL "HASWELL" OR "${CORE}" STREQUAL "haswell" OR "{CORE}" STREQUAL "zen") set(USE_TRMM true) endif () From a1b87eac6bbe140aceb28d50e585979df471a460 Mon Sep 17 00:00:00 2001 From: Sacha Refshauge Date: Wed, 23 Aug 2017 07:19:02 +1000 Subject: [PATCH 14/16] Do not require Perl for MSVC if CMake >= 3.4 --- CMakeLists.txt | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 235a48747..be6729974 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -119,9 +119,11 @@ endif () # Only generate .def for dll on MSVC and always produce pdb files for debug and release if(MSVC) -set(OpenBLAS_DEF_FILE "${PROJECT_BINARY_DIR}/openblas.def") -set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Zi") -set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF") + if (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 3.4) + set(OpenBLAS_DEF_FILE "${PROJECT_BINARY_DIR}/openblas.def") + endif() + set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} /Zi") + set(CMAKE_SHARED_LINKER_FLAGS_RELEASE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE} /DEBUG /OPT:REF /OPT:ICF") endif() if (${DYNAMIC_ARCH}) @@ -141,7 +143,15 @@ endif() # add objects to the openblas lib add_library(${OpenBLAS_LIBNAME} ${LA_SOURCES} ${LAPACKE_SOURCES} ${TARGET_OBJS} ${OpenBLAS_DEF_FILE}) -include("${PROJECT_SOURCE_DIR}/cmake/export.cmake") +# Handle MSVC exports +if(MSVC AND BUILD_SHARED_LIBS) + if (${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION} LESS 3.4) + include("${PROJECT_SOURCE_DIR}/cmake/export.cmake") + else() + # Creates verbose .def file (51KB vs 18KB) + set_target_properties(${OpenBLAS_LIBNAME} PROPERTIES WINDOWS_EXPORT_ALL_SYMBOLS true) + endif() +endif() # Set output for libopenblas set_target_properties( ${OpenBLAS_LIBNAME} PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib) @@ -164,7 +174,6 @@ if (USE_THREAD) set_property(TARGET ${OpenBLAS_LIBNAME} PROPERTY COMPILE_OPTIONS "-pthread") set_property(TARGET ${OpenBLAS_LIBNAME} PROPERTY INTERFACE_COMPILE_OPTIONS "-pthread") endif() - message("PTHREAD: ${CMAKE_THREAD_LIBS_INIT}") target_link_libraries(${OpenBLAS_LIBNAME} ${CMAKE_THREAD_LIBS_INIT}) endif() From 7a867082d84905be5efcc39c820a23e7aa19eff0 Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 23 Aug 2017 11:16:24 +1000 Subject: [PATCH 15/16] Fix open_blas.config which was never working out-of-source. Remove need for gen_config_h.exe. If OpenMP is requested, do not silently ignore when it isn't available. --- CMakeLists.txt | 27 +++++++++++++++------------ cmake/arch.cmake | 4 +--- cmake/prebuild.cmake | 19 ------------------- 3 files changed, 16 insertions(+), 34 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index be6729974..da13f8a0b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -199,18 +199,21 @@ set_target_properties(${OpenBLAS_LIBNAME} PROPERTIES install(TARGETS ${OpenBLAS_LIBNAME} RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ) - -# Install include files -set (GENCONFIG_BIN ${CMAKE_BINARY_DIR}/gen_config_h${CMAKE_EXECUTABLE_SUFFIX}) - -execute_process(COMMAND ${GENCONFIG_BIN} - ${CMAKE_CURRENT_SOURCE_DIR}/config.h - ${CMAKE_CURRENT_SOURCE_DIR}/openblas_config_template.h - OUTPUT_VARIABLE OPENBLAS_CONFIG_H_CONTENTS) - -file(WRITE ${CMAKE_BINARY_DIR}/openblas_config.tmp "${OPENBLAS_CONFIG_H_CONTENTS}") -configure_file(${CMAKE_BINARY_DIR}/openblas_config.tmp ${CMAKE_BINARY_DIR}/openblas_config.h COPYONLY) + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ) + +set(OPENBLAS_TMP ${CMAKE_BINARY_DIR}/openblas_config.tmp) +file(WRITE ${OPENBLAS_TMP} "#ifndef OPENBLAS_CONFIG_H\n") +file(APPEND ${OPENBLAS_TMP} "#define OPENBLAS_CONFIG_H\n") +file(STRINGS ${PROJECT_BINARY_DIR}/config.h __lines) +foreach(line ${__lines}) + string(REPLACE "#define " "" line ${line}) + file(APPEND ${OPENBLAS_TMP} "#define OPENBLAS_${line}\n") +endforeach() +file(APPEND ${OPENBLAS_TMP} "#define OPENBLAS_VERSION \"OpenBLAS ${OpenBLAS_VERSION}\"\n") +file(READ ${CMAKE_CURRENT_SOURCE_DIR}/openblas_config_template.h __template) +file(APPEND ${OPENBLAS_TMP} "${__template}") +file(APPEND ${OPENBLAS_TMP} "#endif /* OPENBLAS_CONFIG_H */\n") +configure_file(${OPENBLAS_TMP} ${CMAKE_BINARY_DIR}/openblas_config.h COPYONLY) install (FILES ${CMAKE_BINARY_DIR}/openblas_config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) diff --git a/cmake/arch.cmake b/cmake/arch.cmake index 69a117ca9..798a9ef82 100644 --- a/cmake/arch.cmake +++ b/cmake/arch.cmake @@ -35,12 +35,10 @@ endif () if (USE_OPENMP) # USE_SIMPLE_THREADED_LEVEL3 = 1 # NO_AFFINITY = 1 - find_package(OpenMP) + find_package(OpenMP REQUIRED) if (OpenMP_FOUND) set(CCOMMON_OPT "${CCOMMON_OPT} ${OpenMP_C_FLAGS} -DUSE_OPENMP") set(FCOMMON_OPT "${FCOMMON_OPT} ${OpenMP_Fortran_FLAGS}") - elseif (UNIX) - set(USE_OPENMP 0) endif() endif () diff --git a/cmake/prebuild.cmake b/cmake/prebuild.cmake index 3b8ab9be6..cc5475630 100644 --- a/cmake/prebuild.cmake +++ b/cmake/prebuild.cmake @@ -241,23 +241,4 @@ else(NOT CMAKE_CROSSCOMPILING) ParseGetArchVars(${GETARCH2_MAKE_OUT}) - # compile get_config_h - set(GEN_CONFIG_H_DIR "${PROJECT_BINARY_DIR}/genconfig_h_build") - set(GEN_CONFIG_H_BIN "gen_config_h${CMAKE_EXECUTABLE_SUFFIX}") - set(GEN_CONFIG_H_FLAGS "-DVERSION=\"${OpenBLAS_VERSION}\"") - file(MAKE_DIRECTORY ${GEN_CONFIG_H_DIR}) - - if (NOT "${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") - try_compile(GEN_CONFIG_H_RESULT ${GEN_CONFIG_H_DIR} - SOURCES ${PROJECT_SOURCE_DIR}/gen_config_h.c - COMPILE_DEFINITIONS ${EXFLAGS} ${GETARCH_FLAGS} ${GEN_CONFIG_H_FLAGS} -I${PROJECT_SOURCE_DIR} - OUTPUT_VARIABLE GEN_CONFIG_H_LOG - COPY_FILE ${PROJECT_BINARY_DIR}/${GEN_CONFIG_H_BIN} - ) - - if (NOT ${GEN_CONFIG_H_RESULT}) - MESSAGE(FATAL_ERROR "Compiling gen_config_h failed ${GEN_CONFIG_H_LOG}") - endif () -endif () - endif() From ef64991506c88486ed84611e40956d89f868d624 Mon Sep 17 00:00:00 2001 From: Sacha Date: Wed, 23 Aug 2017 12:47:38 +1000 Subject: [PATCH 16/16] Clean up config file writing. --- CMakeLists.txt | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index da13f8a0b..771764e2e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -177,15 +177,17 @@ if (USE_THREAD) target_link_libraries(${OpenBLAS_LIBNAME} ${CMAKE_THREAD_LIBS_INIT}) endif() -if (NOT MSVC AND NOT NOFORTRAN) +if (MSVC OR NOT NOFORTRAN) + # Broken without fortran on unix add_subdirectory(utest) +endif() + +if (NOT MSVC AND NOT NOFORTRAN) # Build test and ctest add_subdirectory(test) if(NOT NO_CBLAS) add_subdirectory(ctest) endif() -elseif(MSVC) - add_subdirectory(utest) endif() set_target_properties(${OpenBLAS_LIBNAME} PROPERTIES @@ -201,31 +203,33 @@ install(TARGETS ${OpenBLAS_LIBNAME} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} ) -set(OPENBLAS_TMP ${CMAKE_BINARY_DIR}/openblas_config.tmp) -file(WRITE ${OPENBLAS_TMP} "#ifndef OPENBLAS_CONFIG_H\n") -file(APPEND ${OPENBLAS_TMP} "#define OPENBLAS_CONFIG_H\n") +message(STATUS "Generating openblas_config.h in ${CMAKE_INSTALL_INCLUDEDIR}") + +set(OPENBLAS_CONFIG_H ${CMAKE_BINARY_DIR}/openblas_config.h) +file(WRITE ${OPENBLAS_CONFIG_H} "#ifndef OPENBLAS_CONFIG_H\n") +file(APPEND ${OPENBLAS_CONFIG_H} "#define OPENBLAS_CONFIG_H\n") file(STRINGS ${PROJECT_BINARY_DIR}/config.h __lines) foreach(line ${__lines}) string(REPLACE "#define " "" line ${line}) - file(APPEND ${OPENBLAS_TMP} "#define OPENBLAS_${line}\n") + file(APPEND ${OPENBLAS_CONFIG_H} "#define OPENBLAS_${line}\n") endforeach() -file(APPEND ${OPENBLAS_TMP} "#define OPENBLAS_VERSION \"OpenBLAS ${OpenBLAS_VERSION}\"\n") -file(READ ${CMAKE_CURRENT_SOURCE_DIR}/openblas_config_template.h __template) -file(APPEND ${OPENBLAS_TMP} "${__template}") -file(APPEND ${OPENBLAS_TMP} "#endif /* OPENBLAS_CONFIG_H */\n") -configure_file(${OPENBLAS_TMP} ${CMAKE_BINARY_DIR}/openblas_config.h COPYONLY) - -install (FILES ${CMAKE_BINARY_DIR}/openblas_config.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) +file(APPEND ${OPENBLAS_CONFIG_H} "#define OPENBLAS_VERSION \"OpenBLAS ${OpenBLAS_VERSION}\"\n") +file(READ ${CMAKE_CURRENT_SOURCE_DIR}/openblas_config_template.h OPENBLAS_CONFIG_TEMPLATE_H_CONTENTS) +file(APPEND ${OPENBLAS_CONFIG_H} "${OPENBLAS_CONFIG_TEMPLATE_H_CONTENTS}\n") +file(APPEND ${OPENBLAS_CONFIG_H} "#endif /* OPENBLAS_CONFIG_H */\n") +install (FILES ${OPENBLAS_CONFIG_H} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) if(NOT NOFORTRAN) message(STATUS "Generating f77blas.h in ${CMAKE_INSTALL_INCLUDEDIR}") - file(WRITE ${CMAKE_BINARY_DIR}/f77blas.h "") - file(APPEND ${CMAKE_BINARY_DIR}/f77blas.h "#ifndef OPENBLAS_F77BLAS_H\n#define OPENBLAS_F77BLAS_H\n#include \"openblas_config.h\"\n") + set(F77BLAS_H ${CMAKE_BINARY_DIR}/f77blas.h) + file(WRITE ${F77BLAS_H} "#ifndef OPENBLAS_F77BLAS_H\n") + file(APPEND ${F77BLAS_H} "#define OPENBLAS_F77BLAS_H\n") + file(APPEND ${F77BLAS_H} "#include \"openblas_config.h\"\n") file(READ ${CMAKE_CURRENT_SOURCE_DIR}/common_interface.h COMMON_INTERFACE_H_CONTENTS) - file(APPEND ${CMAKE_BINARY_DIR}/f77blas.h "${COMMON_INTERFACE_H_CONTENTS}") - file(APPEND ${CMAKE_BINARY_DIR}/f77blas.h "#endif") - install (FILES ${CMAKE_BINARY_DIR}/f77blas.h DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + file(APPEND ${F77BLAS_H} "${COMMON_INTERFACE_H_CONTENTS}\n") + file(APPEND ${F77BLAS_H} "#endif") + install (FILES ${F77BLAS_H} DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) endif() if(NOT NO_CBLAS)