Karim Belabas on Tue, 04 Jul 2017 14:04:30 +0200


[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]

Re: gcopy_avma() is wasting stack memory compared to gcopy()


* Jens Schmidt [2017-07-04 13:01]:
> Thanks for your explanation.
> 
> I'm using gcopy_avma() outside threads in some situations where it's
> very effective and works fine. Appended is an example that computes
> vampire numbers.
> 
> The only difficult is to ensure that there is no memory overlapping when
> copying stack objects. During analyzation of repiled stack I noticed
> increased consumption with gcopy_avma() and non-recusive types.
[...]
>    for (i = 1; i < lg(D); i++) {       /* examine divisors of n */
>         p = gel(D, i);
>         q = divii(n, p);

Aside 1:
          p = gel(D, i);
          q = gel(D, lg(D)-i);

is less expensive (and guaranteed to work).

>         F = cgetg(3, t_VEC);            /* write pair of fangs p,q */
>         gel(F, 1) = p;
>         gel(F, 2) = q;
> 
>         gel(R, z++) = F;                /* append fangs to result vector */

Aside2 : this can be streamlined as

          gel(R, z++) = mkvec2(p,q);     /* append fangs to result vector */

[...]
>   R = gcopy_avma(R, &ltop);     /* copy result to top of stack (no memory overlapping) */

This is dangerous: parts of the initial R can be overwritten by
gcopy_avma [ it may or may not be correct in your situation, this
requires a thorough check... ]

> 
>   avma = ltop;                  /* garbage collection */
> 
>   return R;

The standard way to deal with this situation is to replace the above
three lines by

    return gerepilecopy(ltop, R);

(which is a little less effective but much less error prone). The timing
difference should be negligible.

Cheers,


    K.B.
--
Karim Belabas, IMB (UMR 5251)  Tel: (+33) (0)5 40 00 26 17
Universite de Bordeaux         Fax: (+33) (0)5 40 00 21 23
351, cours de la Liberation    http://www.math.u-bordeaux.fr/~kbelabas/
F-33405 Talence (France)       http://pari.math.u-bordeaux.fr/  [PARI/GP]
`