* Re: Optimizing Float Ref's (Yaron Minsky)
[not found] <20090831100004.59CF5BC37@yquem.inria.fr>
@ 2009-08-31 11:38 ` Bertrand Jeannet
0 siblings, 0 replies; only message in thread
From: Bertrand Jeannet @ 2009-08-31 11:38 UTC (permalink / raw)
To: caml-list
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
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2009-08-31 11:41 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20090831100004.59CF5BC37@yquem.inria.fr>
2009-08-31 11:38 ` Optimizing Float Ref's (Yaron Minsky) Bertrand Jeannet
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox