caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Bertrand Jeannet <Bertrand.Jeannet@inrialpes.fr>
To: caml-list@yquem.inria.fr
Subject: Re: Optimizing Float Ref's (Yaron Minsky)
Date: Mon, 31 Aug 2009 13:38:22 +0200	[thread overview]
Message-ID: <4A9BB62E.3030907@inrialpes.fr> (raw)
In-Reply-To: <20090831100004.59CF5BC37@yquem.inria.fr>


The problem may not only be unboxing, but also allocation.

In your first code, you allocate two new cells each time you enter in 
the j-loop (one for the boxed float, and one for the reference cell 
"sum" pointing to it).
You should first move the line "let sum = ref 0.0" before the i-loop and 
just write at the same place "sum := 0".

I will not be as efficient as your second version (because you still 
have boxing), but it should still be much better.

Bertrand

> On Aug 28, 2009, at 4:32 PM, Will M Farr <farr@MIT.EDU> wrote:
> 
>> Hello all,
>>
>> I'm running OCaml 3.11.1, and I noticed something strange in some  
>> native code for matrix multiply today.  The code was
>>
>> let mmmul store m1 m2 =
>>  let (ni,nk) = dims m1 and
>>      (nk2,nj) = dims m2 and
>>      (sni,snj) = dims store in
>>  assert(nk=nk2);
>>  assert(ni=sni);
>>  assert(nj=snj);
>>  for i = 0 to ni - 1 do
>>    let row1 = m1.(i) and
>>        srow = store.(i) in
>>    for j = 0 to nj - 1 do
>>      let sum = ref 0.0 in   (* Un-boxed float ref? *)
>>      for k = 0 to nk - 1 do
>>        let row2 = Array.unsafe_get m2 k in
>>        let x = Array.unsafe_get row1 k and
>>            y = Array.unsafe_get row2 j in
>>        sum := !sum +. x*.y
>>      done;
>>      Array.unsafe_set srow j !sum
>>    done
>>  done;
>>  store
>>
>> (I compiled with ocamlopt.)  It multiplies the matrices (represented  
>> as arrays of arrays of floats) m1 and m2 together and puts the  result 
>> into the matrix store.  Profiling the code, I noticed a call  to 
>> caml_modify during the execution of this function!  Turns out  that 
>> the culprit was the float ref "sum".  Changing to the following  code 
>> (which eliminates the float ref, and uses the <- and .( )  operators 
>> instead of unsafe_set and unsafe_get) eliminated that  call, and sped 
>> things up tremendously:
>>
>> let mmmul store m1 m2 =
>>  let (ni,nk) = dims m1 and
>>      (nk2,nj) = dims m2 in
>>  for i = 0 to ni - 1 do
>>    let row1 = m1.(i) and
>>        srow = store.(i) in
>>    for j = 0 to nj - 1 do
>>      srow.(j) <- 0.0;
>>      for k = 0 to nk - 1 do
>>        let row2 = Array.unsafe_get m2 k in
>>        let x = row1.(k) and
>>            y = row2.(j) in
>>        srow.(j) <- srow.(j) +. x*.y
>>      done
>>    done
>>  done;
>>  store
>>
>> But, I thought that float ref's were automatically unboxed by the  
>> compiler when they didn't escape the local context.  Is this a  
>> complier bug, is there a bad interaction with unsafe_get and  
>> unsafe_set, or is there something else going on that I don't  
>> understand?  Any enlightenment would be appreciated.
>>
>> Thanks!
>> Will
>> _______________________________________________
>> 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
> 
> 
> 
> 
> ------------------------------------------------------------------------
> 
> _______________________________________________
> 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

-- 

Projet POP-ART, INRIA Rhône-Alpes
Zirst - 655 avenue de l'Europe - Montbonnot
F-38334 Saint Ismier Cedex
Fax: +33 (0)4 76 61 52 52
Tel: +33 (0)4 76 61 52 76
Bertrand.Jeannet@inrialpes.fr


           reply	other threads:[~2009-08-31 11:41 UTC|newest]

Thread overview: expand[flat|nested]  mbox.gz  Atom feed
 [parent not found: <20090831100004.59CF5BC37@yquem.inria.fr>]

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=4A9BB62E.3030907@inrialpes.fr \
    --to=bertrand.jeannet@inrialpes.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).