it is a fairer test working from a second copy of the data that has been prescaled(x::Float64) = x * 2.0^64
On Monday, July 13, 2015 at 12:51:33 PM UTC-4, Jeffrey Sarnoff wrote: > > Staying with Float64, see if the runtime comes way down when you prescale > the data using prescale(x) = x * 2.0^64 > > > Guessing your values to be less than 10^15, and assuming the worst case > smallest magnitude > the base10 exponent of your largest data value is below 70 scale by > constant is a good strategy when the largest of the data values is not large > > On Monday, July 13, 2015 at 12:04:32 PM UTC-4, Yichao Yu wrote: >> >> On Mon, Jul 13, 2015 at 11:39 AM, Jeffrey Sarnoff >> <jeffrey...@gmail.com> wrote: >> >> Thanks for sharing your view about denormal values. I hope what I said >> doesn't seem that I want to get rid of them completely (and if it did >> sound like that, I didn't meant it...). I didn't read the more detail >> analysis of their impact but I would believe you that they are >> important in general. >> >> For my specific application, I'm doing time propagation on a >> wavefunction (that can decay). For my purpose, there are many other >> sources of uncertainty and I'm mainly interested in how the majority >> of the wavefunction behave. Therefore I don't really care about the >> actually value of something smaller than 10^-10 but I do want it to >> run fast. Since this is a linear problem, I can also scale the values >> by a constant factor to make underflow less of a problem. >> >> > I have not looked at the specifics of what is going on ... >> > Dismissing denormals is particularly dicey when your functional data >> flow is >> > generating many denormalized values. >> > >> > Do you what it is causing many values of very small magnitude to occur >> as >> > you run this? >> > >> > Is the data holding them explicitly? If so, and you have access to >> > preprocess the data, and you are sure that software >> > cannot accumulate or reciprocate or exp etc them, clamp those values to >> zero >> > and then use the data. >> > >> > Does the code operate as a denormalized value generator? If so, a small >> > alteration to the order of operations may help. >> > >> > >> > >> > On Monday, July 13, 2015 at 9:45:59 AM UTC-4, Jeffrey Sarnoff wrote: >> >> >> >> Cleve Moler's discussion is not quite as "contextually invariant" as >> are >> >> William Kahan's and James Demmel's. >> >> In fact "the numerical analysis community" has made an overwhelmingly >> >> strong case that, roughly speaking, >> >> one is substantively better situated where denormalized floating point >> >> values will be used whenever they may >> >> arise than being free of those extra cycles at the mercy of an absent >> >> smoothness shoving those values to zero. >> >> And this holds widely for floating point centered applications or >> >> libraries. >> >> >> >> If the world were remade with each sunrise by fixed bitwidth floating >> >> point computations, supporting denormals >> >> is to have made house-calls with few numerical vaccines to everyone >> who >> >> will be relying on those computations >> >> to inform expectations about non-trivial work with fixed bitwdith >> floating >> >> point types. It does not wipe out all forms >> >> of numerical untowardness, and some will find the vaccinces more >> >> prophylatic than others; still, the analogy holds. >> >> >> >> We vaccinate many babies against measles even though there are some >> who >> >> would never have become exposed >> >> to that disease .. and for those who forgot why, not long ago the news >> was >> >> about a Disney vaction disease nexus >> >> and how far it spread -- then California changed its law to make it >> more >> >> difficult to opt-out of childhood vaccination. >> >> Having denormals there when the values they cover arise brings benifit >> >> that parallels the good in that law change. >> >> The larger social environment gets better by growing stronger and >> that >> >> can happen because somethat that had >> >> been bringing weakness (disease or bad consequences from subtile >> numbery >> >> misadventures) no longer operates. >> >> >> >> There is another way denormals have been shown to be matter -- the way >> >> above ought to help you feel at ease >> >> with deciding not to move your work from Float64 to Float32 for the >> >> purpose of avoiding values that hover around >> >> smaller magnitudes realizable with Float64s. That sounds like a >> headache, >> >> and you would not have changed >> >> the theory in a way that makes things work (or at all). Recasting >> the >> >> approch to solving ot transforming at hand >> >> to work with integer values would move the work away from any cost and >> >> benefit that accompany denormals. >> >> Other that that, thank your favorite floating point microarchitect for >> >> giving you greater throughput with denormals >> >> than everyone had a few design cycles ago. >> >> >> >> I would like their presence without measureable cost .. just not >> enough to >> >> dislike their availability. >> >> >> >> On Monday, July 13, 2015 at 8:02:13 AM UTC-4, Yichao Yu wrote: >> >>> >> >>> > As for doing it in julia, I found @simonbyrne's mxcsr.jl[1]. >> However, >> >>> > I couldn't get it working without #11604[2]. Inline assembly in >> >>> > llvmcall is working on LLVM 3.6 though[3], in case it's useful for >> >>> > others. >> >>> > >> >>> >> >>> And for future references I find #789, which is not documented >> >>> anywhere AFAICT.... (will probably file a doc issue...) >> >>> It also supports runtime detection of cpu feature so it should be >> much >> >>> more portable. >> >>> >> >>> [1] https://github.com/JuliaLang/julia/pull/789 >> >>> >> >>> > >> >>> > [1] https://gist.github.com/simonbyrne/9c1e4704be46b66b1485 >> >>> > [2] https://github.com/JuliaLang/julia/pull/11604 >> >>> > [3] >> >>> > >> https://github.com/yuyichao/explore/blob/a47cef8c84ad3f43b18e0fd797dca9debccdd250/julia/array_prop/array_prop.jl#L3 >> >> >>> > >> >