1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
|
# Check if the processor is an ARM and if Neon instruction are available on the machine where
# the project is compiled.
IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
EXECUTE_PROCESS(COMMAND cat /proc/cpuinfo OUTPUT_VARIABLE CPUINFO)
#neon instruction can be found on the majority part of modern ARM processor
STRING(REGEX REPLACE "^.*(neon).*$" "\\1" NEON_THERE "${CPUINFO}")
STRING(COMPARE EQUAL "neon" "${NEON_THERE}" NEON_TRUE)
IF (NEON_TRUE)
set(NEON_FOUND true CACHE BOOL "NEON available on host")
ELSE (NEON_TRUE)
set(NEON_FOUND false CACHE BOOL "NEON available on host")
ENDIF (NEON_TRUE)
# on ARMv8, neon is inherit and instead listed as 'asimd' in /proc/cpuinfo
STRING(REGEX REPLACE "^.*(asimd).*$" "\\1" ASIMD_THERE "${CPUINFO}")
STRING(COMPARE EQUAL "asimd" "${ASIMD_THERE}" ASIMD_TRUE)
IF (ASIMD_TRUE)
set(ASIMD_FOUND true CACHE BOOL "ASIMD/NEON available on host")
ELSE (ASIMD_TRUE)
set(ASIMD_FOUND false CACHE BOOL "ASIMD/NEON available on host")
ENDIF (ASIMD_TRUE)
#sve instruction can be found on the majority part of modern ARM processor
STRING(REGEX REPLACE "^.*(sve).*$" "\\1" SVE_THERE ${CPUINFO})
STRING(COMPARE EQUAL "sve" "${SVE_THERE}" SVE_TRUE)
IF (SVE_TRUE)
set(SVE_FOUND true CACHE BOOL "SVE available on host")
ELSE (SVE_TRUE)
set(SVE_FOUND false CACHE BOOL "SVE available on host")
ENDIF (SVE_TRUE)
#Find the processor type (for now OMAP3 or OMAP4)
STRING(REGEX REPLACE "^.*(OMAP3).*$" "\\1" OMAP3_THERE "${CPUINFO}")
STRING(COMPARE EQUAL "OMAP3" "${OMAP3_THERE}" OMAP3_TRUE)
IF (OMAP3_TRUE)
set(CORTEXA8_FOUND true CACHE BOOL "OMAP3 available on host")
ELSE (OMAP3_TRUE)
set(CORTEXA8_FOUND false CACHE BOOL "OMAP3 available on host")
ENDIF (OMAP3_TRUE)
#Find the processor type (for now OMAP3 or OMAP4)
STRING(REGEX REPLACE "^.*(OMAP4).*$" "\\1" OMAP4_THERE "${CPUINFO}")
STRING(COMPARE EQUAL "OMAP4" "${OMAP4_THERE}" OMAP4_TRUE)
IF (OMAP4_TRUE)
set(CORTEXA9_FOUND true CACHE BOOL "OMAP4 available on host")
ELSE (OMAP4_TRUE)
set(CORTEXA9_FOUND false CACHE BOOL "OMAP4 available on host")
ENDIF (OMAP4_TRUE)
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Darwin")
IF(CMAKE_SYSTEM_PROCESSOR STREQUAL "arm64" AND NOT CMAKE_OSX_ARCHITECTURES STREQUAL "x86_64")
set(NEON_FOUND true CACHE BOOL "NEON available on ARM64")
ENDIF()
EXECUTE_PROCESS(COMMAND /usr/sbin/sysctl -n machdep.cpu.features OUTPUT_VARIABLE
CPUINFO)
IF(NOT CPUINFO STREQUAL "")
#neon instruction can be found on the majority part of modern ARM processor
STRING(REGEX REPLACE "^.*(neon).*$" "\\1" NEON_THERE "${CPUINFO}")
STRING(COMPARE EQUAL "neon" "${NEON_THERE}" NEON_TRUE)
IF (NEON_TRUE)
set(NEON_FOUND true CACHE BOOL "NEON available on host")
ELSE (NEON_TRUE)
set(NEON_FOUND false CACHE BOOL "NEON available on host")
ENDIF (NEON_TRUE)
ENDIF()
ELSEIF(CMAKE_SYSTEM_NAME MATCHES "Windows")
# TODO
set(CORTEXA8_FOUND false CACHE BOOL "OMAP3 not available on host")
set(CORTEXA9_FOUND false CACHE BOOL "OMAP4 not available on host")
set(NEON_FOUND false CACHE BOOL "NEON not available on host")
ELSE(CMAKE_SYSTEM_NAME MATCHES "Linux")
set(CORTEXA8_FOUND false CACHE BOOL "OMAP3 not available on host")
set(CORTEXA9_FOUND false CACHE BOOL "OMAP4 not available on host")
set(NEON_FOUND false CACHE BOOL "NEON not available on host")
ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
if(NOT NEON_FOUND)
MESSAGE(STATUS "Could not find hardware support for NEON on this machine.")
endif(NOT NEON_FOUND)
if(NOT CORTEXA8_FOUND)
MESSAGE(STATUS "No OMAP3 processor on this machine.")
endif(NOT CORTEXA8_FOUND)
if(NOT CORTEXA9_FOUND)
MESSAGE(STATUS "No OMAP4 processor on this machine.")
endif(NOT CORTEXA9_FOUND)
mark_as_advanced(NEON_FOUND)
#SVE support is availale is only for Linux OS.
IF(CMAKE_SYSTEM_NAME MATCHES "Linux")
# Include necessary modules for checking C and C++ source compilations
INCLUDE(CheckCSourceCompiles)
INCLUDE(CheckCXXSourceCompiles)
# Test code for SVE support
SET(SVE_CODE "
#include <arm_sve.h>
int main()
{
svfloat64_t a;
a = svdup_n_f64(0);
return 0;
}
")
# Macro to check for SVE instruction support
MACRO(CHECK_SVE lang type flags)
# Save the current state of required flags
SET(CMAKE_REQUIRED_FLAGS_SAVE ${CMAKE_REQUIRED_FLAGS})
# Set the flags necessary for compiling the test code with SVE support
SET(CMAKE_REQUIRED_FLAGS "${CMAKE_${lang}_FLAGS_INIT} ${flags}")
# Check if the source code compiles with the given flags for the specified language (C or C++)
IF(lang STREQUAL "CXX")
CHECK_CXX_SOURCE_COMPILES("${SVE_CODE}" ${lang}_HAS_${type})
ELSE()
CHECK_C_SOURCE_COMPILES("${SVE_CODE}" ${lang}_HAS_${type})
ENDIF()
# If the compilation test is successful, set appropriate variables indicating support
IF(${lang}_HAS_${type})
set(${lang}_SVE_FOUND TRUE CACHE BOOL "SVE available on host")
SET(${lang}_${type}_FOUND TRUE CACHE BOOL "${lang} ${type} support")
SET(${lang}_${type}_FLAGS "${flags}" CACHE STRING "${lang} ${type} flags")
ENDIF()
# Restore the original state of required flags
SET(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS_SAVE})
# If the compilation test fails, indicate that the support is not found
IF(NOT ${lang}_${type}_FOUND)
SET(${lang}_${type}_FOUND FALSE CACHE BOOL "${lang} ${type} support")
SET(${lang}_${type}_FLAGS "" CACHE STRING "${lang} ${type} flags")
ENDIF()
# Mark the variables as advanced to hide them in the default CMake GUI
MARK_AS_ADVANCED(${lang}_${type}_FOUND ${lang}_${type}_FLAGS)
ENDMACRO()
# Check for SVE256 vector length
#CHECK_SVE(CXX "SVE256" "-march=armv8-a+sve -msve-vector-bits=256")
SET(CXX_SVE256_FOUND FALSE)
message(STATUS "SVE explicitly disabled -- see pytorch issue #146792")
# If SVE256 support is not found, set CXX_SVE_FOUND to FALSE and notify the user
if(NOT CXX_SVE256_FOUND)
set(CXX_SVE_FOUND FALSE CACHE BOOL "SVE not available on host")
message(STATUS "No SVE processor on this machine.")
else()
# If SVE256 support is found, set CXX_SVE_FOUND to TRUE and notify the user
set(CXX_SVE_FOUND TRUE CACHE BOOL "SVE available on host")
message(STATUS "SVE support detected.")
endif()
# Mark the SVE support variable as advanced
mark_as_advanced(CXX_SVE_FOUND)
ENDIF(CMAKE_SYSTEM_NAME MATCHES "Linux")
|