caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Fabrice Le Fessant <fabrice.le_fessant@inria.fr>
To: caml-list@yquem.inria.fr
Subject: Re: [Caml-list] Re: Question about float refs.
Date: Wed, 01 Sep 2010 10:31:28 +0200	[thread overview]
Message-ID: <4C7E0F60.6030406@inria.fr> (raw)
In-Reply-To: <AANLkTimWwzasrCYA2FHg+Kn_CN_yLBerWRDsSyqBrYgT@mail.gmail.com>

If you replace (!r +. 0.) by (!r), you are passing the content of the
reference as an argument to the function. Function arguments are not
unboxed in ocamlopt, so the compiler sees a boxed occurrence of the
float, and so must allocate it. The compiler could decide to have the
float both as boxed and unboxed values, but since the reference is
modified in the loop, there would be a risk of inconsistency, and so the
compiler decides to have only a boxed value, and so the loop is much
slower since it has to allocate the float at each iteration (the
reference itself is probably not allocated).

With (!r +. 0.), the float is not used as argument of a function, but in
a floating-point computation, where unboxed values are allowed. As a
consequence, the compiler discovers that all occurrences of the float
can be unboxed, and so decides to unbox the value completely.

--Fabrice

Dmitry Bely wrote, On 09/01/2010 09:18 AM:
> On Tue, Aug 31, 2010 at 11:41 PM, Jon Harrop
> <jonathandeanharrop@googlemail.com> wrote:
> 
>> You might prefer to multiply by 1.0 because adding 0.0 changes -0.0.
>>
>> Cheers,
>> Jon.
>>
>>> Some black magic is needed:
>>>
>>> let r = ref 0.0 in
>>> for i = 0 to 1000_000_000 do r := float i done;
>>> Printf.printf "%f\n" (!r +. 0.);
>>> Printf.printf "words: %f\n" (Gc.stat ()).Gc.minor_words
>>>
>>> and the reference will be placed in a register (Caml heap will not be
>>> used inside the loop)
> 
> Do you have any idea why the optimizer needs that?
> 
> - Dmitry Bely
> 
> _______________________________________________
> Caml-list mailing list. Subscription management:
> http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
> Archives: http://caml.inria.fr
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
> 

-- 
Fabrice LE FESSANT
Chercheur, Equipe ASAP
(As Scalable As Possible)
http://www.lefessant.net/

INRIA-Futurs, Bat P - 112
Parc Orsay Université
2-4, rue Jacques Monod
F-91893 Orsay Cedex, FRANCE


  parent reply	other threads:[~2010-09-01  8:32 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-08-19 11:52 Ethan Burns
2010-08-19 13:14 ` [Caml-list] " Lukasz Stafiniak
2010-08-19 13:34 ` David House
2010-08-19 13:49   ` Till Varoquaux
2010-08-23 12:06 ` Christophe TROESTLER
2010-08-23 12:14   ` Ethan Burns
2010-08-23 12:42     ` Sylvain Le Gall
2010-08-23 13:00       ` [Caml-list] " Dmitry Bely
2010-08-31 19:41         ` Jon Harrop
2010-09-01  7:18           ` Dmitry Bely
2010-09-01  7:46             ` Christophe TROESTLER
2010-09-01  8:31             ` Fabrice Le Fessant [this message]
2010-09-01  9:54               ` Ethan Burns
2010-09-01 12:29                 ` Fabrice Le Fessant

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4C7E0F60.6030406@inria.fr \
    --to=fabrice.le_fessant@inria.fr \
    --cc=caml-list@yquem.inria.fr \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).