| @@ -65,3 +65,4 @@ test/sblat3 | |||||
| test/zblat1 | test/zblat1 | ||||
| test/zblat2 | test/zblat2 | ||||
| test/zblat3 | test/zblat3 | ||||
| build | |||||
| @@ -0,0 +1,18 @@ | |||||
| ## | |||||
| ## Author: Hank Anderson <hank@statease.com> | |||||
| ## Copyright: (c) Stat-Ease, Inc. | |||||
| ## Created: 12/23/14 | |||||
| ## Last Modified: 12/23/14 | |||||
| ## | |||||
| cmake_minimum_required(VERSION 2.8.4) | |||||
| project(OpenBLAS) | |||||
| # is this necessary? lapack-netlib has its own fortran checks in its CMakeLists.txt | |||||
| #enable_language(Fortran) | |||||
| message(WARNING "CMake support is experimental. This will not produce the same Makefiles that OpenBLAS ships with.") | |||||
| include("${CMAKE_SOURCE_DIR}/cmake/system.cmake") | |||||
| @@ -0,0 +1,29 @@ | |||||
| ## | |||||
| ## Author: Hank Anderson <hank@statease.com> | |||||
| ## Copyright: (c) Stat-Ease, Inc. | |||||
| ## Created: 12/29/14 | |||||
| ## Last Modified: 12/29/14 | |||||
| ## Description: Ported from the OpenBLAS/c_check perl script. | |||||
| ## This is triggered by prebuild.cmake and runs before any of the code is built. | |||||
| ## Creates config.h and Makefile.conf. | |||||
| # N.B. c_check is not cross-platform, so instead try to use CMake variables. Alternatively, could use try_compile to get some of this info the same way c_check does. | |||||
| # run c_check (creates the TARGET files) | |||||
| # message(STATUS "Running c_check...") | |||||
| # execute_process(COMMAND perl c_check ${TARGET_MAKE} ${TARGET_CONF} ${CMAKE_CXX_COMPILER} | |||||
| # WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) | |||||
| # TODO: is ${BINARY} sufficient for the __32BIT__ define? | |||||
| # TODO: CMAKE_SYSTEM_PROCESSOR is not set by CMake, need to set it manually when doing a cross-compile | |||||
| # TODO: CMAKE_CXX_COMPILER_ID and CMAKE_SYSTEM_NAME are probably not the same strings as OpenBLAS is expecting | |||||
| # TODO: detect this | |||||
| set(NEED_FU 1) | |||||
| file(WRITE ${TARGET_CONF} | |||||
| "#define OS_${CMAKE_SYSTEM_NAME}\t1\n" | |||||
| "#define ARCH_${CMAKE_SYSTEM_PROCESSOR}\t1\n" | |||||
| "#define C_${CMAKE_CXX_COMPILER_ID}\t1\n" | |||||
| "#define __${BINARY}BIT__\t1\n" | |||||
| "#define FUNDERSCORE\t${NEED_FU}\n") | |||||
| @@ -0,0 +1,37 @@ | |||||
| ## | |||||
| ## Author: Hank Anderson <hank@statease.com> | |||||
| ## Copyright: (c) Stat-Ease, Inc. | |||||
| ## Created: 12/29/14 | |||||
| ## Last Modified: 12/29/14 | |||||
| ## Description: Ported from the OpenBLAS/f_check perl script. | |||||
| ## This is triggered by prebuild.cmake and runs before any of the code is built. | |||||
| ## Appends Fortran information to config.h and Makefile.conf. | |||||
| 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: is BU makefile macro needed? | |||||
| # TODO: detect whether underscore needed, set #defines appropriately - use try_compile | |||||
| # TODO: set FEXTRALIB flags a la f_check? | |||||
| set(BU "_") | |||||
| file(APPEND ${TARGET_CONF} | |||||
| "#define BUNDERSCORE _\n" | |||||
| "#define NEEDBUNDERSCORE 1\n" | |||||
| "#define NEED2UNDERSCORES 0\n") | |||||
| else () | |||||
| #When we only build CBLAS, we set NOFORTRAN=2 | |||||
| set(NOFORTRAN 2) | |||||
| set(NO_FBLAS 1) | |||||
| set(BU "_") | |||||
| file(APPEND ${TARGET_CONF} | |||||
| "#define BUNDERSCORE _\n" | |||||
| "#define NEEDBUNDERSCORE 1\n") | |||||
| endif() | |||||
| @@ -0,0 +1,55 @@ | |||||
| ## | |||||
| ## Author: Hank Anderson <hank@statease.com> | |||||
| ## Copyright: (c) Stat-Ease, Inc. | |||||
| ## Created: 12/29/14 | |||||
| ## Last Modified: 12/29/14 | |||||
| ## Description: Ported from OpenBLAS/Makefile.prebuild | |||||
| ## This is triggered by system.cmake and runs before any of the code is built. | |||||
| ## Creates config.h and Makefile.conf by first running the c_check perl script (which creates those files). | |||||
| ## Next it runs f_check and appends some fortran information to the files. | |||||
| ## Finally it runs getarch and getarch_2nd for even more environment information. | |||||
| # CPUIDEMU = ../../cpuid/table.o | |||||
| if (DEFINED CPUIDEMU) | |||||
| set(EXFLAGS "-DCPUIDEMU -DVENDOR=99") | |||||
| endif () | |||||
| if (DEFINED TARGET_CORE) | |||||
| # set the C flags for just this file | |||||
| set_source_files_properties(getarch_2nd.c PROPERTIES COMPILE_FLAGS "-DBUILD_KERNEL") | |||||
| set(TARGET_MAKE "Makefile_kernel.conf") | |||||
| set(TARGET_CONF "config_kernel.h") | |||||
| else() | |||||
| set(TARGET_MAKE "Makefile.conf") | |||||
| set(TARGET_CONF "config.h") | |||||
| endif () | |||||
| include("${CMAKE_SOURCE_DIR}/cmake/c_check.cmake") | |||||
| include("${CMAKE_SOURCE_DIR}/cmake/f_check.cmake") | |||||
| # compile getarch | |||||
| # TODO: need to use execute_process here, or compilation won't happen until later - maybe make temporary CMakeLists.txt file using file() ? | |||||
| #add_executable(getarch getarch.c cpuid.S ${CPUIDEMU} | |||||
| # WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) | |||||
| # | |||||
| ## run getarch, which appends even more to the TARGET files | |||||
| #message(STATUS "Running getarch") | |||||
| #execute_process(COMMAND getarch 0 >> ${TARGET_MAKE} | |||||
| # WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) | |||||
| #execute_process(COMMAND getarch 1 >> ${TARGET_CONF} | |||||
| # WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) | |||||
| # | |||||
| ## config.h is ready for getarch_2nd now, so compile that | |||||
| #set(GETARCH2_SOURCES getarch_2nd.c config.h) | |||||
| #add_executable(getarch_2nd getarch_2nd.c config.h) | |||||
| # | |||||
| ## finally run getarch_2nd, appending yet more to the TARGET files | |||||
| #message(STATUS "Running getarch_2nd") | |||||
| #execute_process(COMMAND getarch_2nd 0 >> ${TARGET_MAKE} | |||||
| # WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) | |||||
| #execute_process(COMMAND getarch_2nd 1 >> ${TARGET_CONF} | |||||
| # WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}) | |||||
| # TODO: need to read in the vars from Makefile.conf/Makefile_kernel.conf | |||||
| @@ -0,0 +1,130 @@ | |||||
| ## | |||||
| ## Author: Hank Anderson <hank@statease.com> | |||||
| ## Copyright: (c) Stat-Ease, Inc. | |||||
| ## Created: 12/29/14 | |||||
| ## Last Modified: 12/29/14 | |||||
| ## Description: Ported from OpenBLAS/Makefile.system | |||||
| ## | |||||
| set(NETLIB_LAPACK_DIR "${CMAKE_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}) | |||||
| 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) | |||||
| if (${TARGET} STREQUAL "HASWELL" OR ${TARGET} STREQUAL "SANDYBRIDGE") | |||||
| set(TARGET "NEHALEM") | |||||
| endif () | |||||
| if (${TARGET} STREQUAL "BULLDOZER" OR ${TARGET} STREQUAL "PILEDRIVER") | |||||
| set(TARGET "BARCELONA") | |||||
| endif () | |||||
| endif () | |||||
| if (DEFINED TARGET) | |||||
| message(STATUS "Targetting the ${TARGET} architecture.") | |||||
| set(GETARCH_FLAGS "-DFORCE_${TARGET}") | |||||
| endif () | |||||
| if (${INTERFACE64}) | |||||
| 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}") | |||||
| if (${NO_AVX}) | |||||
| message(STATUS "Disabling Advanced Vector Extensions (AVX).") | |||||
| set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX") | |||||
| endif () | |||||
| if (${NO_AVX2}) | |||||
| message(STATUS "Disabling Advanced Vector Extensions 2 (AVX2).") | |||||
| set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_AVX2") | |||||
| endif () | |||||
| 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 () | |||||
| set(GETARCH_FLAGS "${GETARCH_FLAGS} -DNO_PARALLEL_MAKE=${NO_PARALLEL_MAKE}") | |||||
| if (CMAKE_CXX_COMPILER STREQUAL loongcc) | |||||
| set(GETARCH_FLAGS "${GETARCH_FLAGS} -static") | |||||
| endif () | |||||
| #if don't use Fortran, it will only compile CBLAS. | |||||
| if (${ONLY_CBLAS}) | |||||
| set(NO_LAPACK 1) | |||||
| else () | |||||
| set(ONLY_CBLAS 0) | |||||
| endif () | |||||
| include("${CMAKE_SOURCE_DIR}/cmake/prebuild.cmake") | |||||
| if (NOT DEFINED NUM_THREADS) | |||||
| # TODO: NUM_CORES comes from `getarch.c` or `cpuid_x86.c`. This is built and executed above in `Makefile.prebuild`, and the results are in `Makefile.conf` and `Makefile_kernel.conf`. -hpa | |||||
| set(NUM_THREADS ${NUM_CORES}) | |||||
| endif () | |||||
| if (NUM_THREADS EQUALS 1) | |||||
| # TODO: was "override USE_THREAD = 0", do we need override here? -hpa | |||||
| set(USE_THREAD 0) | |||||
| 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} EQUALS 1) | |||||
| unset(SMP) | |||||
| else () | |||||
| set(SMP 1) | |||||
| endif () | |||||
| endif () | |||||
| if (${SMP}) | |||||
| message("SMP enabled.") | |||||
| endif () | |||||
| if (NOT DEFINED NEED_PIC) | |||||
| set(NEED_PIC 1) | |||||
| 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") | |||||