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