|
|
|
@@ -37,208 +37,123 @@ |
|
|
|
|
|
|
|
# CPUIDEMU = ../../cpuid/table.o |
|
|
|
|
|
|
|
|
|
|
|
if (DEFINED CPUIDEMU) |
|
|
|
set(EXFLAGS "-DCPUIDEMU -DVENDOR=99") |
|
|
|
endif () |
|
|
|
|
|
|
|
if (BUILD_KERNEL) |
|
|
|
if (DEFINED TARGET_CORE) |
|
|
|
# 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 () |
|
|
|
|
|
|
|
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") |
|
|
|
if (NOT NOFORTRAN) |
|
|
|
include("${PROJECT_SOURCE_DIR}/cmake/f_check.cmake") |
|
|
|
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") |
|
|
|
# compile getarch |
|
|
|
set(GETARCH_SRC |
|
|
|
${PROJECT_SOURCE_DIR}/getarch.c |
|
|
|
${CPUIDEMO} |
|
|
|
) |
|
|
|
|
|
|
|
if (${HOST_OS} STREQUAL "WINDOWSSTORE") |
|
|
|
file(APPEND ${TARGET_CONF_TEMP} |
|
|
|
"#define OS_WINNT\t1\n") |
|
|
|
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 () |
|
|
|
|
|
|
|
# f_check |
|
|
|
if (NOT NOFORTRAN) |
|
|
|
include("${PROJECT_SOURCE_DIR}/cmake/f_check.cmake") |
|
|
|
if ("${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") |
|
|
|
# disable WindowsStore strict CRT checks |
|
|
|
set(GETARCH_FLAGS ${GETARCH_FLAGS} -D_CRT_SECURE_NO_WARNINGS) |
|
|
|
endif () |
|
|
|
|
|
|
|
# Cannot run getarch on target if we are cross-compiling |
|
|
|
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 ${CORE}\n" |
|
|
|
"#define CHAR_CORENAME \"${CORE}\"\n") |
|
|
|
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" |
|
|
|
"#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 ("${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_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? |
|
|
|
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} "${TARGET_CONF_DIR}/${TARGET_CONF}") |
|
|
|
|
|
|
|
else(NOT CMAKE_CROSSCOMPILING) |
|
|
|
# compile getarch |
|
|
|
set(GETARCH_SRC |
|
|
|
${PROJECT_SOURCE_DIR}/getarch.c |
|
|
|
${CPUIDEMU} |
|
|
|
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 ("${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) |
|
|
|
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 ("${CMAKE_SYSTEM_NAME}" STREQUAL "WindowsStore") |
|
|
|
# disable WindowsStore strict CRT checks |
|
|
|
set(GETARCH_FLAGS ${GETARCH_FLAGS} -D_CRT_SECURE_NO_WARNINGS) |
|
|
|
if (NOT ${GETARCH2_RESULT}) |
|
|
|
MESSAGE(FATAL_ERROR "Compiling getarch_2nd failed ${GETARCH2_LOG}") |
|
|
|
endif () |
|
|
|
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} |
|
|
|
) |
|
|
|
|
|
|
|
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) |
|
|
|
|
|
|
|
# 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}) |
|
|
|
|
|
|
|
# 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 () |
|
|
|
|
|
|
|
configure_file(${TARGET_CONF_TEMP} ${TARGET_CONF_DIR}/${TARGET_CONF} COPYONLY) |
|
|
|
ParseGetArchVars(${GETARCH2_MAKE_OUT}) |
|
|
|
|
|
|
|
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}) |
|
|
|
|
|
|
|
endif() |
|
|
|
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 () |