diff --git a/CMakeLists.txt b/CMakeLists.txt index 788aeebed7..25f92d0db7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -246,7 +246,10 @@ include (cmake/find_re2.cmake) include (cmake/find_rdkafka.cmake) include (cmake/find_capnp.cmake) include (cmake/find_llvm.cmake) -include (cmake/find_cpuid.cmake) +include (cmake/find_cpuid.cmake) # Freebsd, bundled +if (NOT USE_CPUID) + include (cmake/find_cpuinfo.cmake) # Debian +endif() include (cmake/find_libgsasl.cmake) include (cmake/find_libxml2.cmake) include (cmake/find_protobuf.cmake) diff --git a/cmake/find_cpuid.cmake b/cmake/find_cpuid.cmake index cda88433a1..bc88626405 100644 --- a/cmake/find_cpuid.cmake +++ b/cmake/find_cpuid.cmake @@ -2,11 +2,11 @@ if (NOT ARCH_ARM) option (USE_INTERNAL_CPUID_LIBRARY "Set to FALSE to use system cpuid library instead of bundled" ${NOT_UNBUNDLED}) endif () -#if (USE_INTERNAL_CPUID_LIBRARY AND NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/libcpuid/include/cpuid/libcpuid.h") -# message (WARNING "submodule contrib/libcpuid is missing. to fix try run: \n git submodule update --init --recursive") -# set (USE_INTERNAL_CPUID_LIBRARY 0) -# set (MISSING_INTERNAL_CPUID_LIBRARY 1) -#endif () +if (USE_INTERNAL_CPUID_LIBRARY AND NOT EXISTS "${ClickHouse_SOURCE_DIR}/contrib/libcpuid/CMakeLists.txt") + message (WARNING "submodule contrib/libcpuid is missing. to fix try run: \n git submodule update --init --recursive") + set (USE_INTERNAL_CPUID_LIBRARY 0) + set (MISSING_INTERNAL_CPUID_LIBRARY 1) +endif () if (NOT USE_INTERNAL_CPUID_LIBRARY) find_library (CPUID_LIBRARY cpuid) @@ -20,10 +20,12 @@ if (CPUID_LIBRARY AND CPUID_INCLUDE_DIR) add_definitions(-DHAVE_STDINT_H) # TODO: make virtual target cpuid:cpuid with COMPILE_DEFINITIONS property endif () + set (USE_CPUID 1) elseif (NOT MISSING_INTERNAL_CPUID_LIBRARY) set (CPUID_INCLUDE_DIR ${ClickHouse_SOURCE_DIR}/contrib/libcpuid/include) set (USE_INTERNAL_CPUID_LIBRARY 1) set (CPUID_LIBRARY cpuid) + set (USE_CPUID 1) endif () -message (STATUS "Using cpuid: ${CPUID_INCLUDE_DIR} : ${CPUID_LIBRARY}") +message (STATUS "Using cpuid=${USE_CPUID}: ${CPUID_INCLUDE_DIR} : ${CPUID_LIBRARY}") diff --git a/cmake/find_cpuinfo.cmake b/cmake/find_cpuinfo.cmake new file mode 100644 index 0000000000..c12050c439 --- /dev/null +++ b/cmake/find_cpuinfo.cmake @@ -0,0 +1,17 @@ +option(USE_INTERNAL_CPUINFO_LIBRARY "Set to FALSE to use system cpuinfo library instead of bundled" ${NOT_UNBUNDLED}) + +if(NOT USE_INTERNAL_CPUINFO_LIBRARY) + find_library(CPUINFO_LIBRARY cpuinfo) + find_path(CPUINFO_INCLUDE_DIR NAMES cpuinfo.h PATHS ${CPUINFO_INCLUDE_PATHS}) +endif() + +if(CPUID_LIBRARY AND CPUID_INCLUDE_DIR) + set(USE_CPUINFO 1) +elseif(NOT MISSING_INTERNAL_CPUINFO_LIBRARY) + set(CPUINFO_INCLUDE_DIR ${ClickHouse_SOURCE_DIR}/contrib/libcpuinfo/include) + set(USE_INTERNAL_CPUINFO_LIBRARY 1) + set(CPUINFO_LIBRARY cpuinfo) + set(USE_CPUINFO 1) +endif() + +message(STATUS "Using cpuinfo=${USE_CPUINFO}: ${CPUINFO_INCLUDE_DIR} : ${CPUINFO_LIBRARY}") diff --git a/dbms/CMakeLists.txt b/dbms/CMakeLists.txt index 93d9a0a1a1..5dfcde8d3e 100644 --- a/dbms/CMakeLists.txt +++ b/dbms/CMakeLists.txt @@ -203,8 +203,12 @@ target_link_libraries (clickhouse_common_io ${CMAKE_DL_LIBS} ) -if (NOT ARCH_ARM AND CPUID_LIBRARY) - target_link_libraries (clickhouse_common_io PRIVATE ${CPUID_LIBRARY}) +if(CPUID_LIBRARY) + target_link_libraries(clickhouse_common_io PRIVATE ${CPUID_LIBRARY}) +endif() + +if(CPUINFO_LIBRARY) + target_link_libraries(clickhouse_common_io PRIVATE ${CPUINFO_LIBRARY}) endif() target_link_libraries (dbms diff --git a/dbms/src/Common/config.h.in b/dbms/src/Common/config.h.in index 0c756841f2..aa57582f43 100644 --- a/dbms/src/Common/config.h.in +++ b/dbms/src/Common/config.h.in @@ -18,6 +18,8 @@ #cmakedefine01 USE_XXHASH #cmakedefine01 USE_INTERNAL_LLVM_LIBRARY #cmakedefine01 USE_PROTOBUF +#cmakedefine01 USE_CPUID +#cmakedefine01 USE_CPUINFO #cmakedefine01 CLICKHOUSE_SPLIT_BINARY #cmakedefine01 LLVM_HAS_RTTI diff --git a/dbms/src/Common/getNumberOfPhysicalCPUCores.cpp b/dbms/src/Common/getNumberOfPhysicalCPUCores.cpp index 0a686b9c77..d75e056b7b 100644 --- a/dbms/src/Common/getNumberOfPhysicalCPUCores.cpp +++ b/dbms/src/Common/getNumberOfPhysicalCPUCores.cpp @@ -1,19 +1,20 @@ #include #include -#if defined(__x86_64__) - - #include - #include - +#include +#if USE_CPUID +# include +# include namespace DB { namespace ErrorCodes { extern const int CPUID_ERROR; }} - +#elseif USE_CPUINFO +# include #endif + unsigned getNumberOfPhysicalCPUCores() { -#if defined(__x86_64__) +#if USE_CPUID cpu_raw_data_t raw_data; if (0 != cpuid_get_raw_data(&raw_data)) throw DB::Exception("Cannot cpuid_get_raw_data: " + std::string(cpuid_error()), DB::ErrorCodes::CPUID_ERROR); @@ -37,6 +38,13 @@ unsigned getNumberOfPhysicalCPUCores() if (res != 0) return res; +#elseif USE_CPUINFO + uint32_t cores = 0; + if (cpuinfo_initialize()) + cores = cpuinfo_get_cores_count(); + + if (cores) + return cores; #endif /// As a fallback (also for non-x86 architectures) assume there are no hyper-threading on the system.