| Karim Belabas on Mon, 09 Jun 2008 08:46:53 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Re: Erreur de segmentation ??? |
* Bill Allombert [2008-05-26 22:19]:
> On Mon, May 26, 2008 at 11:35:34AM +0200, Olivier Ramare wrote:
>> Bill Allombert a écrit :
>>>Now of course, the question is whether this is a memory leak in GP,
>>>or you are allocating too much memory.
>>>
>>
>> Ok, I found it :-)
>> This script is not supposed to allocate any (sizeable) memory chunk.
>> The main part Walk does not.
>> It calls DiscreteValue, which has local variables and this is the
>> source of all the stack. The main variable is
>>
>> mybiggamma = vector(bigD) (well, bigD is 2 here)
>>
>> and making this variable global saves a lot (but not all: the
>> stack still increases somewhat but at a much lower rate).
>>
>> If I'm not mistaken, this *is* a memory leak.
>
> I reran your script with PARI 2.4.3SVN (the development version) and
> the memory usage was constant (about 6Mb). So this really start
> looking like a memory leak in the stable version.
This is a leak. The following patch should solve it:
Index: src/language/anal.c
===================================================================
--- src/language/anal.c (revision 10178)
+++ src/language/anal.c (working copy)
@@ -640,7 +640,7 @@
var_cell *v = (var_cell*) ep->args;
if (v == INITIAL) return;
- if (v->flag == COPY_VAL) killbloc((GEN)ep->value);
+ killbloc((GEN)ep->value);
ep->value = v->value;
ep->args = (void*) v->prev;
free((void*)v);
Without recompiling, a simple workaround is to move initializations by
*vector* values out of the 'local' declaration. I.e. replace
local(mybiggamma = vector(bigD));
by
local(mybiggamma);
mybiggamma = vector(bigD));
This problem was specific to the old parser-evaluator and died with it,
it no longer exists in current svn.
K.B.
P.S: [Olivier] I guess you're aware that the script can be made rather faster by
moving constant expressions out of the inner loops ? ( our optimizer is
not really up to the task yet :-)
Also expressions like
for(d = 1, bigD, bestoldvalue[1][d] = mygamma[d]);
bestoldvalue[2] = bigY;
bestoldvalue[4] = etaa;
bestoldvalue[5] = lambdaa;
bestoldvalue[6] = majo;
are more conveniently written as
bestoldvalue = [mygamma, bigY, p, etaa, lambdaa, majo];
(don't see the need to include the constant p in that structure, but ...).
The latter happens to be about 5 times faster in svn; and (relatively) even
better in pari-stable.
--
Karim Belabas, IMB (UMR 5251) Tel: (+33) (0)5 40 00 26 17
Universite Bordeaux 1 Fax: (+33) (0)5 40 00 69 50
351, cours de la Liberation http://www.math.u-bordeaux.fr/~belabas/
F-33405 Talence (France) http://pari.math.u-bordeaux.fr/ [PARI/GP]
`