Some time ago, Elijah Stone pointed out that using
https://gmplib.org/manual/Low_002dlevel-Functions we could use J's
memory management routines directly, without having to deal with
libgmp's "exit the program if the library can't allocate memory"
behavior.

This seems like it would be a good thing for us. When completed, we
could eliminate the memory pool currently used when handling extended
values, and we could also relax the current limit placed on the
magnitude of extended values.

But changing everything all at once is a good way to never get started.

So, it's worth thinking about how we could organize this kind of effort.

Currently, the code is partitioned in three chunks: libgmp itself (or
mpir on windows), the jgmp.h/jgmpinit.h glue, and macros defined in
jgmp.h which are used in most of the rest of the system. (There's also
a few direct calls to libgmp functions in k.c, v2.c, vq.c, vx.c and
wn.c)

So, conceptually speaking, we could implement workalikes for these
macros (things like XaddXX() which rely on the lower level mpn_
functions instead of the problematic mpz_ / mpq_ functions. (We could
replace the direct calls with suitable macros, along the way. (Or, if
there's cases where there's really a significant performance
advantage, we could replace them with suitable direct calls to the
memory management routines and mpn_ functions. But this seems
unlikely.))

The trick would be allowing XNUM and RAT values whose memory was
allocated via libgmp to coexist with XNUM and RAT values whose memory
was allocated using J's memory manager. The details here are a bit
annoying, but fundamentally we've already provided for this.

Basically, the distinction matters when we free the memory. And, that
decision is based on FHRHISGMP==AFHRH(x) vs FHRHISGMP!=AFHRH(x) in
jgmp.h and jgmpinit.c

-----------------------------------------------

So.. it seems to me that if we created a parallel glue rig -- maybe
jgmpn.h -- we could start migrating functionality to the mpn_* family
of functions and J's "native" memory management. XaddXX() seems like
the place to start.

I would need to figure out how to deal with the "realloc" cases where
the amount of memory required for a calculation (like multiply or
format) might be larger or smaller - perhaps significantly larger -
than the memory needed to represent the result.

But, once started, the work could proceed gradually. As long as the
primitives continue to function, users mostly wouldn't notice the
changes. (And, ok, that sounds discouraging. But hopefully the end
result would be worth it.)

Thoughts?

My thought is that this kind of code cleanup seems worthwhile.

Thanks,

-- 
Raul
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to