1*184c1b94SMartin Matuska# =========================================================================== 2*184c1b94SMartin Matuska# https://www.gnu.org/software/autoconf-archive/ax_count_cpus.html 3*184c1b94SMartin Matuska# =========================================================================== 4*184c1b94SMartin Matuska# 5*184c1b94SMartin Matuska# SYNOPSIS 6*184c1b94SMartin Matuska# 7*184c1b94SMartin Matuska# AX_COUNT_CPUS([ACTION-IF-DETECTED],[ACTION-IF-NOT-DETECTED]) 8*184c1b94SMartin Matuska# 9*184c1b94SMartin Matuska# DESCRIPTION 10*184c1b94SMartin Matuska# 11*184c1b94SMartin Matuska# Attempt to count the number of logical processor cores (including 12*184c1b94SMartin Matuska# virtual and HT cores) currently available to use on the machine and 13*184c1b94SMartin Matuska# place detected value in CPU_COUNT variable. 14*184c1b94SMartin Matuska# 15*184c1b94SMartin Matuska# On successful detection, ACTION-IF-DETECTED is executed if present. If 16*184c1b94SMartin Matuska# the detection fails, then ACTION-IF-NOT-DETECTED is triggered. The 17*184c1b94SMartin Matuska# default ACTION-IF-NOT-DETECTED is to set CPU_COUNT to 1. 18*184c1b94SMartin Matuska# 19*184c1b94SMartin Matuska# LICENSE 20*184c1b94SMartin Matuska# 21*184c1b94SMartin Matuska# Copyright (c) 2014,2016 Karlson2k (Evgeny Grin) <k2k@narod.ru> 22*184c1b94SMartin Matuska# Copyright (c) 2012 Brian Aker <brian@tangent.org> 23*184c1b94SMartin Matuska# Copyright (c) 2008 Michael Paul Bailey <jinxidoru@byu.net> 24*184c1b94SMartin Matuska# Copyright (c) 2008 Christophe Tournayre <turn3r@users.sourceforge.net> 25*184c1b94SMartin Matuska# 26*184c1b94SMartin Matuska# Copying and distribution of this file, with or without modification, are 27*184c1b94SMartin Matuska# permitted in any medium without royalty provided the copyright notice 28*184c1b94SMartin Matuska# and this notice are preserved. This file is offered as-is, without any 29*184c1b94SMartin Matuska# warranty. 30*184c1b94SMartin Matuska 31*184c1b94SMartin Matuska#serial 22 32*184c1b94SMartin Matuska 33*184c1b94SMartin Matuska AC_DEFUN([AX_COUNT_CPUS],[dnl 34*184c1b94SMartin Matuska AC_REQUIRE([AC_CANONICAL_HOST])dnl 35*184c1b94SMartin Matuska AC_REQUIRE([AC_PROG_EGREP])dnl 36*184c1b94SMartin Matuska AC_MSG_CHECKING([the number of available CPUs]) 37*184c1b94SMartin Matuska CPU_COUNT="0" 38*184c1b94SMartin Matuska 39*184c1b94SMartin Matuska # Try generic methods 40*184c1b94SMartin Matuska 41*184c1b94SMartin Matuska # 'getconf' is POSIX utility, but '_NPROCESSORS_ONLN' and 42*184c1b94SMartin Matuska # 'NPROCESSORS_ONLN' are platform-specific 43*184c1b94SMartin Matuska command -v getconf >/dev/null 2>&1 && \ 44*184c1b94SMartin Matuska CPU_COUNT=`getconf _NPROCESSORS_ONLN 2>/dev/null || getconf NPROCESSORS_ONLN 2>/dev/null` || CPU_COUNT="0" 45*184c1b94SMartin Matuska AS_IF([[test "$CPU_COUNT" -gt "0" 2>/dev/null || ! command -v nproc >/dev/null 2>&1]],[[: # empty]],[dnl 46*184c1b94SMartin Matuska # 'nproc' is part of GNU Coreutils and is widely available 47*184c1b94SMartin Matuska CPU_COUNT=`OMP_NUM_THREADS='' nproc 2>/dev/null` || CPU_COUNT=`nproc 2>/dev/null` || CPU_COUNT="0" 48*184c1b94SMartin Matuska ])dnl 49*184c1b94SMartin Matuska 50*184c1b94SMartin Matuska AS_IF([[test "$CPU_COUNT" -gt "0" 2>/dev/null]],[[: # empty]],[dnl 51*184c1b94SMartin Matuska # Try platform-specific preferred methods 52*184c1b94SMartin Matuska AS_CASE([[$host_os]],dnl 53*184c1b94SMartin Matuska [[*linux*]],[[CPU_COUNT=`lscpu -p 2>/dev/null | $EGREP -e '^@<:@0-9@:>@+,' -c` || CPU_COUNT="0"]],dnl 54*184c1b94SMartin Matuska [[*darwin*]],[[CPU_COUNT=`sysctl -n hw.logicalcpu 2>/dev/null` || CPU_COUNT="0"]],dnl 55*184c1b94SMartin Matuska [[freebsd*]],[[command -v sysctl >/dev/null 2>&1 && CPU_COUNT=`sysctl -n kern.smp.cpus 2>/dev/null` || CPU_COUNT="0"]],dnl 56*184c1b94SMartin Matuska [[netbsd*]], [[command -v sysctl >/dev/null 2>&1 && CPU_COUNT=`sysctl -n hw.ncpuonline 2>/dev/null` || CPU_COUNT="0"]],dnl 57*184c1b94SMartin Matuska [[solaris*]],[[command -v psrinfo >/dev/null 2>&1 && CPU_COUNT=`psrinfo 2>/dev/null | $EGREP -e '^@<:@0-9@:>@.*on-line' -c 2>/dev/null` || CPU_COUNT="0"]],dnl 58*184c1b94SMartin Matuska [[mingw*]],[[CPU_COUNT=`ls -qpU1 /proc/registry/HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System/CentralProcessor/ 2>/dev/null | $EGREP -e '^@<:@0-9@:>@+/' -c` || CPU_COUNT="0"]],dnl 59*184c1b94SMartin Matuska [[msys*]],[[CPU_COUNT=`ls -qpU1 /proc/registry/HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System/CentralProcessor/ 2>/dev/null | $EGREP -e '^@<:@0-9@:>@+/' -c` || CPU_COUNT="0"]],dnl 60*184c1b94SMartin Matuska [[cygwin*]],[[CPU_COUNT=`ls -qpU1 /proc/registry/HKEY_LOCAL_MACHINE/HARDWARE/DESCRIPTION/System/CentralProcessor/ 2>/dev/null | $EGREP -e '^@<:@0-9@:>@+/' -c` || CPU_COUNT="0"]]dnl 61*184c1b94SMartin Matuska )dnl 62*184c1b94SMartin Matuska ])dnl 63*184c1b94SMartin Matuska 64*184c1b94SMartin Matuska AS_IF([[test "$CPU_COUNT" -gt "0" 2>/dev/null || ! command -v sysctl >/dev/null 2>&1]],[[: # empty]],[dnl 65*184c1b94SMartin Matuska # Try less preferred generic method 66*184c1b94SMartin Matuska # 'hw.ncpu' exist on many platforms, but not on GNU/Linux 67*184c1b94SMartin Matuska CPU_COUNT=`sysctl -n hw.ncpu 2>/dev/null` || CPU_COUNT="0" 68*184c1b94SMartin Matuska ])dnl 69*184c1b94SMartin Matuska 70*184c1b94SMartin Matuska AS_IF([[test "$CPU_COUNT" -gt "0" 2>/dev/null]],[[: # empty]],[dnl 71*184c1b94SMartin Matuska # Try platform-specific fallback methods 72*184c1b94SMartin Matuska # They can be less accurate and slower then preferred methods 73*184c1b94SMartin Matuska AS_CASE([[$host_os]],dnl 74*184c1b94SMartin Matuska [[*linux*]],[[CPU_COUNT=`$EGREP -e '^processor' -c /proc/cpuinfo 2>/dev/null` || CPU_COUNT="0"]],dnl 75*184c1b94SMartin Matuska [[*darwin*]],[[CPU_COUNT=`system_profiler SPHardwareDataType 2>/dev/null | $EGREP -i -e 'number of cores:'|cut -d : -f 2 -s|tr -d ' '` || CPU_COUNT="0"]],dnl 76*184c1b94SMartin Matuska [[freebsd*]],[[CPU_COUNT=`dmesg 2>/dev/null| $EGREP -e '^cpu@<:@0-9@:>@+: '|sort -u|$EGREP -e '^' -c` || CPU_COUNT="0"]],dnl 77*184c1b94SMartin Matuska [[netbsd*]], [[CPU_COUNT=`command -v cpuctl >/dev/null 2>&1 && cpuctl list 2>/dev/null| $EGREP -e '^@<:@0-9@:>@+ .* online ' -c` || \ 78*184c1b94SMartin Matuska CPU_COUNT=`dmesg 2>/dev/null| $EGREP -e '^cpu@<:@0-9@:>@+ at'|sort -u|$EGREP -e '^' -c` || CPU_COUNT="0"]],dnl 79*184c1b94SMartin Matuska [[solaris*]],[[command -v kstat >/dev/null 2>&1 && CPU_COUNT=`kstat -m cpu_info -s state -p 2>/dev/null | $EGREP -c -e 'on-line'` || \ 80*184c1b94SMartin Matuska CPU_COUNT=`kstat -m cpu_info 2>/dev/null | $EGREP -c -e 'module: cpu_info'` || CPU_COUNT="0"]],dnl 81*184c1b94SMartin Matuska [[mingw*]],[AS_IF([[CPU_COUNT=`reg query 'HKLM\\Hardware\\Description\\System\\CentralProcessor' 2>/dev/null | $EGREP -e '\\\\@<:@0-9@:>@+$' -c`]],dnl 82*184c1b94SMartin Matuska [[: # empty]],[[test "$NUMBER_OF_PROCESSORS" -gt "0" 2>/dev/null && CPU_COUNT="$NUMBER_OF_PROCESSORS"]])],dnl 83*184c1b94SMartin Matuska [[msys*]],[[test "$NUMBER_OF_PROCESSORS" -gt "0" 2>/dev/null && CPU_COUNT="$NUMBER_OF_PROCESSORS"]],dnl 84*184c1b94SMartin Matuska [[cygwin*]],[[test "$NUMBER_OF_PROCESSORS" -gt "0" 2>/dev/null && CPU_COUNT="$NUMBER_OF_PROCESSORS"]]dnl 85*184c1b94SMartin Matuska )dnl 86*184c1b94SMartin Matuska ])dnl 87*184c1b94SMartin Matuska 88*184c1b94SMartin Matuska AS_IF([[test "x$CPU_COUNT" != "x0" && test "$CPU_COUNT" -gt 0 2>/dev/null]],[dnl 89*184c1b94SMartin Matuska AC_MSG_RESULT([[$CPU_COUNT]]) 90*184c1b94SMartin Matuska m4_ifvaln([$1],[$1],)dnl 91*184c1b94SMartin Matuska ],[dnl 92*184c1b94SMartin Matuska m4_ifval([$2],[dnl 93*184c1b94SMartin Matuska AS_UNSET([[CPU_COUNT]]) 94*184c1b94SMartin Matuska AC_MSG_RESULT([[unable to detect]]) 95*184c1b94SMartin Matuska $2 96*184c1b94SMartin Matuska ], [dnl 97*184c1b94SMartin Matuska CPU_COUNT="1" 98*184c1b94SMartin Matuska AC_MSG_RESULT([[unable to detect (assuming 1)]]) 99*184c1b94SMartin Matuska ])dnl 100*184c1b94SMartin Matuska ])dnl 101*184c1b94SMartin Matuska ])dnl 102