Optimized RDF element allocation "a bit", new benchmarks: %pyrex
def foo(R, a, b, c, n): cdef int i a = R(a); b = R(b); c = R(c) for i from 0 <= i < n: z = a*b + b*c + c*a sage: time foo(RR, 3, 4.5, 200, N) CPU time: 0.32 s, Wall time: 0.33 s sage: time foo(RDF, 3, 4.5, 200, N) CPU time: 0.06 s, Wall time: 0.06 s def foo(R, a, b, c, n): cdef int i a = R(a); b = R(b); c = R(c) for i from 0 <= i < n: z = a.sin() + b.sin() - c.sin() sage: time foo(RR, 3, 4.5, 200, N) CPU time: 5.57 s, Wall time: 5.71 s sage: time foo(RDF, 3, 4.5, 200, N) CPU time: 0.16 s, Wall time: 0.15 s Unfortunately, I know MPFR can't be sped up that much... - Robert On Mar 28, 2007, at 5:29 PM, Robert Bradshaw wrote: > I ran lots of benchmarks before starting this post, I should have > included them. Here they are some typical ones: > > %pyrex > def foo(R, a, b, c, n): > cdef int i > a = R(a); b = R(b); c = R(c) > for i from 0 <= i < n: > z = a.sin().sin() > > sage: time foo(RR, 3, 4.5, 200, 10^5) > CPU time: 2.58 s, Wall time: 2.62 s > sage: time foo(RDF, 3, 4.5, 200, 10^5) # this is using the GSL sin > () function, _not_ the clib one. > CPU time: 0.11 s, Wall time: 0.14 s > > %pyrex > def foo(R, a, b, c, n): > cdef int i > a = R(a); b = R(b); c = R(c) > for i from 0 <= i < n: > z = a*b + b*c + c*a > > sage: time foo(RR, 3, 4.5, 200, 10^5) > CPU time: 0.30 s, Wall time: 0.31 s > sage: time foo(RDF, 3, 4.5, 200, 10^5) > CPU time: 0.15 s, Wall time: 0.14 s > > > %pyrex > def foo(R a, b, c, n): > cdef int i > a = R(a); b = R(b); c = R(c) > for i from 0 <= i < n: > z = a/b + b/c + c/a > > sage: time foo(RR, 3, 4.5, 200, 10^5) > CPU time: 0.33 s, Wall time: 0.35 s > sage: time foo(RDF, 3, 4.5, 200, 10^5) > CPU time: 0.14 s, Wall time: 0.15 s > > > Perhaps some more tests are in order, but I think the arithmetic > vs. object-creation-time ratio for RDF is huge, and has more room > for optimization (given the simple structure) than even the > integers had (and it would be much easier). As for using SageX to > do the benchmarks, I think that often if one cares about speed, the > functions you will be passing such arguments into will be written > in SageX. > > This was actually all a footnote to the main question of the > original post, namely having an UnparsedLiteralDecimal class used > by the preparser to avoid awkwardness like > > sage: RealField(100)('1.2') == RealField(100)(1.2) > False > > I've received (good) feedback on this issue from only two people. > > - Robert > > > > On Mar 28, 2007, at 4:54 PM, William Stein wrote: > >> On 3/28/07, Robert Bradshaw <[EMAIL PROTECTED]> wrote: >>>> If we decide that we value portability but not necessarily >>>> precision, >>>> we could use RDF but avoid using C library implementations of the >>>> mathematical functions. (Currently, RDF uses the C library for >>>> tan(), >>>> acos(), asin(), atan(), cosh(), sinh(), tanh(), according to a >>>> quick >>>> scan of real_double.pyx -- I may have missed some.) We would also >>>> want to verify that the GSL implementations are portable across >>>> architectures, and do something about 32-bit x86. >>> >>> I'm leaning towards this too. There area actually fpu_fix_* >>> functions >>> in the quad double package to handle 32-bit x86 that might be useful >>> to look at. >> >> My impression of the discussion so far is this: >> * There is a vague impression that RDF is "vastly faster" than >> RR (mpfr), >> so people are considering changing things so RDF is the >> default 53-bit >> real field in SAGE, purely for efficiency reasons. >> * There is no discussions so far about actual benchmarks, and >> how much >> faster RDF really is. >> * RDF (=machine floats) mostly uses the C library float >> special functions that are potentially very >> inaccurate in comparison to mpfr special functions, so the >> suggestion >> is to maybe make RDF use better special functions. >> >> I did a few benchmarks (see below), and 53-bit RR mpfr arithmetic in >> the interpreter is maybe 10% slower than RDF, i.e., arithmetic >> doesn't >> make enough of a difference to warrant even considering switching to >> RDF from RR. I then did benchmarks with some trig functions and >> there >> RDF is vastly faster, over 20 times faster in one benchmark. >> >> Conclusion: The only justifiable reason to switch to RDF for the >> default 53-bit real field is to speed up special function evaluation. >> But ironically, the fast special functions fror 53-bit floats have >> serious quality and precision issues, so we probably wouldn't switch >> unless we made them better, which will necessarily make them much >> slower (?). >> >> Benchmarks: >> >> {{{ >> %time >> a = RDF(1.5); b = RDF(27.3) >> for i in range(10^6): >> c = a*b + a+b + a-b >> /// >> CPU time: 2.09 s, Wall time: 3.33 s >> }}} >> >> {{{ >> %time >> a = RR(1.5); b = RR(27.3) >> for i in range(10^6): >> c = a*b + a+b + a-b >> /// >> CPU time: 2.14 s, Wall time: 3.95 s >> }}} >> >> {{{ >> %time >> a = RDF(1.5); b = RDF(27.3) >> for i in range(10^6): >> c = a*b >> /// >> CPU time: 0.58 s, Wall time: 1.06 s >> }}} >> >> {{{ >> %time >> a = RR(1.5); b = RR(27.3) >> for i in range(10^6): >> c = a*b >> /// >> CPU time: 0.69 s, Wall time: 0.97 s >> }}} >> >> {{{ >> %time >> a = RDF(1.5); b = RDF(27.3) >> for i in range(10^6): >> c = a.sin() * b.cos() >> /// >> CPU time: 1.64 s, Wall time: 3.01 s >> }}} >> >> {{{ >> %time >> a = RR(1.5); b = RR(27.3) >> for i in range(10^6): >> c = a.sin() * b.cos() >> /// >> CPU time: 22.17 s, Wall time: 36.39 s >> }}} >> >> > --~--~---------~--~----~------------~-------~--~----~ To post to this group, send email to sage-devel@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sage-devel URLs: http://sage.scipy.org/sage/ and http://modular.math.washington.edu/sage/ -~----------~----~----~----~------~----~------~--~---