From: Pip Cet <pipcet@protonmail.com>
To: "Gerd Möllmann" <gerd.moellmann@gmail.com>
Cc: Helmut Eller <eller.helmut@gmail.com>,
Eli Zaretskii <eliz@gnu.org>,
emacs-devel@gnu.org
Subject: Re: MPS: weak hash tables
Date: Sat, 06 Jul 2024 16:56:39 +0000 [thread overview]
Message-ID: <p-W0YoiRjQW21JD6a3-xWurdrTQ_D7cfmZfKnr0PY95h2xd6w3Wg0Knk_m49zqRUeVjW3kO-6YPVOfEWjQGOzDKzxPIOJUXiGxBa8a0JzJk=@protonmail.com> (raw)
In-Reply-To: <m25xtixz21.fsf@pro2.fritz.box>
[-- Attachment #1: Type: text/plain, Size: 2246 bytes --]
On Saturday, July 6th, 2024 at 16:31, Gerd Möllmann <gerd.moellmann@gmail.com> wrote:
> Pip Cet pipcet@protonmail.com writes:
>
> > I wonder how representative that is of actual workloads, though.
>
> It isn't, for sure :-).
>
> > It does appear mostly to be the cost of finalization, if I deactivate
> > that (and leak the memory instead!) it takes about 6.5 seconds on this
> > machine compared to ~9 on my main Emacs. Totally unscientific, of
> > course, I'm pretty sure I even updated my compiler since compiling
> > vanilla Emacs. Both use nativecomp.
>
> I think the same. I under the impression that probably many millions of
> bignums are used, each of which requires inter-thread communication and
> so on. That's quite expensive if true.
>
> > So IF it's worth optimizing this, the thing to look into would be to
> > use MPS-managed memory for GMP bignums, so we don't need a finalizer
> > at all. I think that's quite easy to do, but requires violating the
> > GMP API by accessing internal member fields directly.
>
>
> We have already this in bignum.c
>
> mp_set_memory_functions (xmalloc, xrealloc_for_gmp, xfree_for_gmp);
>
> Haven't read the GMP docs yet, but that looks like something that could
> be used.
Patch attached, couldn't resist :-)
Memory usage is perfectly acceptable with this patch, but it does do a lot of GC.
> > I believe Eli is right, though, that we should deviate from what Emacs
> > usually does as little as possible until we've got things working.
> > That means just keeping track of how much we've allocated and calling
> > garbage_collect via maybe_garbage_collect, I think.
> Can you explain? I mean I agree in general, but in this case I'm not so
> sure. What I've currently implemented is basically a function of the
> number of allocated finalizable objects and only finalizable objects pay
> the price. The size of allocated memory overall, i.e. counting the bytes
> in alloc_impl doesn't contain the information.
But it's probably a better indicator of how much GC activity happened, and that influences how many finalization messages there would be, assuming that an approximately constant percentage of objects is finalizable...
Pip
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0002-mps-bignums.patch --]
[-- Type: text/x-patch; name=0002-mps-bignums.patch, Size: 2762 bytes --]
diff --git a/src/bignum.c b/src/bignum.c
index 1fe195d78ea..330fdf4324c 100644
--- a/src/bignum.c
+++ b/src/bignum.c
@@ -20,12 +20,13 @@
#include <config.h>
#include "bignum.h"
-
#include "lisp.h"
#include <math.h>
#include <stdlib.h>
+#include "igc.h"
+
/* mpz global temporaries. Making them global saves the trouble of
properly using mpz_init and mpz_clear on temporaries even when
storage is exhausted. Admittedly this is not ideal. An mpz value
@@ -34,18 +35,29 @@
rounddiv_q and rounding_driver both need four and time_arith needs
five. */
-mpz_t mpz[5];
+mpz_t mpz[5] = { 0, };
+
+static void *
+xmalloc_for_gmp (size_t size)
+{
+ return igc_alloc_bytes (size);
+}
static void *
xrealloc_for_gmp (void *ptr, size_t ignore, size_t size)
{
- return xrealloc (ptr, size);
+ if (size > ignore)
+ {
+ void *ret = xmalloc_for_gmp (size);
+ memcpy (ret, ptr, ignore);
+ return ret;
+ }
+ return ptr;
}
static void
xfree_for_gmp (void *ptr, size_t ignore)
{
- xfree (ptr);
}
void
@@ -62,8 +74,10 @@ init_bignum (void)
program execution. A 'longjmp' or throwing a C++ exception will
have undefined results." But xmalloc and xrealloc do call
'longjmp'. */
- mp_set_memory_functions (xmalloc, xrealloc_for_gmp, xfree_for_gmp);
+ mp_set_memory_functions (xmalloc_for_gmp, xrealloc_for_gmp, xfree_for_gmp);
+ for (int i = 0; i < ARRAYELTS (mpz); i++)
+ igc_root_create_exact_ptr (&mpz[i][0]._mp_d);
for (int i = 0; i < ARRAYELTS (mpz); i++)
mpz_init (mpz[i]);
}
diff --git a/src/igc.c b/src/igc.c
index ccfa136d258..f2fa3270765 100644
--- a/src/igc.c
+++ b/src/igc.c
@@ -2170,6 +2170,19 @@ fix_marker (mps_ss_t ss, struct Lisp_Marker *m)
return MPS_RES_OK;
}
+static mps_res_t
+fix_bignum (mps_ss_t ss, struct Lisp_Bignum *m)
+{
+ MPS_SCAN_BEGIN (ss)
+ {
+ mps_addr_t ref = m->value[0]._mp_d;
+ IGC_FIX12_RAW (ss, &ref);
+ m->value[0]._mp_d = ref;
+ }
+ MPS_SCAN_END (ss);
+ return MPS_RES_OK;
+}
+
static mps_res_t
fix_finalizer (mps_ss_t ss, struct Lisp_Finalizer *f)
{
@@ -2375,6 +2388,7 @@ fix_vector (mps_ss_t ss, struct Lisp_Vector *v)
break;
case PVEC_BIGNUM:
+ IGC_FIX_CALL_FN (ss, struct Lisp_Bignum, v, fix_bignum);
break;
case PVEC_NATIVE_COMP_UNIT:
@@ -3195,7 +3209,6 @@ maybe_finalize (mps_addr_t client, enum pvec_type tag)
mps_addr_t ref = client_to_base (client);
switch (tag)
{
- case PVEC_BIGNUM:
case PVEC_FONT:
case PVEC_THREAD:
case PVEC_MUTEX:
@@ -3210,6 +3223,7 @@ maybe_finalize (mps_addr_t client, enum pvec_type tag)
mps_finalize (global_igc->arena, &ref);
break;
+ case PVEC_BIGNUM:
#ifndef IN_MY_FORK
case PVEC_OBARRAY:
#endif
next prev parent reply other threads:[~2024-07-06 16:56 UTC|newest]
Thread overview: 196+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-01 20:47 MPS: weak hash tables Gerd Möllmann
2024-07-01 21:16 ` Pip Cet
2024-07-01 23:10 ` Pip Cet
2024-07-02 4:19 ` Gerd Möllmann
2024-07-02 5:47 ` Gerd Möllmann
2024-07-02 6:23 ` Pip Cet
2024-07-02 6:55 ` Gerd Möllmann
2024-07-02 9:15 ` Pip Cet
2024-07-02 9:37 ` Gerd Möllmann
2024-07-02 10:11 ` Gerd Möllmann
2024-07-02 11:36 ` Gerd Möllmann
2024-07-02 13:15 ` Eli Zaretskii
2024-07-02 13:16 ` Gerd Möllmann
2024-07-02 13:42 ` Eli Zaretskii
2024-07-02 15:03 ` Pip Cet
2024-07-02 15:17 ` Helmut Eller
2024-07-02 15:35 ` Eli Zaretskii
2024-07-02 16:34 ` Pip Cet
2024-07-02 18:20 ` Eli Zaretskii
2024-07-02 20:16 ` Pip Cet
2024-07-03 6:30 ` Gerd Möllmann
2024-07-03 11:23 ` Eli Zaretskii
2024-07-03 11:28 ` Gerd Möllmann
2024-07-02 13:02 ` Eli Zaretskii
2024-07-02 12:45 ` Eli Zaretskii
2024-07-02 11:23 ` Helmut Eller
2024-07-03 6:11 ` Gerd Möllmann
2024-07-03 6:33 ` Pip Cet
2024-07-03 7:04 ` Gerd Möllmann
2024-07-03 7:24 ` Helmut Eller
2024-07-03 7:25 ` Pip Cet
2024-07-03 7:38 ` Gerd Möllmann
2024-07-03 8:26 ` Gerd Möllmann
2024-07-03 9:31 ` Pip Cet
2024-07-03 10:22 ` Gerd Möllmann
2024-07-03 10:41 ` Pip Cet
2024-07-03 11:17 ` Gerd Möllmann
2024-07-03 20:20 ` Pip Cet
2024-07-04 7:17 ` Gerd Möllmann
2024-07-04 15:24 ` Pip Cet
2024-07-04 16:53 ` Gerd Möllmann
2024-07-04 20:05 ` Pip Cet
2024-07-05 3:50 ` Gerd Möllmann
2024-07-05 12:08 ` Pip Cet
2024-07-05 12:54 ` Gerd Möllmann
2024-07-05 13:27 ` Eli Zaretskii
2024-07-05 20:35 ` Pip Cet
2024-07-06 6:10 ` Eli Zaretskii
2024-07-06 6:31 ` Pip Cet
2024-07-06 7:00 ` Eli Zaretskii
2024-07-06 7:40 ` Gerd Möllmann
2024-07-06 9:13 ` Pip Cet
2024-07-06 10:59 ` Eli Zaretskii
2024-07-05 18:14 ` Helmut Eller
2024-07-05 19:25 ` Pip Cet
2024-07-06 3:39 ` Gerd Möllmann
2024-07-06 5:58 ` Pip Cet
2024-07-06 6:20 ` Gerd Möllmann
2024-07-06 6:29 ` Pip Cet
2024-07-06 6:51 ` Gerd Möllmann
2024-07-06 6:46 ` Eli Zaretskii
2024-07-06 9:23 ` Pip Cet
2024-07-06 11:03 ` Eli Zaretskii
2024-07-06 3:38 ` Gerd Möllmann
2024-07-06 9:47 ` Helmut Eller
2024-07-06 10:38 ` Gerd Möllmann
2024-07-06 11:13 ` Eli Zaretskii
2024-07-06 13:50 ` Helmut Eller
2024-07-06 13:59 ` Eli Zaretskii
2024-07-06 14:38 ` Gerd Möllmann
2024-07-06 16:20 ` Helmut Eller
2024-07-06 16:33 ` Eli Zaretskii
2024-07-06 16:48 ` Helmut Eller
2024-07-06 17:21 ` Eli Zaretskii
2024-07-06 17:59 ` Helmut Eller
2024-07-06 18:14 ` Gerd Möllmann
2024-07-06 18:56 ` Eli Zaretskii
2024-07-06 11:37 ` Pip Cet
2024-07-06 11:40 ` Gerd Möllmann
2024-07-06 11:57 ` Gerd Möllmann
2024-07-06 12:03 ` Eli Zaretskii
2024-07-06 12:16 ` Gerd Möllmann
2024-07-06 12:23 ` Pip Cet
2024-07-06 12:39 ` Gerd Möllmann
2024-07-06 12:30 ` Eli Zaretskii
2024-07-06 12:43 ` Gerd Möllmann
2024-07-06 13:53 ` Eli Zaretskii
2024-07-06 12:36 ` Gerd Möllmann
2024-07-06 14:00 ` Helmut Eller
2024-07-06 14:08 ` Gerd Möllmann
2024-07-06 14:24 ` Gerd Möllmann
2024-07-06 14:44 ` Helmut Eller
2024-07-06 14:52 ` Gerd Möllmann
2024-07-06 15:49 ` Pip Cet
2024-07-06 16:31 ` Gerd Möllmann
2024-07-06 16:56 ` Pip Cet [this message]
2024-07-06 17:28 ` Gerd Möllmann
2024-07-06 17:31 ` Gerd Möllmann
2024-07-06 18:30 ` Pip Cet
2024-07-06 20:00 ` Gerd Möllmann
2024-07-06 20:09 ` Ihor Radchenko
2024-07-07 3:55 ` Gerd Möllmann
2024-07-07 4:27 ` Gerd Möllmann
2024-07-07 4:30 ` Gerd Möllmann
2024-07-07 6:38 ` Pip Cet
2024-07-07 7:31 ` Gerd Möllmann
2024-07-07 7:44 ` Helmut Eller
2024-07-07 8:10 ` Gerd Möllmann
2024-07-07 8:24 ` Gerd Möllmann
2024-07-07 8:47 ` Pip Cet
2024-07-07 9:24 ` Gerd Möllmann
2024-07-07 9:26 ` Gerd Möllmann
2024-07-07 10:47 ` Eli Zaretskii
2024-07-07 11:19 ` Gerd Möllmann
2024-07-07 14:09 ` Eli Zaretskii
2024-07-07 14:15 ` Gerd Möllmann
2024-07-07 14:42 ` Eli Zaretskii
2024-07-07 14:52 ` Gerd Möllmann
2024-07-07 15:34 ` Eli Zaretskii
2024-07-07 15:36 ` Gerd Möllmann
2024-07-07 16:00 ` Eli Zaretskii
2024-07-07 17:08 ` Gerd Möllmann
2024-07-07 17:49 ` Eli Zaretskii
2024-07-07 18:15 ` Gerd Möllmann
2024-07-07 18:22 ` Eli Zaretskii
2024-07-07 18:29 ` Gerd Möllmann
2024-07-07 14:16 ` Gerd Möllmann
2024-07-07 14:18 ` Gerd Möllmann
2024-07-07 10:57 ` Pip Cet
2024-07-07 11:35 ` Gerd Möllmann
2024-07-07 11:48 ` Gerd Möllmann
2024-07-07 14:07 ` Gerd Möllmann
2024-07-07 14:21 ` Pip Cet
2024-07-07 14:27 ` Gerd Möllmann
2024-07-07 15:22 ` Helmut Eller
2024-07-07 15:40 ` Gerd Möllmann
2024-07-07 15:52 ` Helmut Eller
2024-07-07 15:56 ` Gerd Möllmann
2024-07-07 15:57 ` Pip Cet
2024-07-07 16:26 ` Helmut Eller
2024-07-07 17:03 ` Gerd Möllmann
2024-07-07 18:40 ` Gerd Möllmann
2024-07-07 18:53 ` Helmut Eller
2024-07-07 19:00 ` Gerd Möllmann
2024-07-07 19:31 ` Pip Cet
2024-07-07 19:36 ` Gerd Möllmann
2024-07-08 9:11 ` MPS: commit limit Gerd Möllmann
2024-07-10 6:46 ` Helmut Eller
2024-07-10 7:08 ` Gerd Möllmann
2024-07-16 15:16 ` Helmut Eller
2024-07-16 15:27 ` Eli Zaretskii
2024-07-16 15:43 ` Helmut Eller
2024-07-16 15:54 ` Eli Zaretskii
2024-07-16 16:29 ` Helmut Eller
2024-07-16 16:39 ` Gerd Möllmann
2024-07-16 16:43 ` Pip Cet
2024-07-16 16:56 ` Gerd Möllmann
2024-07-16 15:32 ` Eli Zaretskii
2024-07-16 16:27 ` Helmut Eller
2024-07-16 18:49 ` Pip Cet
2024-07-17 6:15 ` Helmut Eller
2024-07-16 16:32 ` Pip Cet
2024-07-16 16:48 ` Helmut Eller
2024-07-08 5:11 ` MPS: weak hash tables Pip Cet
2024-07-08 5:17 ` Gerd Möllmann
2024-07-08 5:37 ` Pip Cet
2024-07-08 5:43 ` Gerd Möllmann
2024-07-07 8:49 ` Gerd Möllmann
2024-07-08 9:16 ` Andrea Corallo
2024-07-08 9:24 ` Gerd Möllmann
2024-07-08 9:54 ` Andrea Corallo
2024-07-08 10:10 ` Gerd Möllmann
2024-07-08 11:57 ` MPS: out-of-memory Eli Zaretskii
2024-07-08 13:46 ` Gerd Möllmann
2024-07-08 16:45 ` Pip Cet
2024-07-08 18:26 ` Gerd Möllmann
2024-07-08 19:44 ` Pip Cet
2024-07-09 3:58 ` Gerd Möllmann
2024-07-08 18:27 ` Helmut Eller
2024-07-08 18:31 ` Gerd Möllmann
2024-07-08 19:14 ` Eli Zaretskii
2024-07-08 19:35 ` Gerd Möllmann
2024-07-08 19:08 ` Eli Zaretskii
2024-07-08 19:31 ` Pip Cet
2024-07-04 15:22 ` MPS: weak hash tables Helmut Eller
2024-07-04 15:33 ` Pip Cet
2024-07-04 16:46 ` Gerd Möllmann
2024-07-04 16:43 ` Gerd Möllmann
2024-07-02 13:50 ` Mattias Engdegård
2024-07-02 6:57 ` Gerd Möllmann
2024-07-02 7:15 ` Gerd Möllmann
2024-07-02 8:46 ` Ihor Radchenko
2024-07-02 8:59 ` Gerd Möllmann
2024-07-02 9:33 ` Ihor Radchenko
2024-07-02 9:35 ` Pip Cet
2024-07-02 11:03 ` Ihor Radchenko
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='p-W0YoiRjQW21JD6a3-xWurdrTQ_D7cfmZfKnr0PY95h2xd6w3Wg0Knk_m49zqRUeVjW3kO-6YPVOfEWjQGOzDKzxPIOJUXiGxBa8a0JzJk=@protonmail.com' \
--to=pipcet@protonmail.com \
--cc=eliz@gnu.org \
--cc=eller.helmut@gmail.com \
--cc=emacs-devel@gnu.org \
--cc=gerd.moellmann@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 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).