Karim Belabas on Thu, 6 Sep 2001 23:27:37 +0000 (GMT) |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: addfrac() + Karatsuba = bug (fwd) |
On Tue, 4 Sep 2001, Michael Somos wrote: > Christian Cornelssen mentioned his testing of the bug code. However, > I should mention that I did extensive testing and debugging before > I posted the message. I found that the 'avma = (long)z;' in three > places near the end of 'addfrac()' leads to 'quickmulii()' eventually > clobbering 'delta' in 'addfrac()' near the end. I suggest using the > alternate 'avma = (long)delta;' in these threee cases. I did not have > time to fully test if this is the correct solution. The current CVS has been corrected. I did minimal changes to 2.1.1 (stable version), and extensive changes to 2.2.1 (alpha). I'll try to release those two versions in the near future (it may be difficult, I'm moving houses). > There may be lot of other issues involved here with interaction of code > with respect to setting of 'avma'. The old code [due to me:-(] assumed that mulii(x,y) wouldn't need more than lgefint(x) + lgefint(y) scratch words, which wasn't a documented feature of mulii, but happened to be true at the time. When I later changed mulii to at least use (a primitive) Karatsuba, the old assumption wasn't valid anymore, hence the bug. I've checked the whole library code [most recent CVS] for such "efficient-but-dangerous" garbage collections; I found about 40 places. They only make use of the following "features", icopy(x) needs lgefint(x) words subii/addii(x,y) needs max(lgefint(x), lgefint(y)) words modii(x,y) needs (at most) lgefint(x) + 2 * lgefint(y) words The first two are hardly likely to change. It's not clear for the last one, especially if Montgomery multiplication is introduced (as it should). I left a /* HACK */ marker in those places where it still survives. This is still quite unsatisfactory: direct memory access should be restricted to the src/kernel routines, and duly commented. So far, they make the routines about 20% more efficient than they would be using regular gerepiles (which are much sturdier, at least in such simple situations) for typical examples [e.g single word]. But they shouldn't be spread out in the code like that. I will think it over. > Certainly it would have saved lots of debugging time if more effective > memory allocation monitoring were in place. I don't see any such capability > right now. That seems to be why small changes in one routine was able to > clobber memory used by another. No such capability indeed; stack corruption is a nightmare to debug. Fortunately it's quite a rare occurence (so far), and easily spotted when it affects a gerepile ("pointers lost in gerepile") [not so for direct accesses]. But the development effort to change the memory management [e.g using Boehm's GC], without sacrificing performance, is staggering (to me at least). Cheers, Karim. -- Karim Belabas email: Karim.Belabas@math.u-psud.fr Dep. de Mathematiques, Bat. 425 Universite Paris-Sud Tel: (00 33) 1 69 15 57 48 F-91405 Orsay (France) Fax: (00 33) 1 69 15 60 19 -- PARI/GP Home Page: http://www.parigp-home.de/