unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Arthur Miller <arthur.miller@live.com>
To: Omar Polo <op@omarpolo.com>
Cc: Campbell Barton <ideasman42@gmail.com>, emacs-devel@gnu.org
Subject: Re: [PATCH] support for accessing CPU/core count (processor-count)
Date: Sun, 10 Oct 2021 11:38:25 +0200	[thread overview]
Message-ID: <AM9PR09MB49774A1C1D1049F7AC768E3A96B49@AM9PR09MB4977.eurprd09.prod.outlook.com> (raw)
In-Reply-To: <87h7dpgues.fsf@omarpolo.com> (Omar Polo's message of "Sun, 10 Oct 2021 09:54:27 +0200")

Omar Polo <op@omarpolo.com> writes:

> Campbell Barton <ideasman42@gmail.com> writes:
>
>> Hi, this patch adds support for accessing the number of CPU's / cores
>> on a system, matching CPython's multiprocessing.cpu_count() [0].
>>
>> I've only tested this for Linux, this includes code that should work
>> on other platforms, although that would need to be double-checked of
>> course.
>> For reference I checked CPython / Blender & Stack-overflow [1]
>
> I can confirm it works on OpenBSD too, but needs tweaking.  Some
> comments inline and attaching an updated patch
>
>> Accessing this information can be useful to automatically detect the
>> number of jobs to run.
>>
>>
>> [0]:
>> https://docs.python.org/3/library/multiprocessing.html#multiprocessing.cpu_count
>> [1]: https://stackoverflow.com/a/3006416/432509
>>
>> commit 7be53f10f3df3c3183cc97d6bbadb78ebb61e8d2
>> Author: Campbell Barton <ideasman42@gmail.com>
>> Date:   Sun Oct 10 10:16:47 2021 +1100
>> 
>>     Support accessing the number of CPU's.
>> 
>>     Add (processor-count) for accessing the number of cores/CPU's.
>> 
>> diff --git a/src/emacs.c b/src/emacs.c
>> index 866e43fda9..26e2f6b1f2 100644
>> --- a/src/emacs.c
>> +++ b/src/emacs.c
>> @@ -3156,6 +3156,38 @@ DEFUN ("daemon-initialized", Fdaemon_initialized, Sdaemon_initialized, 0, 0, 0,
>>    return Qt;
>>  }
>> 
>> +DEFUN ("processor-count", Fprocessor_count, Sprocessor_count, 0, 0, 0,
>> +       doc: /* Return the number of CPUs in the system.
>> +
>> +The value will always be above zero, 1 for unsupported systems.  */)
>> +  (void)
>> +{
>> +  int nproc = -1;
>> +#ifdef WINDOWSNT
>> +  SYSTEM_INFO info;
>> +  GetSystemInfo(&info);
>> +  nproc = (int)info.dwNumberOfProcessors;
>> +#elif defined (__APPLE__) || \
>> +      defined (__OpenBSD__) || \
>> +      defined (__FreeBSD__) || \
>> +      defined (__NetBSD__) || \
>> +      defined (__DragonFly__)
>> +  int mib[2];
>> +  size_t len;
>> +
>> +  mib[0] = CTL_HW;
>
> the #include <sys/sysctl.h> is missing.
>
>> +  mib[1] = HW_NCPU;
>
> at least on OpenBSD this should be HW_NCPUONLINE.
>
> OpenBSD disables hyperthreading by default so HW_NCPU is (almost) always
> misleading.  For example, on my machine
>
> 	% uname -a
> 	OpenBSD venera 7.0 GENERIC.MP#221 amd64
> 	% sysctl hw.ncpu
> 	hw.ncpu=8
> 	% sysctl hw.ncpuonline
> 	hw.ncpuonline=4
>
> and this has been the case for a while already (I mean, a couple of
> years if not more.)
>
> I don't have access to other BSDs other than OpenBSD, but judging from
> the manpages online.
>
>  - NetBSD has hw.ncpuonline
>  - DragonFly and FreeBSD have only hw.ncpu
>  - apple I don't know how to check.  man.apple.com doesn't seem to
>    exists ^^"
>
>> +  len = sizeof(nproc);
>> +  sysctl(mib, 2, &nproc, &len, nullptr, 0);
>                                   ^^^^^^^
> shouldn't this be NULL?
>
>> +#elif defined (__hpux)
>> +  nproc = mpctl(MPC_GETNUMSPUS, NULL, NULL);
>> +#elif defined (_SC_NPROCESSORS_ONLN)
>> +  nproc = (int)sysconf(_SC_NPROCESSORS_ONLN);
>> +#endif
>> +
>> +  return make_fixnum (MAX(nproc, 1));
>
> emacs.c:3188:23: warning: implicit declaration of function 'MAX' is invalid in C99 [-Wimplicit-function-declaration]
>
> I'm attaching an updated patch.  Note that I'm not sure if including
> sys/types.h and sys/sysctl.h breaks the build on some OS.
>
> if someone knows how to reduce the number of #ifdefs I'll be glad :)
>
>> +}
>> +
>
> Cheers,
>
> Omar Polo
>
> From 5fe26a73abc60eae7dd2528e3854f2f379bcb4c7 Mon Sep 17 00:00:00 2001
> From: Campbell Barton <ideasman42@gmail.com>
> Date: Sun, 10 Oct 2021 08:21:01 +0000
> Subject: [PATCH] add function to access the number of CPU
>
> * emacs.c (Fprocessor_count): add processor-count function to access
>   the number of CPU
> ---
>  src/emacs.c | 35 +++++++++++++++++++++++++++++++++++
>  1 file changed, 35 insertions(+)
>
> diff --git a/src/emacs.c b/src/emacs.c
> index 866e43fda9..5bd10a7586 100644
> --- a/src/emacs.c
> +++ b/src/emacs.c
> @@ -25,6 +25,8 @@ along with GNU Emacs.  If not, see <https://www.gnu.org/licenses/>.  */
>  #include <fcntl.h>
>  #include <stdlib.h>
>  
> +#include <sys/types.h>
> +#include <sys/sysctl.h>
>  #include <sys/file.h>
>  #include <sys/stat.h>
>  #include <unistd.h>
> @@ -3156,6 +3158,38 @@ from the parent process and its tty file descriptors.  */)
>    return Qt;
>  }
>  
> +DEFUN ("processor-count", Fprocessor_count, Sprocessor_count, 0, 0, 0,
> +       doc: /* Return the number of CPUs in the system.
> +
> +The value will always be above zero, 1 for unsupported systems.  */)
> +  (void)
> +{
> +  int nproc = -1;
> +#ifdef WINDOWSNT
> +  SYSTEM_INFO info;
> +  GetSystemInfo(&info);
> +  nproc = (int)info.dwNumberOfProcessors;
> +#elif defined (HW_NCPU) || defined (HW_NCPUONLINE)
> +  int mib[2];
> +  size_t len;
> +
> +  mib[0] = CTL_HW;
> +#ifdef HW_NCPUONLINE
> +  mib[1] = HW_NCPUONLINE;
> +#else
> +  mib[1] = HW_NCPU;
> +#endif
> +  len = sizeof(nproc);
> +  sysctl(mib, 2, &nproc, &len, NULL, 0);
> +#elif defined (__hpux)
> +  nproc = mpctl(MPC_GETNUMSPUS, NULL, NULL);
> +#elif defined (_SC_NPROCESSORS_ONLN)
> +  nproc = (int)sysconf(_SC_NPROCESSORS_ONLN);
> +#endif
> +
> +  return make_fixnum (nproc > 1 ? nproc : 1);
> +}
> +
>  void
>  syms_of_emacs (void)
>  {
> @@ -3176,6 +3210,7 @@ syms_of_emacs (void)
>    defsubr (&Sinvocation_directory);
>    defsubr (&Sdaemonp);
>    defsubr (&Sdaemon_initialized);
> +  defsubr (&Sprocessor_count);
>  
>    DEFVAR_LISP ("command-line-args", Vcommand_line_args,
>  	       doc: /* Args passed by shell to Emacs, as a list of strings.

What is wrong on just reading this from /cat/cpuinfo on GNU/Linux?

Windows has "wmic cpu get NumberOfCores,NumberOfLogicalProcessors" which works
on cmd prompt, which means executable from elisp as a process. I dont know for
apple and *bsds.

It is just text that can be parsed directly with elisp, so it is easier to
maintain does not need to be compiled etc. I don't see cpu queries as a
performance crucial query. Just a thought.



  reply	other threads:[~2021-10-10  9:38 UTC|newest]

Thread overview: 55+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-10  0:02 [PATCH] support for accessing CPU/core count (processor-count) Campbell Barton
2021-10-10  7:54 ` Omar Polo
2021-10-10  9:38   ` Arthur Miller [this message]
2021-10-10  9:43     ` Omar Polo
2021-10-10 10:52       ` Arthur Miller
2021-10-10 12:07         ` Omar Polo
2021-10-10 16:48           ` Arthur Miller
2021-10-10 18:17             ` Omar Polo
2021-10-10 19:45               ` Arthur Miller
2021-10-10 21:04                 ` Omar Polo
2021-10-11  8:15                   ` Arthur Miller
2021-10-11  8:20                   ` Arthur Miller
2021-10-11  8:23                     ` Omar Polo
2021-10-11 15:55                       ` Arthur Miller
2021-10-10 21:32                 ` Andreas Schwab
2021-10-11  8:03                   ` Arthur Miller
2021-10-11  8:14                     ` Andreas Schwab
2021-10-11 15:53                       ` Arthur Miller
2021-10-11 16:49                         ` Andreas Schwab
2021-10-11 17:14                           ` Arthur Miller
2021-10-10 10:13     ` Campbell Barton
2021-10-10 10:38     ` Andreas Schwab
2021-10-10 11:21       ` Arthur Miller
2021-10-10 11:57         ` Andreas Schwab
2021-10-10 16:35           ` Arthur Miller
2021-10-10 17:27             ` Andreas Schwab
2021-10-10 18:13               ` Arthur Miller
2021-10-10 19:16                 ` Stefan Monnier
2021-10-10 19:50                   ` Arthur Miller
2021-10-10 22:58                     ` Campbell Barton
2021-10-11  8:01                       ` Arthur Miller
2021-10-10 12:21   ` Stefan Kangas
2021-10-10 16:03     ` Omar Polo
2021-10-10 21:11     ` Paul Eggert
2021-10-10 21:16       ` Omar Polo
2021-10-11 17:17       ` Arthur Miller
2021-10-10 10:50 ` Andy Moreton
2021-10-10 11:21   ` Arthur Miller
2021-10-10 12:09 ` Stefan Kangas
2021-10-10 22:43   ` Campbell Barton
2021-10-11  1:34 ` Po Lu
2021-10-11  1:51   ` Campbell Barton
2021-10-11  3:04     ` Po Lu
2021-10-11  4:01       ` Campbell Barton
2021-10-11  8:20         ` Lars Ingebrigtsen
2021-10-11 13:00           ` Eli Zaretskii
2021-10-11 15:12           ` Stefan Monnier
2021-10-11 16:07             ` Eli Zaretskii
2021-10-11 21:14               ` Andy Moreton
2021-10-11 22:13                 ` Ken Brown
2021-10-12  2:27                 ` Eli Zaretskii
2021-10-12 10:39               ` Lars Ingebrigtsen
2021-10-12 14:09                 ` Eli Zaretskii
2021-10-12 19:58                   ` Paul Eggert
2021-10-13  2:24                     ` Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=AM9PR09MB49774A1C1D1049F7AC768E3A96B49@AM9PR09MB4977.eurprd09.prod.outlook.com \
    --to=arthur.miller@live.com \
    --cc=emacs-devel@gnu.org \
    --cc=ideasman42@gmail.com \
    --cc=op@omarpolo.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).