From: Omar Polo <op@omarpolo.com>
To: Campbell Barton <ideasman42@gmail.com>
Cc: emacs-devel@gnu.org
Subject: Re: [PATCH] support for accessing CPU/core count (processor-count)
Date: Sun, 10 Oct 2021 09:54:27 +0200 [thread overview]
Message-ID: <87h7dpgues.fsf@omarpolo.com> (raw)
In-Reply-To: <f8a1ede2-5cd1-5348-1078-87560653dfbc@gmail.com>
[-- Attachment #1: Type: text/plain, Size: 3265 bytes --]
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
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-add-function-to-access-the-number-of-CPU.patch --]
[-- Type: text/x-patch, Size: 2011 bytes --]
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.
--
2.33.0
next prev parent reply other threads:[~2021-10-10 7:54 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 [this message]
2021-10-10 9:38 ` Arthur Miller
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
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87h7dpgues.fsf@omarpolo.com \
--to=op@omarpolo.com \
--cc=emacs-devel@gnu.org \
--cc=ideasman42@gmail.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 external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.