* Efficiency of let/and
@ 2005-09-25 13:31 Brian Hurt
2005-09-25 14:47 ` [Caml-list] " Jon Harrop
2005-09-26 4:32 ` Ant: " Martin Chabr
0 siblings, 2 replies; 21+ messages in thread
From: Brian Hurt @ 2005-09-25 13:31 UTC (permalink / raw)
To: caml-list
Say I have two variables I want to set- variable a to the value expr1 and
variable b to the value expr2. The two expressions are pure (no side
effects), and neither one depends upon the other (neither expr1 nor expr2
contain either a or b as a value), so they can be evaluated in either
order or in parallel with no harm. With expressions like these, I've
gotten into the habit of using let/and to express the parallelism, that is
I go:
let a = expr1
and b = expr2
in
...
rather than:
let a = expr1 in
let b = expr2 in
So my question is: is there any value (other than the documentation value)
in doing this?
Just wondering.
Brian
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Caml-list] Efficiency of let/and
2005-09-25 13:31 Efficiency of let/and Brian Hurt
@ 2005-09-25 14:47 ` Jon Harrop
2005-09-26 4:32 ` Ant: " Martin Chabr
1 sibling, 0 replies; 21+ messages in thread
From: Jon Harrop @ 2005-09-25 14:47 UTC (permalink / raw)
To: caml-list
On Sunday 25 September 2005 14:31, Brian Hurt wrote:
> So my question is: is there any value (other than the documentation value)
> in doing this?
Good question. I've no idea. However, I did notice that this change has been
undone (i.e. to use "let" twice and not "and") in the stdlib.
--
Dr Jon D Harrop, Flying Frog Consultancy Ltd.
Objective CAML for Scientists
http://www.ffconsultancy.com/products/ocaml_for_scientists
^ permalink raw reply [flat|nested] 21+ messages in thread
* Ant: [Caml-list] Efficiency of let/and
2005-09-25 13:31 Efficiency of let/and Brian Hurt
2005-09-25 14:47 ` [Caml-list] " Jon Harrop
@ 2005-09-26 4:32 ` Martin Chabr
2005-09-26 5:24 ` Fernando Alegre
` (3 more replies)
1 sibling, 4 replies; 21+ messages in thread
From: Martin Chabr @ 2005-09-26 4:32 UTC (permalink / raw)
To: Brian Hurt; +Cc: caml-list
As it appears to me, there is no semantic difference
between both alternatives. It can be shown with two
dependent expressions y = 1 and z = y + 2:
# let y = 1 in
let z = y + 2 in
z;;
- : int = 3
# let y = 1
and z = y + 2 in
z;;
- : int = 3
The order is important in both cases:
# let z = y + 2 in
let y = x + 1 in
z;;
Characters 8-9:
let z = y + 2 in
^
Unbound value y
# let z = y + 2
and y = 1 in
z;;
Characters 8-9:
let z = y + 2
^
Unbound value y
So the "and"-form depends on the order as well and I
think the syntactic difference can be just used for
documentation. A good idea, by the way.
I hope this helps
Martin
--- Brian Hurt <bhurt@spnz.org> schrieb:
>
> Say I have two variables I want to set- variable a
> to the value expr1 and
> variable b to the value expr2. The two expressions
> are pure (no side
> effects), and neither one depends upon the other
> (neither expr1 nor expr2
> contain either a or b as a value), so they can be
> evaluated in either
> order or in parallel with no harm. With expressions
> like these, I've
> gotten into the habit of using let/and to express
> the parallelism, that is
> I go:
>
> let a = expr1
> and b = expr2
> in
> ...
>
> rather than:
> let a = expr1 in
> let b = expr2 in
>
> So my question is: is there any value (other than
> the documentation value)
> in doing this?
>
> Just wondering.
>
> Brian
>
> _______________________________________________
> 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
>
___________________________________________________________
Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos - Hier anmelden: http://mail.yahoo.de
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Ant: [Caml-list] Efficiency of let/and
2005-09-26 4:32 ` Ant: " Martin Chabr
@ 2005-09-26 5:24 ` Fernando Alegre
2005-09-26 5:56 ` William Lovas
` (2 subsequent siblings)
3 siblings, 0 replies; 21+ messages in thread
From: Fernando Alegre @ 2005-09-26 5:24 UTC (permalink / raw)
To: Martin Chabr; +Cc: Brian Hurt, caml-list
There is a small advantage in using "and" instead of "in let":
# let () =
let x = 2 and x = 5 in ();;
This variable is bound several times in this matching
# let () =
let x = 2 in let x = 5 in ();;
Probably the second "x" should have been a "y"... so the compiler catches
that mistake.
Fernando
> > let a = expr1
> > and b = expr2
> > in
> > ...
> >
> > rather than:
> > let a = expr1 in
> > let b = expr2 in
> >
> > So my question is: is there any value (other than
> > the documentation value)
> > in doing this?
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Ant: [Caml-list] Efficiency of let/and
2005-09-26 4:32 ` Ant: " Martin Chabr
2005-09-26 5:24 ` Fernando Alegre
@ 2005-09-26 5:56 ` William Lovas
2005-09-26 7:17 ` Bill Wood
2005-09-26 20:59 ` Ant: " Martin Chabr
2005-09-26 13:22 ` Brian Hurt
2005-09-26 17:05 ` Marius Nita
3 siblings, 2 replies; 21+ messages in thread
From: William Lovas @ 2005-09-26 5:56 UTC (permalink / raw)
To: caml-list
On Mon, Sep 26, 2005 at 06:32:40AM +0200, Martin Chabr wrote:
> As it appears to me, there is no semantic difference
> between both alternatives. It can be shown with two
> dependent expressions y = 1 and z = y + 2:
This is not universally true:
> # let y = 1
> and z = y + 2 in
> z;;
> - : int = 3
Objective Caml version 3.08.1
# let y = 1
and z = y + 2 in
z;;
Unbound value y
So either you are using a version older than 3.08.1 or this is a fairly
recent change. In the latter case, people who wish to remain backward-
compatible might eschew this style for sequential bindings, regardless
of any potential performance problems.
William
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Ant: [Caml-list] Efficiency of let/and
2005-09-26 5:56 ` William Lovas
@ 2005-09-26 7:17 ` Bill Wood
2005-09-26 20:59 ` Ant: " Martin Chabr
1 sibling, 0 replies; 21+ messages in thread
From: Bill Wood @ 2005-09-26 7:17 UTC (permalink / raw)
To: caml-list
. . .
> This is not universally true:
>
> > # let y = 1
> > and z = y + 2 in
> > z;;
> > - : int = 3
>
> Objective Caml version 3.08.1
>
> # let y = 1
> and z = y + 2 in
> z;;
> Unbound value y
>
> So either you are using a version older than 3.08.1 or this is a fairly
> recent change. In the latter case, people who wish to remain backward-
> compatible might eschew this style for sequential bindings, regardless
> of any potential performance problems.
I'm using Objective Caml version 3.08.3 and had this interaction:
# let y = 1
and z = y + 2 in
z;;
Unbound value y
#
-- Bill Wood
bill.wood@acm.org
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Ant: [Caml-list] Efficiency of let/and
2005-09-26 4:32 ` Ant: " Martin Chabr
2005-09-26 5:24 ` Fernando Alegre
2005-09-26 5:56 ` William Lovas
@ 2005-09-26 13:22 ` Brian Hurt
2005-09-26 16:05 ` Ant: " Stefan Monnier
2005-09-26 17:04 ` Ant: [Caml-list] " Mackenzie Straight
2005-09-26 17:05 ` Marius Nita
3 siblings, 2 replies; 21+ messages in thread
From: Brian Hurt @ 2005-09-26 13:22 UTC (permalink / raw)
To: Martin Chabr; +Cc: caml-list
On Mon, 26 Sep 2005, Martin Chabr wrote:
> As it appears to me, there is no semantic difference
> between both alternatives. It can be shown with two
> dependent expressions y = 1 and z = y + 2:
>
> # let y = 1 in
> let z = y + 2 in
> z;;
> - : int = 3
Actually, my example would be more like:
let y = 1 in
let z = 2 in
...
vr.s
let y = 1
and z = 2
in
...
Or, more commonly, something like:
let foo arr1 arr2 =
(* I need the lengths of both arrays *)
let len1 = Array.length arr1
and len2 = Array.length arr2
in
...
Syntactically and semantically there is no difference. I was wondering if
the ocamlopt compiler took advatange of the implicit paralellism at all.
Brian
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Ant: Efficiency of let/and
2005-09-26 13:22 ` Brian Hurt
@ 2005-09-26 16:05 ` Stefan Monnier
2005-09-26 16:30 ` [Caml-list] " Brian Hurt
2005-09-27 5:32 ` skaller
2005-09-26 17:04 ` Ant: [Caml-list] " Mackenzie Straight
1 sibling, 2 replies; 21+ messages in thread
From: Stefan Monnier @ 2005-09-26 16:05 UTC (permalink / raw)
To: caml-list
> Syntactically and semantically there is no difference. I was wondering if
> the ocamlopt compiler took advatange of the implicit paralellism at all.
If someone tries to use such things as `and' or
unspecified-argument-evaluation-order in the hopes that the compiler will
extract some imagined parallelism is simply deluding himself.
In some cases, the freedom to execute in any order does lead to better
code, but that code rarely if ever uses any kind of parallelism.
Stefan
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Caml-list] Re: Ant: Efficiency of let/and
2005-09-26 16:05 ` Ant: " Stefan Monnier
@ 2005-09-26 16:30 ` Brian Hurt
2005-09-27 5:52 ` skaller
2005-09-27 5:32 ` skaller
1 sibling, 1 reply; 21+ messages in thread
From: Brian Hurt @ 2005-09-26 16:30 UTC (permalink / raw)
To: Stefan Monnier; +Cc: caml-list
On Mon, 26 Sep 2005, Stefan Monnier wrote:
>> Syntactically and semantically there is no difference. I was wondering if
>> the ocamlopt compiler took advatange of the implicit paralellism at all.
>
> If someone tries to use such things as `and' or
> unspecified-argument-evaluation-order in the hopes that the compiler will
> extract some imagined parallelism is simply deluding himself.
> In some cases, the freedom to execute in any order does lead to better
> code, but that code rarely if ever uses any kind of parallelism.
I was thinking of instruction-level parallelism- the ability of the
compiler to reorder instructions to better use the available functional
units, not thread-level parallelism. Sorry for not being clear there.
I'm not even sure how much extra efficiency is there to be had. Obviously
it'd be hard "thread" calls to complex functions, so code like:
let foo lst1 lst2 =
let len1 = List.length lst1
and len2 = List.length lst2
in
...
wouldn't be helped- it'd be computationally infeasible for the compiler to
interleave the two different calls to List.length. So you'd pretty
obviously be limited to "simple" expressions, at which point the CPU's own
prefetching and reordering is likely to do the work for you wether the
compiler does it or not. In fact, the CPU's reordering can start
executing the code to List.length lst2 speculatively before the call to
List.length lst1 is complete, and in that sense the CPU's reordering is
more capable then what the compiler can do (this, BTW, is the fundamental
problem with the Itanium).
Brian
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Ant: [Caml-list] Efficiency of let/and
2005-09-26 13:22 ` Brian Hurt
2005-09-26 16:05 ` Ant: " Stefan Monnier
@ 2005-09-26 17:04 ` Mackenzie Straight
1 sibling, 0 replies; 21+ messages in thread
From: Mackenzie Straight @ 2005-09-26 17:04 UTC (permalink / raw)
To: Brian Hurt; +Cc: Martin Chabr, caml-list
On 9/26/05, Brian Hurt <bhurt@spnz.org> wrote:
> Syntactically and semantically there is no difference. I was wondering if
> the ocamlopt compiler took advatange of the implicit paralellism at all.
In any case, it makes (as far as I know) no difference which syntax you use:
% ocaml -drawlambda
Objective Caml version 3.08.3
# let foo a1 a2 = let l1 = Array.length a1 and l2 = Array.length a2 in l1+l2;;
(let
(foo/65
(function a1/66 a2/67
(let (l1/68 (array.length a1/66) l2/69 (array.length a2/67))
(+ l1/68 l2/69))))
(apply (field 1 (global Toploop!)) "foo" foo/65))
val foo : 'a array -> 'b array -> int = <fun>
# let bar a1 a2 = let l1 = Array.length a1 in let l2 = Array.length a2
in l1+l2;;
(let
(bar/70
(function a1/71 a2/72
(let (l1/73 (array.length a1/71) l2/74 (array.length a2/72))
(+ l1/73 l2/74))))
(apply (field 1 (global Toploop!)) "bar" bar/70))
val bar : 'a array -> 'b array -> int = <fun>
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Ant: [Caml-list] Efficiency of let/and
2005-09-26 4:32 ` Ant: " Martin Chabr
` (2 preceding siblings ...)
2005-09-26 13:22 ` Brian Hurt
@ 2005-09-26 17:05 ` Marius Nita
2005-09-26 17:36 ` David McClain
3 siblings, 1 reply; 21+ messages in thread
From: Marius Nita @ 2005-09-26 17:05 UTC (permalink / raw)
To: Martin Chabr; +Cc: caml-list
Martin Chabr wrote:
> As it appears to me, there is no semantic difference
> between both alternatives.
I've always thought that there was. In the `and' form, the bindings
cannot depend on each other. The program you pasted shouldn't run in any
(recent) OCaml toplevel. Are you using a really old one or something?
-marius
It can be shown with two
> dependent expressions y = 1 and z = y + 2:
>
> # let y = 1 in
> let z = y + 2 in
> z;;
> - : int = 3
>
> # let y = 1
> and z = y + 2 in
> z;;
> - : int = 3
>
> The order is important in both cases:
>
> # let z = y + 2 in
> let y = x + 1 in
> z;;
> Characters 8-9:
> let z = y + 2 in
> ^
> Unbound value y
>
> # let z = y + 2
> and y = 1 in
> z;;
> Characters 8-9:
> let z = y + 2
> ^
> Unbound value y
>
> So the "and"-form depends on the order as well and I
> think the syntactic difference can be just used for
> documentation. A good idea, by the way.
>
> I hope this helps
>
> Martin
>
>
>
> --- Brian Hurt <bhurt@spnz.org> schrieb:
>
>> Say I have two variables I want to set- variable a
>> to the value expr1 and
>> variable b to the value expr2. The two expressions
>> are pure (no side
>> effects), and neither one depends upon the other
>> (neither expr1 nor expr2
>> contain either a or b as a value), so they can be
>> evaluated in either
>> order or in parallel with no harm. With expressions
>> like these, I've
>> gotten into the habit of using let/and to express
>> the parallelism, that is
>> I go:
>>
>> let a = expr1
>> and b = expr2
>> in
>> ...
>>
>> rather than:
>> let a = expr1 in
>> let b = expr2 in
>>
>> So my question is: is there any value (other than
>> the documentation value)
>> in doing this?
>>
>> Just wondering.
>>
>> Brian
>>
>> _______________________________________________
>> 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
>>
>
>
>
>
>
> ___________________________________________________________
> Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos - Hier anmelden: http://mail.yahoo.de
>
> _______________________________________________
> 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
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: Ant: [Caml-list] Efficiency of let/and
2005-09-26 17:05 ` Marius Nita
@ 2005-09-26 17:36 ` David McClain
0 siblings, 0 replies; 21+ messages in thread
From: David McClain @ 2005-09-26 17:36 UTC (permalink / raw)
To: caml
I have understood that the "and" syntax was needed to support the creation
of mutually recursive bindings. While it can also be used as a form of
"parallel let" within a function definition, it is vitally important for the
mutual recursion case.
- David McClain, Tucson, AZ, USA
^ permalink raw reply [flat|nested] 21+ messages in thread
* Ant: Re: Ant: [Caml-list] Efficiency of let/and
2005-09-26 5:56 ` William Lovas
2005-09-26 7:17 ` Bill Wood
@ 2005-09-26 20:59 ` Martin Chabr
1 sibling, 0 replies; 21+ messages in thread
From: Martin Chabr @ 2005-09-26 20:59 UTC (permalink / raw)
To: William Lovas; +Cc: caml-list
Yes, you are right. Shame on me. I must have had a
bounding for y from an earlier experiment. When I
restart the interpreter, so that it is in a virgin
state, I get the same error message about unbound y as
you.
Martin
--- William Lovas <wlovas@stwing.upenn.edu> schrieb:
> On Mon, Sep 26, 2005 at 06:32:40AM +0200, Martin
> Chabr wrote:
> > As it appears to me, there is no semantic
> difference
> > between both alternatives. It can be shown with
> two
> > dependent expressions y = 1 and z = y + 2:
>
> This is not universally true:
>
> > # let y = 1
> > and z = y + 2 in
> > z;;
> > - : int = 3
>
> Objective Caml version 3.08.1
>
> # let y = 1
> and z = y + 2 in
> z;;
> Unbound value y
>
> So either you are using a version older than 3.08.1
> or this is a fairly
> recent change. In the latter case, people who wish
> to remain backward-
> compatible might eschew this style for sequential
> bindings, regardless
> of any potential performance problems.
>
> William
>
> _______________________________________________
> 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
>
Martin Chabr
Hochstrasse 28
8044 Zürich
Schweiz / Switzerland
Tel.P.: 01-261 17 24
___________________________________________________________
Gesendet von Yahoo! Mail - Jetzt mit 1GB Speicher kostenlos - Hier anmelden: http://mail.yahoo.de
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Caml-list] Re: Ant: Efficiency of let/and
2005-09-26 16:05 ` Ant: " Stefan Monnier
2005-09-26 16:30 ` [Caml-list] " Brian Hurt
@ 2005-09-27 5:32 ` skaller
2005-09-27 15:21 ` Stefan Monnier
1 sibling, 1 reply; 21+ messages in thread
From: skaller @ 2005-09-27 5:32 UTC (permalink / raw)
To: Stefan Monnier; +Cc: caml-list
On Mon, 2005-09-26 at 12:05 -0400, Stefan Monnier wrote:
> > Syntactically and semantically there is no difference. I was wondering if
> > the ocamlopt compiler took advatange of the implicit paralellism at all.
>
> If someone tries to use such things as `and' or
> unspecified-argument-evaluation-order in the hopes that the compiler will
> extract some imagined parallelism is simply deluding himself.
> In some cases, the freedom to execute in any order does lead to better
> code, but that code rarely if ever uses any kind of parallelism.
This is not so at all. Limited Parallelism is indeed found in all
modern processors, which can, for example, distribute multiple
instructions on several pipelines, decode in parallel with
computing values, or perform several integer and/or floating
operations simultaneously.
In fact, as far back as 197x, the Cyber 70 could do this,
in fact it relied on it. In particular, register calculations
and memory fetches and stores we always done in parallel,
automatically, until a join point. When you did a load,
for example, the next instruction would be executed
immediately, without waiting for the load to complete,
provided it didn't use the register being loaded
(and I think .. it would then proceed to the next instruction,
and execute THAT whilst suspending the previous one, provided
it used distinct registers .. but I'm not sure).
It may well be that this has no impact on Ocaml code.
However it certainly DOES have an impact on low level C code.
In addition, parallel assignment is a major benefit,
not because the assignments are done concurrently,
but because it can save memory. For example:
x,y = 1,2
cf
x,y = y,x
The first pair of assignments is faster and uses no temporaries,
the second requires a temporary. So an arbitrary parallel
assignment can, in fact, be optimised to reduce the number
of temporaries used, and thus the number of operations.
Parallel assignments as written aren't that useful, however
there is a particular optimisation of great benefit
which is requires parallel assignment: self-tail-recursion.
In this case, the assignment arises through reusing the
same closure, and the optimisation is of the form:
x,y,x = f(x,y,z), g(x,y,z), h(x,y,x)
goto start
In particular, the argument of the new invocation can
depend on the argument of the old invocation, and,
in tuple form the assignment would, without analysis,
require a temporary the size of the argument:
tmp = f(x,y,z), g(x,y,z), h(x,y,z)
x,y,z = tmp
Which, in the worst case, *doubles* the number
of assignments, and thus the cost of looping --
in a tight inner loop this can be critical.
In a language like Ocaml, a parallel operation can have
a major performance advantage, because it explicitly
indicates to the compiler that the order of evaluation
is irrelevant: due to side-effects and separate compilation,
the order of evaluation of sequential assignments is likely
to be fixed, and therefore cannot be optimised.
I do not know whether Ocaml does parallel assignment
optimisations on self-tail recursions .. but I can
tell you that Felix DOES. Perhaps this is why it
calculates Ackermann's function faster than Ocaml and C?
[I have no idea of the real reason .. but it does]
--
John Skaller <skaller at users dot sf dot net>
Felix, successor to C++: http://felix.sf.net
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Caml-list] Re: Ant: Efficiency of let/and
2005-09-26 16:30 ` [Caml-list] " Brian Hurt
@ 2005-09-27 5:52 ` skaller
2005-09-27 13:06 ` Brian Hurt
0 siblings, 1 reply; 21+ messages in thread
From: skaller @ 2005-09-27 5:52 UTC (permalink / raw)
To: Brian Hurt; +Cc: Stefan Monnier, caml-list
On Mon, 2005-09-26 at 11:30 -0500, Brian Hurt wrote:
> I'm not even sure how much extra efficiency is there to be had. Obviously
> it'd be hard "thread" calls to complex functions,
Why? Hyperthreading allows two completely independent processes
to execute on a hyperthread enabled P4 .. the hardware can already
do it .. even better with dual core.
There is no lack of small scale low level parallelism in
modern computing systems, just a lack of software that knows
how to take advantage of it.
There are plenty of places in an average program where one
can determine parallel execution would be ok, so it is really
a lack of capability in the software.
I personally don't think of this as real parallelism,
that's something you get on a machine with K's or M's
of processing units .. eg the human eye.
--
John Skaller <skaller at users dot sf dot net>
Felix, successor to C++: http://felix.sf.net
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Caml-list] Re: Ant: Efficiency of let/and
2005-09-27 5:52 ` skaller
@ 2005-09-27 13:06 ` Brian Hurt
2005-09-27 13:24 ` Alan Falloon
2005-09-27 15:24 ` Stefan Monnier
0 siblings, 2 replies; 21+ messages in thread
From: Brian Hurt @ 2005-09-27 13:06 UTC (permalink / raw)
To: skaller; +Cc: Stefan Monnier, caml-list
On Tue, 27 Sep 2005, skaller wrote:
> On Mon, 2005-09-26 at 11:30 -0500, Brian Hurt wrote:
>
>> I'm not even sure how much extra efficiency is there to be had. Obviously
>> it'd be hard "thread" calls to complex functions,
>
> Why? Hyperthreading allows two completely independent processes
> to execute on a hyperthread enabled P4 .. the hardware can already
> do it .. even better with dual core.
Creating a new kernel-level process/thread (required to get code executing
on a different processor or pseudo-processor) is generally expensive. You
don't want to do it except for very large functions. And then, once you
do have the second thread of execution, you now have all the fun of
multithreaded code- race conditions and deadlocks and livelocks, oh my.
I have contemplated writting a purely-functional (no imperitive) language
that does micro-threads ala cilk- but it's more work than I really want to
put in to that project.
>
> There is no lack of small scale low level parallelism in
> modern computing systems, just a lack of software that knows
> how to take advantage of it.
The benefit may be there, theoretically, but practical considerations may
make it not worth the effort to go after the benefit.
>
> There are plenty of places in an average program where one
> can determine parallel execution would be ok, so it is really
> a lack of capability in the software.
>
> I personally don't think of this as real parallelism,
> that's something you get on a machine with K's or M's
> of processing units .. eg the human eye.
Heh. We've hit the point where we have so many transistors on a chip we
literally don't know what to do with them all- we have no idea how to
spend the transistors to provide more than very small incremental
performance improvements to single-threaded execution. Which is why the
sudden interest in parallelism (Symmetric Mult-Threading aka
Hyperthreading, multi-core chips, etc.). The problem is that the theory
on how to write race condition/deadlock/livelock -free code isn't there,
to my knowledge (someone please prove me wrong).
Brian
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Caml-list] Re: Ant: Efficiency of let/and
2005-09-27 13:06 ` Brian Hurt
@ 2005-09-27 13:24 ` Alan Falloon
2005-09-27 15:24 ` Stefan Monnier
1 sibling, 0 replies; 21+ messages in thread
From: Alan Falloon @ 2005-09-27 13:24 UTC (permalink / raw)
To: Brian Hurt; +Cc: skaller, Stefan Monnier, caml-list
Brian Hurt wrote:
> On Tue, 27 Sep 2005, skaller wrote:
>
>> I personally don't think of this as real parallelism,
>> that's something you get on a machine with K's or M's
>> of processing units .. eg the human eye.
>
>
> Heh. We've hit the point where we have so many transistors on a chip
> we literally don't know what to do with them all- we have no idea how
> to spend the transistors to provide more than very small incremental
> performance improvements to single-threaded execution. Which is why
> the sudden interest in parallelism (Symmetric Mult-Threading aka
> Hyperthreading, multi-core chips, etc.). The problem is that the
> theory on how to write race condition/deadlock/livelock -free code
> isn't there, to my knowledge (someone please prove me wrong).
I did see a paper called "Composable Memory Transactions" by some of the
more well know Haskell researchers its avaliable at
http://got.net/~landauer/cs/fp/ea8-composablememory_stm.pdf
The idea is to introduce new concurrency abstractions (a replacement for
mutex and friends) that are composable to make it easy to reason about
thread-safe sections in isolation.
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Caml-list] Re: Ant: Efficiency of let/and
2005-09-27 5:32 ` skaller
@ 2005-09-27 15:21 ` Stefan Monnier
0 siblings, 0 replies; 21+ messages in thread
From: Stefan Monnier @ 2005-09-27 15:21 UTC (permalink / raw)
To: skaller; +Cc: caml-list
>> If someone tries to use such things as `and' or
>> unspecified-argument-evaluation-order in the hopes that the compiler will
>> extract some imagined parallelism is simply deluding himself.
>> In some cases, the freedom to execute in any order does lead to better
>> code, but that code rarely if ever uses any kind of parallelism.
> This is not so at all. Limited Parallelism is indeed found in all
> modern processors, which can, for example, distribute multiple
> instructions on several pipelines, decode in parallel with
> computing values, or perform several integer and/or floating
> operations simultaneously.
This has nothing to do with what I said. Compilers can equally take
advantage of ILP with a `let' or with a specified evaluation order.
Stefan
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Caml-list] Re: Ant: Efficiency of let/and
2005-09-27 13:06 ` Brian Hurt
2005-09-27 13:24 ` Alan Falloon
@ 2005-09-27 15:24 ` Stefan Monnier
2005-09-27 16:11 ` Brian Hurt
1 sibling, 1 reply; 21+ messages in thread
From: Stefan Monnier @ 2005-09-27 15:24 UTC (permalink / raw)
To: Brian Hurt; +Cc: skaller, caml-list
> chips, etc.). The problem is that the theory on how to write race
> condition/deadlock/livelock -free code isn't there, to my knowledge
I think the theory is pretty much there. The problem is to put it
into practice.
Stefan
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Caml-list] Re: Ant: Efficiency of let/and
2005-09-27 15:24 ` Stefan Monnier
@ 2005-09-27 16:11 ` Brian Hurt
0 siblings, 0 replies; 21+ messages in thread
From: Brian Hurt @ 2005-09-27 16:11 UTC (permalink / raw)
To: Stefan Monnier; +Cc: skaller, caml-list
On Tue, 27 Sep 2005, Stefan Monnier wrote:
>> chips, etc.). The problem is that the theory on how to write race
>> condition/deadlock/livelock -free code isn't there, to my knowledge
>
> I think the theory is pretty much there. The problem is to put it
> into practice.
I'm not 100% sure it is. Oh, it is for the "trivial" questions- like will
this program run to completion and will it return the right answer? But
it isn't there yet (to my knowledge) on the more difficult questions, like
can I automatically tune this program to efficiently use N threads (where
both N=1 and N ~ millions are interesting values)? And what is the
minimum amount of synchronization this program requires at N threads?
Etc.
IMHO, we need to take synchronization out of the hands of the programmer
just like we took garbage collection out of the hands of the programmer.
But, then again, I'm widely regarded as a radical :-).
Brian
^ permalink raw reply [flat|nested] 21+ messages in thread
* Re: [Caml-list] Efficiency of let/and
@ 2005-09-26 23:25 Oliver Bandel
0 siblings, 0 replies; 21+ messages in thread
From: Oliver Bandel @ 2005-09-26 23:25 UTC (permalink / raw)
To: caml-list
On Sun, Sep 25, 2005 at 08:31:55AM -0500, Brian Hurt wrote:
>
> Say I have two variables I want to set- variable a to the value expr1 and
> variable b to the value expr2. The two expressions are pure (no side
> effects), and neither one depends upon the other (neither expr1 nor expr2
> contain either a or b as a value), so they can be evaluated in either
> order or in parallel with no harm. With expressions like these, I've
> gotten into the habit of using let/and to express the parallelism, that is
> I go:
>
> let a = expr1
> and b = expr2
> in
> ...
>
> rather than:
> let a = expr1 in
> let b = expr2 in
>
> So my question is: is there any value (other than the documentation value)
> in doing this?
When you write it in the second form, then the "let a ="
must be evaluated before the "let b =" expression, because "a"
is used in the "b" expression (or might be used, but "a"
is part of "b"'s environment, so that it must be evaluated
first).
You can use this form also for doing imperative operations in
a certain order, because the more-outer expression is evaluated first.
If you use the form with "and" you can use definitions for functions,
that call each other, so called mutually recursive functions.
(For types this is also possible (e.g. tree-stuff).)
An example (that makes no sense to be used and will raise an
Stack-overflow exception, but I want to show, what is possible to define):
=============================================================
# let rec f1 x = f2 x + 10
and f2 x = f1 x + 100;;
val f1 : 'a -> int = <fun>
val f2 : 'a -> int = <fun>
# f2 3;;
Stack overflow during evaluation (looping recursion?).
#
=============================================================
One could try to use "rec" for binding of simple values
(not functions with parameters), but this would make no sense,
and if evaluated would also create an overflow exception.
When defining mutually recursive functions, the recursion would
start, when calling the function with it's arguments, so that
the resulting value would be calculated. E.g. in the toplevel,
you can do this by calling the functions with a parameter
(as done above).
But when you have a simple value, and not a function,
then it's value would be calculated right after the
definition, and so the definition of that value
would rise the exception, because the expression
would be immediately evaluated (eager evaluation).
This would probably yield to difficulties, and that
seems to me to be the reason, why it is forbidden to use such
an expression:
============================================================
first:~ oliver$ ocaml
Objective Caml version 3.08.0
# let rec a = 4
and b = 6;;
val a : int = 4
val b : int = 6
# let rec a = b + 4
and b = a * 8;;
This kind of expression is not allowed as right-hand side of `let rec'
#
============================================================
So, you can use "and" for defining some variables at the same
scope/environment in parallel, that do not depend on each other...
... but if you define functions, you can also define functions,
that depend on each other (mutually recursive calls).
Hope this helps.
Ciao,
Oliver
^ permalink raw reply [flat|nested] 21+ messages in thread
end of thread, other threads:[~2005-09-27 16:10 UTC | newest]
Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-09-25 13:31 Efficiency of let/and Brian Hurt
2005-09-25 14:47 ` [Caml-list] " Jon Harrop
2005-09-26 4:32 ` Ant: " Martin Chabr
2005-09-26 5:24 ` Fernando Alegre
2005-09-26 5:56 ` William Lovas
2005-09-26 7:17 ` Bill Wood
2005-09-26 20:59 ` Ant: " Martin Chabr
2005-09-26 13:22 ` Brian Hurt
2005-09-26 16:05 ` Ant: " Stefan Monnier
2005-09-26 16:30 ` [Caml-list] " Brian Hurt
2005-09-27 5:52 ` skaller
2005-09-27 13:06 ` Brian Hurt
2005-09-27 13:24 ` Alan Falloon
2005-09-27 15:24 ` Stefan Monnier
2005-09-27 16:11 ` Brian Hurt
2005-09-27 5:32 ` skaller
2005-09-27 15:21 ` Stefan Monnier
2005-09-26 17:04 ` Ant: [Caml-list] " Mackenzie Straight
2005-09-26 17:05 ` Marius Nita
2005-09-26 17:36 ` David McClain
2005-09-26 23:25 Oliver Bandel
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox