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 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
|
# - Set a number of variables to indicate things about the current CPU and OS
#
# CPU_COUNT
# CPU_INTEL
# CPU_EXE_64BIT
# CPU_EXE_32BIT
# CPU_HAS_SSE
# CPU_HAS_SSE2
# CPU_HAS_SSE3
# CPU_HAS_SSSE3
# CPU_HAS_SSE4_1
# CPU_HAS_SSE4_2
#
# Requires these CMake modules:
# no additional modules required
#
# Original Author:
# 2010 Rylie Pavlik <rylie@ryliepavlik.com>
# https://ryliepavlik.com/
# Iowa State University HCI Graduate Program/VRAC
#
# Copyright 2009-2010, Iowa State University
#
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
#
# SPDX-License-Identifier: BSL-1.0
#
if(__get_cpu_details)
return()
endif()
set(__get_cpu_details YES)
function(get_cpu_details)
option(CPUDETAILS_VERBOSE
"Should we display results of the CPU info check?"
NO)
mark_as_advanced(CPUDETAILS_VERBOSE)
### See http://www.kitware.com/blog/home/post/63
if(NOT DEFINED CPU_COUNT)
# Unknown:
set(CPU_COUNT 1)
# Linux:
set(cpuinfo_file "/proc/cpuinfo")
if(EXISTS "${cpuinfo_file}")
file(STRINGS "${cpuinfo_file}" procs REGEX "^processor.: [0-9]+$")
list(LENGTH procs CPU_COUNT)
endif()
# Mac:
if(APPLE)
find_program(cmd_sys_pro "system_profiler")
if(cmd_sys_pro)
execute_process(COMMAND ${cmd_sys_pro} OUTPUT_VARIABLE info)
string(REGEX REPLACE "^.*Total Number Of Cores: ([0-9]+).*$" "\\1"
CPU_COUNT "${info}")
endif()
endif()
# Windows:
if(WIN32)
set(CPU_COUNT "$ENV{NUMBER_OF_PROCESSORS}")
endif()
endif()
###
# CPU_INTEL
if("${CMAKE_SYSTEM_PROCESSOR}" MATCHES "x86_64" OR "${CMAKE_SYSTEM_PROCESSOR}" MATCHES "i[3456]86")
set(CPU_INTEL YES)
elseif(APPLE)
# Mac Intel boxes return i386 in 10.5 - so assume this is a PPC
set(CPU_INTEL NO)
else()
# TODO: Assuming yes in case of doubt - probably not a great idea
set(CPU_INTEL YES)
endif()
set(CPU_INTEL
${CPU_INTEL}
CACHE
INTERNAL
"Intel x86 or x86_64 architecture machine?")
###
# CPU_EXE_64BIT/32BIT
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
set(CPU_EXE_64BIT ON)
set(CPU_EXE_32BIT OFF)
else()
set(CPU_EXE_64BIT OFF)
set(CPU_EXE_32BIT ON)
endif()
###
# CPU_HAS_SSE/SSE2/SSE3/SSSE3/SSE4.1/SSE4.2
if(CPU_INTEL)
if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
# Use /proc/cpuinfo to find this out.
file(STRINGS "/proc/cpuinfo" _cpuinfo)
if(_cpuinfo MATCHES "(sse)|(xmm)")
set(CPU_HAS_SSE YES)
else()
set(CPU_HAS_SSE NO)
endif()
if(_cpuinfo MATCHES "(sse2)|(xmm2)")
set(CPU_HAS_SSE2 YES)
else()
set(CPU_HAS_SSE2 NO)
endif()
if(_cpuinfo MATCHES "(sse3)|(xmm3)")
set(CPU_HAS_SSE3 YES)
else()
set(CPU_HAS_SSE3 NO)
endif()
if(_cpuinfo MATCHES "ssse3")
set(CPU_HAS_SSSE3 YES)
else()
set(CPU_HAS_SSSE3 NO)
endif()
if(_cpuinfo MATCHES "(sse4_1)|(xmm4_1)")
set(CPU_HAS_SSE4_1 YES)
else()
set(CPU_HAS_SSE4_1 NO)
endif()
if(_cpuinfo MATCHES "(sse4_2)|(xmm4_2)")
set(CPU_HAS_SSE4_2 YES)
else()
set(CPU_HAS_SSE4_2 NO)
endif()
elseif(APPLE)
# Mac OS X Intel requires SSE3
set(CPU_HAS_SSE YES)
set(CPU_HAS_SSE2 YES)
set(CPU_HAS_SSE3 YES)
set(CPU_HAS_SSSE3 NO)
set(CPU_HAS_SSE4_1 NO)
set(CPU_HAS_SSE4_2 NO)
elseif(WIN32)
if(CPU_EXE_64BIT)
#TODO: Assume only common-denominator for 64-bit machines,
# since I don't know how to check.
set(CPU_HAS_SSE YES)
set(CPU_HAS_SSE2 YES)
set(CPU_HAS_SSE3 NO)
set(CPU_HAS_SSSE3 NO)
set(CPU_HAS_SSE4_1 NO)
set(CPU_HAS_SSE4_2 NO)
else()
#TODO: Assume no SSE, since I don't know how to check.
set(CPU_HAS_SSE NO)
set(CPU_HAS_SSE2 NO)
set(CPU_HAS_SSE3 NO)
set(CPU_HAS_SSSE3 NO)
set(CPU_HAS_SSE4_1 NO)
set(CPU_HAS_SSE4_2 NO)
endif()
endif()
endif()
set(CPU_INTEL
${CPU_INTEL}
CACHE
INTERNAL
"Intel x86 or x86_64 architecture machine?")
foreach(_var
CPU_COUNT
CPU_EXE_64BIT
CPU_EXE_32BIT
CPU_HAS_SSE
CPU_HAS_SSE2
CPU_HAS_SSE3
CPU_HAS_SSSE3
CPU_HAS_SSE4_1
CPU_HAS_SSE4_2)
set(${_var} ${${_var}} CACHE INTERNAL "")
endforeach()
if(CPUDETAILS_VERBOSE)
foreach(_var
CPU_COUNT
CPU_INTEL
CPU_EXE_64BIT
CPU_EXE_32BIT
CPU_HAS_SSE
CPU_HAS_SSE2
CPU_HAS_SSE3
CPU_HAS_SSSE3
CPU_HAS_SSE4_1
CPU_HAS_SSE4_2)
get_property(_help CACHE ${_var} PROPERTY HELPSTRING)
message(STATUS "[get_cpu_details] ${_var} (${_help}): ${${_var}}")
endforeach()
endif()
endfunction()
|