caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] Bug?  Printf, %X and negative numbers
@ 2003-03-28 21:19 Brian Hurt
  2003-03-28 22:21 ` Yutaka OIWA
                   ` (2 more replies)
  0 siblings, 3 replies; 28+ messages in thread
From: Brian Hurt @ 2003-03-28 21:19 UTC (permalink / raw)
  To: Ocaml Mailing List


$ ocaml
        Objective Caml version 3.06

# Printf.printf "%08X\n" (1 lsl 30);;
C0000000
- : unit = () 
# Printf.printf "%010X\n" (1 lsl 30);;
00C0000000
- : unit = ()
# 

I expected output of 40000000, not C0000000.  Note that this isn't a case 
of simple sign extension, as the second example demonstrates.  Where'd the 
extra bit come from?

Brian


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-03-28 21:19 [Caml-list] Bug? Printf, %X and negative numbers Brian Hurt
@ 2003-03-28 22:21 ` Yutaka OIWA
  2003-03-30  9:51 ` Xavier Leroy
  2003-04-02 11:44 ` Claude Marche
  2 siblings, 0 replies; 28+ messages in thread
From: Yutaka OIWA @ 2003-03-28 22:21 UTC (permalink / raw)
  To: Brian Hurt; +Cc: Ocaml Mailing List

>> On Fri, 28 Mar 2003 15:19:16 -0600 (CST), Brian Hurt <brian.hurt@qlogic.com> said:

Brian> $ ocaml
Brian>         Objective Caml version 3.06

Brian> # Printf.printf "%08X\n" (1 lsl 30);;
Brian> C0000000
Brian> - : unit = () 
Brian> # Printf.printf "%010X\n" (1 lsl 30);;
Brian> 00C0000000
Brian> - : unit = ()
Brian> # 

Brian> I expected output of 40000000, not C0000000.  Note that this isn't a case 
Brian> of simple sign extension, as the second example demonstrates.  Where'd the 
Brian> extra bit come from?

Brian> Brian

The extra bit comes from sign extension: (1 lsl 30) is the minimal
negative Caml integer.  The cause exists in byterun/ints.c:
31bit-value 0x40000000 is sign-extended to 32bit C-integer 0xc0000000
by macro Long_val, then sprintf in the C library puts extra "00" in
front of it (equivalent to zero-extension).
Maybe the unsigned version of Long_val is needed.

# 1 lsl 30 - 1;;
- : int = 1073741823
# Printf.sprintf "%u" (1 lsl 30);;
- : string = "3221225472"

-- 
Yutaka Oiwa              Yonezawa Lab., Dept. of Computer Science,
      Graduate School of Information Sci. & Tech., Univ. of Tokyo.
      <oiwa@yl.is.s.u-tokyo.ac.jp>, <yutaka@oiwa.shibuya.tokyo.jp>
PGP fingerprint = C9 8D 5C B8 86 ED D8 07  EA 59 34 D8 F4 65 53 61

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-03-28 21:19 [Caml-list] Bug? Printf, %X and negative numbers Brian Hurt
  2003-03-28 22:21 ` Yutaka OIWA
@ 2003-03-30  9:51 ` Xavier Leroy
  2003-03-31 15:44   ` Brian Hurt
  2003-04-02 11:44 ` Claude Marche
  2 siblings, 1 reply; 28+ messages in thread
From: Xavier Leroy @ 2003-03-30  9:51 UTC (permalink / raw)
  To: Brian Hurt; +Cc: Ocaml Mailing List

> $ ocaml
>         Objective Caml version 3.06
> 
> # Printf.printf "%08X\n" (1 lsl 30);;
> C0000000
> 
> I expected output of 40000000, not C0000000.  Note that this isn't a case 
> of simple sign extension, as the second example demonstrates.  Where'd the 
> extra bit come from?

As Yutaka Oiwa said, it comes from the conversion from Caml 31-bit
integers to C 32-bit integers, which performs sign extension.

Even though 0x40000000 and 0xC0000000 denote the same Caml int, I
agree this behavior is very surprising and should be fixed.  I'll look
into this.  Thanks for reporting the issue.

- Xavier Leroy

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-03-30  9:51 ` Xavier Leroy
@ 2003-03-31 15:44   ` Brian Hurt
  2003-03-31 17:13     ` Ville-Pertti Keinonen
  2003-04-01  8:19     ` Xavier Leroy
  0 siblings, 2 replies; 28+ messages in thread
From: Brian Hurt @ 2003-03-31 15:44 UTC (permalink / raw)
  To: Xavier Leroy; +Cc: Brian Hurt, Ocaml Mailing List

On Sun, 30 Mar 2003, Xavier Leroy wrote:

> As Yutaka Oiwa said, it comes from the conversion from Caml 31-bit
> integers to C 32-bit integers, which performs sign extension.
> 
> Even though 0x40000000 and 0xC0000000 denote the same Caml int, I
> agree this behavior is very surprising and should be fixed.  I'll look
> into this.  Thanks for reporting the issue.


Having looked at it a bit myself, the fix will probable be *ahem* 
interesting.  Effectively, you have to stop using C's printf.  Either 
that, or parse the format string a second (third?) time to see wether you 
need to do a signed or unsigned int conversion.  Or, I suppose, we could 
completely redesign Ocaml to use 32-bit ints and do something else to 
differentiate ints from pointers :-).

More pragmatically, I think this behavior should just be documented.  
"Broken as designed".  Once you know about it, it's annoying not critical.

Brian


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-03-31 15:44   ` Brian Hurt
@ 2003-03-31 17:13     ` Ville-Pertti Keinonen
  2003-04-01  8:19     ` Xavier Leroy
  1 sibling, 0 replies; 28+ messages in thread
From: Ville-Pertti Keinonen @ 2003-03-31 17:13 UTC (permalink / raw)
  To: Brian Hurt; +Cc: Ocaml Mailing List

> need to do a signed or unsigned int conversion.  Or, I suppose, we 
> could
> completely redesign Ocaml to use 32-bit ints and do something else to
> differentiate ints from pointers :-).

That would only require a redesign of part of the runtime.  As far as I 
can tell, at least for native code, it should only affect the 
representation of mixed data, garbage collection and use in polymorphic 
functions, none of which would necessarily be that bad for performance 
if designed and optimized properly.

On the other hand, the efficiency of the current implementation 
probably has a lot to do with good choices of compromises in allocating 
the bits of block headers...

I wonder how much work it would be to test how efficiently such a 
change could be done without going all the way...has anyone looked into 
this?

> More pragmatically, I think this behavior should just be documented.
> "Broken as designed".  Once you know about it, it's annoying not 
> critical.

And maybe %u should be disabled altogether if it can never produce any 
correct results that differ from %d.

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-03-31 15:44   ` Brian Hurt
  2003-03-31 17:13     ` Ville-Pertti Keinonen
@ 2003-04-01  8:19     ` Xavier Leroy
  2003-04-01 16:09       ` David Brown
                         ` (2 more replies)
  1 sibling, 3 replies; 28+ messages in thread
From: Xavier Leroy @ 2003-04-01  8:19 UTC (permalink / raw)
  To: Brian Hurt; +Cc: Ocaml Mailing List

> Having looked at it a bit myself, the fix will probable be *ahem* 
> interesting.  Effectively, you have to stop using C's printf.  Either 
> that, or parse the format string a second (third?) time to see wether you 
> need to do a signed or unsigned int conversion.

It's no big deal, really.  (See the working sources on camlcvs.inria.fr.)
The formats are already parsed three(!) times:
  - once in Caml (module Printf)
  - once in C to determine the size of the buffer to hold the result
        (file byterun/ints.c)
  - once in the printf() C library function itself.
The way I fixed it, the signed/unsigned distinction is done in the
second parsing, although it could also be done during the first.

> Or, I suppose, we could 
> completely redesign Ocaml to use 32-bit ints and do something else to 
> differentiate ints from pointers :-).

If you can find a "something else" that is faster than systematically
boxing the 32-bit ints, you'll be hailed as the savior in compiler
circles :-)

- Xavier Leroy

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-01  8:19     ` Xavier Leroy
@ 2003-04-01 16:09       ` David Brown
  2003-04-01 16:45       ` Tim Freeman
  2003-04-01 18:34       ` Ville-Pertti Keinonen
  2 siblings, 0 replies; 28+ messages in thread
From: David Brown @ 2003-04-01 16:09 UTC (permalink / raw)
  To: Xavier Leroy; +Cc: Brian Hurt, Ocaml Mailing List

On Tue, Apr 01, 2003 at 10:19:46AM +0200, Xavier Leroy wrote:

> > Or, I suppose, we could 
> > completely redesign Ocaml to use 32-bit ints and do something else to 
> > differentiate ints from pointers :-).
> 
> If you can find a "something else" that is faster than systematically
> boxing the 32-bit ints, you'll be hailed as the savior in compiler
> circles :-)

Easy, just convince everyone to start using 33 bit computers.

Dave

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-01  8:19     ` Xavier Leroy
  2003-04-01 16:09       ` David Brown
@ 2003-04-01 16:45       ` Tim Freeman
  2003-04-01 18:59         ` Brian Hurt
  2003-04-01 18:34       ` Ville-Pertti Keinonen
  2 siblings, 1 reply; 28+ messages in thread
From: Tim Freeman @ 2003-04-01 16:45 UTC (permalink / raw)
  To: caml-list

Somebody I don't know said:
> Or, I suppose, we could 
> completely redesign Ocaml to use 32-bit ints and do something else to 
> differentiate ints from pointers :-).

Then Xavier said:
>If you can find a "something else" that is faster than systematically
>boxing the 32-bit ints, you'll be hailed as the savior in compiler
>circles :-)

I'm guessing that the standard solution to doing full-word ints with a
garbage collector is to generate some code for each data structure
that plugs into the garbage collector and knows what fields are ints
and what fields are pointers.  That's the way the gcc compiler did it
as of 3.0.1 or so.  (In that case the code was manually generated.)

I don't know if this would be faster than OCAML's approach.  You'd pay
for more code in your cache, and for an indirect goto for each block
that is garbage collected (unless you managed to garbage collect them
in batches of blocks of identical type, or you organized things so in
the absence of polymorphism it was a subroutine call instead of an
indirect goto.  You could maybe even inline the subroutine call
sometimes.  Hmm.).  You'd benefit because you don't have to do the bit
twiddling that's done for every arithmetic operation now, and because
it should be faster to decide not to follow the non-pointers during
garbage collection.  Straight-line code is often faster than branching
for modern architectures.

Surely this has been discussed before, although perhaps not on this
mailing list.  Can someone point to a paper that analyzes the various
tradeoffs?

-- 
Tim Freeman                                                  tim@fungible.com
Which is worse: ignorance or apathy? Who knows? Who cares?
GPG public key fingerprint ECDF 46F8 3B80 BB9E 575D  7180 76DF FE00 34B1 5C78 

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-01  8:19     ` Xavier Leroy
  2003-04-01 16:09       ` David Brown
  2003-04-01 16:45       ` Tim Freeman
@ 2003-04-01 18:34       ` Ville-Pertti Keinonen
  2 siblings, 0 replies; 28+ messages in thread
From: Ville-Pertti Keinonen @ 2003-04-01 18:34 UTC (permalink / raw)
  To: Xavier Leroy; +Cc: Ocaml Mailing List

>> Or, I suppose, we could
>> completely redesign Ocaml to use 32-bit ints and do something else to
>> differentiate ints from pointers :-).
>
> If you can find a "something else" that is faster than systematically
> boxing the 32-bit ints, you'll be hailed as the savior in compiler
> circles :-)

I'm probably missing something because I don't see how this should be 
*that* difficult.  There are language implementations that use 
untagged, at-least-sometimes-unboxed native integers and have garbage 
collection, and I don't believe they perform horribly.

Representation of mixed data and stack frames can be done using various 
combinations of conservative garbage collection, layout descriptors and 
selective boxing.  This is a matter of choosing a set of compromises.  
Most such solutions would probably have slightly higher garbage 
collection and memory overhead than OCaml currently does, but I 
wouldn't expect all of the possible approaches to perform worse than 
boxing all integers (with the obvious exception of cases where integers 
are hardly used).

Generic code could be optimized by generating specialized versions of 
the code for the unboxed/untagged types in cases where the aren't more 
than, say, two or three unknown types.  Unused versions can be 
eliminated at link time.  This could also be done more efficiently and 
completely by changing the compilation model a bit more.

Even with the current tagged integers, specialized versions of generics 
would significantly increase performance in some cases.  Currently 
integer keys in polymorphic or functor maps are much slower than they 
need to be.

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-01 16:45       ` Tim Freeman
@ 2003-04-01 18:59         ` Brian Hurt
  2003-04-01 19:16           ` Ville-Pertti Keinonen
  0 siblings, 1 reply; 28+ messages in thread
From: Brian Hurt @ 2003-04-01 18:59 UTC (permalink / raw)
  To: Tim Freeman; +Cc: caml-list

On Tue, 1 Apr 2003, Tim Freeman wrote:

> Somebody I don't know said:
> > Or, I suppose, we could 
> > completely redesign Ocaml to use 32-bit ints and do something else to 
> > differentiate ints from pointers :-).
> 
> Then Xavier said:
> >If you can find a "something else" that is faster than systematically
> >boxing the 32-bit ints, you'll be hailed as the savior in compiler
> >circles :-)
> 
> I'm guessing that the standard solution to doing full-word ints with a
> garbage collector is to generate some code for each data structure
> that plugs into the garbage collector and knows what fields are ints
> and what fields are pointers.  That's the way the gcc compiler did it
> as of 3.0.1 or so.  (In that case the code was manually generated.)

I thought they were using Boehm's GC?  Which is conservative, in that if 
it looks like a pointer, it treats it as a pointer.  Note that this means 
that you can't do copying, as you don't dare change the pointers (they 
might be).  This also means that a small percentage of garbage is falsely 
retained because of bogus pointers (although in practice not enough to 
worry about- Boehm has some papers on real world applications).

This is more than good enough for C/C++, but Ocaml puts rather more stress 
on it's GC.  Especially as I remember seeing statistics that your average 
ML program allocates a word of memory every six instructions- an insane 
amount of allocation for a C program.

I was thinking of just a bitmask.  You are always allocating into the
minor heap.  You just define the low 1/32nd of the minor heap a bitmask of
what is a pointer and what isn't.  This would probably slow down
allocation- not by much, would be my prediction, but it would slow down
allocation.  You may gain some of that cost back by not needing to do the
shifts and ors we currently do to deal with the low bit.  I can't predict
what the overall performance delta would be- not even if it will be
positive or negative.

However, I would predict that it will be small enough, even if positive,
to make it not worth the effort.  

For my bitarray code I'd like unboxed 32-bit ints.  Primarily because it'd
allow me to turn my current divides and modulos into shifts and ands.  Or 
rather, have the compiler do it for me.  There is a performance difference 
x/31 and x/32.

But a bigger problem than that, probably (I haven't actually done any 
timing, so I can't say for certain) is repetive divides.  I have a lot of 
code like:
    let bits_per_word = Sys.wordsize - 1;

    let dosomething idx =
        let wordidx = idx / bits_per_word
        and bitidx = idx mod bits_per_word
        in
        ...

The code that 3.06 produces for the above uses the idiv instruction twice-
once for the quotient, once for the remainder.  A little optimization 
would have it issued only once, and use both operands.  I played a little 
bit with writting a ldiv function, which let me play with the C interface, 
but produced enough other inefficiencies to make it not worth the effort.  
Ah well.  Minor nit.

Brian


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-01 18:59         ` Brian Hurt
@ 2003-04-01 19:16           ` Ville-Pertti Keinonen
  2003-04-01 19:23             ` Tim Freeman
                               ` (2 more replies)
  0 siblings, 3 replies; 28+ messages in thread
From: Ville-Pertti Keinonen @ 2003-04-01 19:16 UTC (permalink / raw)
  To: Brian Hurt; +Cc: caml-list


> I was thinking of just a bitmask.  You are always allocating into the
> minor heap.  You just define the low 1/32nd of the minor heap a 
> bitmask of
> what is a pointer and what isn't.  This would probably slow down
> allocation- not by much, would be my prediction, but it would slow down
> allocation.  You may gain some of that cost back by not needing to do 
> the
> shifts and ors we currently do to deal with the low bit.  I can't 
> predict
> what the overall performance delta would be- not even if it will be
> positive or negative.

I suspect that would be quite slow, since you have to do one bit 
operation for each word of each allocation (optimizing them is 
difficult because you don't know the alignment).

One way of doing this much faster is just having a the first word of 
any mixed block (homogenous blocks aren't a problem) indicate the 
number of pointers and always put the pointers first.

Of course wasting an entire word on this is nasty when less bits would 
do...but the bits of the current block header are pretty tightly 
allocated.

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-01 19:16           ` Ville-Pertti Keinonen
@ 2003-04-01 19:23             ` Tim Freeman
  2003-04-01 21:00               ` Ville-Pertti Keinonen
  2003-04-01 19:56             ` Brian Hurt
  2003-04-02  8:55             ` Andreas Rossberg
  2 siblings, 1 reply; 28+ messages in thread
From: Tim Freeman @ 2003-04-01 19:23 UTC (permalink / raw)
  To: will; +Cc: brian.hurt, caml-list

From: Ville-Pertti Keinonen <will@exomi.com>
>One way of doing this much faster is just having a the first word of 
>any mixed block (homogenous blocks aren't a problem) indicate the 
>number of pointers and always put the pointers first.
>
>Of course wasting an entire word on this is nasty when less bits would 
>do...but the bits of the current block header are pretty tightly 
>allocated.

Most blocks are small, so one could make a scheme that fits the number
of pointers into the current block header for small blocks and uses an
extra word for larger blocks.  This would have the desirable side
effect of increasing the limit on the size of arrays.  Code that
accesses inside a block often knows the size of the block it's
accessing, so you can often precompute whether that extra word is
there and avoid taking a branch to decide whether to skip it.

-- 
Tim Freeman                                                  tim@fungible.com
Which is worse: ignorance or apathy? Who knows? Who cares?
GPG public key fingerprint ECDF 46F8 3B80 BB9E 575D  7180 76DF FE00 34B1 5C78 

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-01 19:16           ` Ville-Pertti Keinonen
  2003-04-01 19:23             ` Tim Freeman
@ 2003-04-01 19:56             ` Brian Hurt
  2003-04-01 20:45               ` Ville-Pertti Keinonen
  2003-04-02  8:55             ` Andreas Rossberg
  2 siblings, 1 reply; 28+ messages in thread
From: Brian Hurt @ 2003-04-01 19:56 UTC (permalink / raw)
  To: Ville-Pertti Keinonen; +Cc: Brian Hurt, caml-list

On Tue, 1 Apr 2003, Ville-Pertti Keinonen wrote:

> 
> > I was thinking of just a bitmask.  You are always allocating into the
> > minor heap.  You just define the low 1/32nd of the minor heap a 
> > bitmask of
> > what is a pointer and what isn't.  This would probably slow down
> > allocation- not by much, would be my prediction, but it would slow down
> > allocation.  You may gain some of that cost back by not needing to do 
> > the
> > shifts and ors we currently do to deal with the low bit.  I can't 
> > predict
> > what the overall performance delta would be- not even if it will be
> > positive or negative.
> 
> I suspect that would be quite slow, since you have to do one bit 
> operation for each word of each allocation (optimizing them is 
> difficult because you don't know the alignment).

For structures 32 words or less, you can do it like (using x86 assembly 
language here):
	movl	heap_top, %eax
	movl	%eax, %ecx
	andl	$31, %ecx
	movl	%eax, %ebx
	shrw	$5, %bx	; /* partial register stall- oh well */
	movl	$bit_pattern, %esi
	xorl	%edi, %edi
	shldl	%cl, %esi, %edi
	shll	%cl, %esi
	orl	%esi, (%ebx)
	orl	%edi, 4(%ebx)

10 instructions, no branchs, only one partial register stall (which can
probably be removed at the cost of four more instructions), only one
'complex' instruction (the shld) which might take more than a clock cycle.  
Some rearrangement could probably give us 2, maybe 3 instructions issued
per clock.  We're probably looking at single digit clock cycles here.  
Note that I'm assuming the minor heap is 64K (removing the partial stall 
would also solve this).

On the other side of this equation, we have the overhead of dealing with 
the low bit being set.  This does have a performance cost.  How much of 
one depends upon what you're doing with the ints.  But we're not talking 
about more than an instruction or two per access.  With few accesses per 
allocation it's probably a loss- with more access per allocation, it's 
probably a win.  But either way, we're talking about single digit clock 
cycles.

By way of comparison, on the P4 a branch mispredict costs 20-28 clock 
cycles, a cache miss costs 100-300 clock cycles, and a page fault millions 
of clock cycles.

Brian


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-01 19:56             ` Brian Hurt
@ 2003-04-01 20:45               ` Ville-Pertti Keinonen
  2003-04-01 21:03                 ` Brian Hurt
  0 siblings, 1 reply; 28+ messages in thread
From: Ville-Pertti Keinonen @ 2003-04-01 20:45 UTC (permalink / raw)
  To: Brian Hurt; +Cc: caml-list


> For structures 32 words or less, you can do it like (using x86 assembly
> language here):

   ...actual code snipped...

Ok, that's not necessarily too bad.

I guess I was just intuitively dismissing anything that felt like it 
had more than a couple of instructions of "overhead".   I'm probably 
also biased by SMP-thinking - read-modify-write operations feel 
inherently evil. ;-)

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-01 19:23             ` Tim Freeman
@ 2003-04-01 21:00               ` Ville-Pertti Keinonen
  0 siblings, 0 replies; 28+ messages in thread
From: Ville-Pertti Keinonen @ 2003-04-01 21:00 UTC (permalink / raw)
  To: Tim Freeman; +Cc: caml-list


> Most blocks are small, so one could make a scheme that fits the number
> of pointers into the current block header for small blocks and uses an
> extra word for larger blocks.  This would have the desirable side
> effect of increasing the limit on the size of arrays.  Code that
> accesses inside a block often knows the size of the block it's
> accessing, so you can often precompute whether that extra word is
> there and avoid taking a branch to decide whether to skip it.

Code that accesses fields of a block always knows the size unless it's 
an array (or string), in which case bounds checking also needs to be 
done, but it couldn't contain mixed data anyhow.

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-01 20:45               ` Ville-Pertti Keinonen
@ 2003-04-01 21:03                 ` Brian Hurt
  0 siblings, 0 replies; 28+ messages in thread
From: Brian Hurt @ 2003-04-01 21:03 UTC (permalink / raw)
  To: Ville-Pertti Keinonen; +Cc: Ocaml Mailing List

On Tue, 1 Apr 2003, Ville-Pertti Keinonen wrote:

> 
> > For structures 32 words or less, you can do it like (using x86 assembly
> > language here):
> 
>    ...actual code snipped...
> 
> Ok, that's not necessarily too bad.
> 
> I guess I was just intuitively dismissing anything that felt like it 
> had more than a couple of instructions of "overhead".   I'm probably 
> also biased by SMP-thinking - read-modify-write operations feel 
> inherently evil. ;-)
> 

For SMP you want different minor heaps for every thread.  Adding the lock 
prefix to an instruction costs ~100 clock cycles.  Much better to simply 
give each thread it's own minor heap.  64K isn't that much memory.  And 
there are stunts you can pull if you threads spend most of their life 
blocked to decrease the number of minor heaps you need.

Note that you implicitly have a read-modify-write cycle already in your
allocation.  You need to read the top-of-heap pointer, save off the
original pointer, increment by the size you are allocating, and write the 
incremented pointer back, all automatically.  A wonderful application of 
load locked/store conditional, if only we had it in the x86.  Without it, 
you basically need to grab a spinlock before updating.  Thus the lock 
prefix.

Brian


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-01 19:16           ` Ville-Pertti Keinonen
  2003-04-01 19:23             ` Tim Freeman
  2003-04-01 19:56             ` Brian Hurt
@ 2003-04-02  8:55             ` Andreas Rossberg
  2003-04-02  9:20               ` Ville-Pertti Keinonen
  2 siblings, 1 reply; 28+ messages in thread
From: Andreas Rossberg @ 2003-04-02  8:55 UTC (permalink / raw)
  To: caml-list

Ville-Pertti Keinonen wrote:
> 
> One way of doing this much faster is just having a the first word of any 
> mixed block (homogenous blocks aren't a problem) indicate the number of 
> pointers and always put the pointers first.

I'm afraid such a scheme is incompatible with polymorphism, where a slot 
may or may not be a pointer, depending on the actual instantiation. 
Still, polymorphic code must be able to operate uniformingly in both 
cases, i.e. the slot may not be shuffled around.

   - Andreas

-- 
Andreas Rossberg, rossberg@ps.uni-sb.de

"Computer games don't affect kids; I mean if Pac Man affected us
  as kids, we would all be running around in darkened rooms, munching
  magic pills, and listening to repetitive electronic music."
  - Kristian Wilson, Nintendo Inc.

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-02  8:55             ` Andreas Rossberg
@ 2003-04-02  9:20               ` Ville-Pertti Keinonen
  0 siblings, 0 replies; 28+ messages in thread
From: Ville-Pertti Keinonen @ 2003-04-02  9:20 UTC (permalink / raw)
  To: Andreas Rossberg; +Cc: caml-list


On Wednesday, Apr 2, 2003, at 11:55 Europe/Helsinki, Andreas Rossberg 
wrote:

> I'm afraid such a scheme is incompatible with polymorphism, where a 
> slot may or may not be a pointer, depending on the actual 
> instantiation. Still, polymorphic code must be able to operate 
> uniformingly in both cases, i.e. the slot may not be shuffled around.

For generic code, it obviously requires either boxing or specialized 
versions of the code, as I suggested in a different message.

I don't particularly like the pointer-count/shuffling idea, it was just 
an example of something that would require far fewer instructions to 
initialize compared to the bitmap.

The main difference between the approaches I've been thinking of and 
what Brian Hurt has been suggesting is that he's thinking of 
externalizing the tag bit while I'm thinking about taking a basically 
boxed approach and optimizing away boxing in as many cases as possible.

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-03-28 21:19 [Caml-list] Bug? Printf, %X and negative numbers Brian Hurt
  2003-03-28 22:21 ` Yutaka OIWA
  2003-03-30  9:51 ` Xavier Leroy
@ 2003-04-02 11:44 ` Claude Marche
  2 siblings, 0 replies; 28+ messages in thread
From: Claude Marche @ 2003-04-02 11:44 UTC (permalink / raw)
  To: Brian Hurt; +Cc: Ocaml Mailing List

>>>>> "Brian" == Brian Hurt <brian.hurt@qlogic.com> writes:

    Brian> $ ocaml
    Brian>         Objective Caml version 3.06

    Brian> # Printf.printf "%08X\n" (1 lsl 30);;
    Brian> C0000000
    Brian> - : unit = () 
    Brian> # Printf.printf "%010X\n" (1 lsl 30);;
    Brian> 00C0000000
    Brian> - : unit = ()
    Brian> # 

    Brian> I expected output of 40000000, not C0000000.  Note that this isn't a case 
    Brian> of simple sign extension, as the second example demonstrates.  Where'd the 
    Brian> extra bit come from?

Sorry to come back at the very beginning of this thread, but I'd like
to add my two centeuros: I feel that the first answer is correct, but
the second is wrong. Why? (1 lsl 30) is -2^30, right ? and the format
"%nX" means the hexadecimal 2-complement representation of the
argument, on n hexdigits, right ? So I think

  Printf.printf "%08X\n" (1 lsl 30);;

should write C0000000 and

  Printf.printf "%010X\n" (1 lsl 30);;

should write FFC0000000.



-- 
| Claude Marché           | mailto:Claude.Marche@lri.fr |
| LRI - Bât. 490          | http://www.lri.fr/~marche/  |
| Université de Paris-Sud | phoneto: +33 1 69 15 64 85  |
| F-91405 ORSAY Cedex     | faxto: +33 1 69 15 65 86    |

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-04 16:14   ` Brian Hurt
  2003-04-04 17:14     ` Ville-Pertti Keinonen
@ 2003-04-04 17:27     ` Falk Hueffner
  1 sibling, 0 replies; 28+ messages in thread
From: Falk Hueffner @ 2003-04-04 17:27 UTC (permalink / raw)
  To: caml-list

Brian Hurt <brian.hurt@qlogic.com> writes:

> So now you a dozen different specializations of foo<>.  All almost
> identical.  Say bye bye to any code locality.  And this isn't even
> mentioning badly designed templates, like the one I found (no
> kidding!)  for an array template that took it's length as a
> parameter.  The compiler had to produce different specializations of
> the code for arrays length 3 and arrays length 4.

You didn't choose a very good example. The compiler will certainly
inline both operator[] and .size(), which will result in probably
smaller and certainly faster code.

-- 
	Falk

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-04 16:14   ` Brian Hurt
@ 2003-04-04 17:14     ` Ville-Pertti Keinonen
  2003-04-04 17:27     ` Falk Hueffner
  1 sibling, 0 replies; 28+ messages in thread
From: Ville-Pertti Keinonen @ 2003-04-04 17:14 UTC (permalink / raw)
  To: Brian Hurt; +Cc: caml-list


> One of the things I dislike about C++ template is code bloat.  This is 
> the
> undiscussed cost of templates.  So you make a template foo<type>.  You

   ...

Specializations aren't the only reason C++ templates cause significant 
code growth.  Another is that they (in the case of the most commonly 
used HP/SGI STL, at least) use inlining very heavily, so each 
instantiation is big and a lot of inlined code is instantiated several 
times all over the place.

For some cases, inlined handling of data structures is good.  Consider 
the performance of the STL sort vs. anything based on a callback or 
virtual method.

I'm not a big fan of C++ templates, but I don't think they're a very 
good argument against all specialization.

> And this applies to Ocaml even more so.  I mean, consider the function:

Less so, I would think, since most types are compatible.

> let f x = ...
>
> OK, so to specialize it for unboxed ints vr.s pointers takes two
> implementations of the function, f_pointer and f_int, right?  So now
> consider the function:
>
> let f x y z w = ...
>
> Do we need 16 different specializations for this function?

Not if they're generated at the point where they are first used(*), in 
which case a maximum of 16 specializations are created - compared to 
C++, where there is no maximum, and you often end up having things like 
std::map<std::string, my_object *> and std::map<std::string, 
my_other_object *> which are in fact identical.

(*) Obviously this requires some adjustments to the compilation model.

A quick grepping through .mli files in the OCaml source distribution 
reveals that there are zero instances of the string 'd but quite a few 
instances of 'c, which would seem to indicate that four variables is 
not common.

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-02 21:12 ` Ville-Pertti Keinonen
  2003-04-02 21:46   ` Lauri Alanko
@ 2003-04-04 16:14   ` Brian Hurt
  2003-04-04 17:14     ` Ville-Pertti Keinonen
  2003-04-04 17:27     ` Falk Hueffner
  1 sibling, 2 replies; 28+ messages in thread
From: Brian Hurt @ 2003-04-04 16:14 UTC (permalink / raw)
  To: Ville-Pertti Keinonen; +Cc: Gregory Morrisett, caml-list


Sorry for being quiet for a couple of days- came down with the flu.  I'm 
catching up on my email, so pardon the jumping into the middle of 
discussions.

On Thu, 3 Apr 2003, Ville-Pertti Keinonen wrote:
> 
> This is what I was suggesting.  With its whole-program analysis, this 
> is obviously more straightforward for MLton, but I think it's also 
> feasible for more practical compilers (without ending up with C++-like 
> compile times).
> 

I hadn't thought about polymorphism when I made my example.  And thinking 
about it, while it still might be doable, it becomes way more ugly.

One of the things I dislike about C++ template is code bloat.  This is the 
undiscussed cost of templates.  So you make a template foo<type>.  You 
create a foo<int> and the compiler has to spit out a specialized instance 
of foo to deal with ints.  Do foo<long> and now you have two foos.  Then 
you do foo<char>, foo<short>, foo<float>, foo<double>, foo<struct this>, 
foo<struct that>, etc.  And this is assuming that the compiler is smart 
enough to notice that foo<unsigned long> and foo<size_t> can generally use 
the same specialization.  And it takes heroic efforts to figure out that 
foo<int> and foo<unsigned int> might be able to use the same 
specialization.  Maybe.

So now you a dozen different specializations of foo<>.  All almost 
identical.  Say bye bye to any code locality.  And this isn't even 
mentioning badly designed templates, like the one I found (no kidding!) 
for an array template that took it's length as a parameter.  The compiler 
had to produce different specializations of the code for arrays length 3 
and arrays length 4.  Or some early C++ compilers which didn't have a way 
to say "this specialization is produced somewhere else", so if you used 
foo<int> in 100 different files, you got 100 copies of the specialization 
of foo onto ints.

This experience has made me violently opposed to specialization of code if 
it can be at all avoided.  I'll take the performance hit to avoid having 
uppity zillion almost-identical copies of my code kicking around.\

And this applies to Ocaml even more so.  I mean, consider the function:

let f x = ...

OK, so to specialize it for unboxed ints vr.s pointers takes two 
implementations of the function, f_pointer and f_int, right?  So now 
consider the function:

let f x y z w = ...

Do we need 16 different specializations for this function?  

No.  I'll take 31-bit ints any day.

Brian


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-02 21:46   ` Lauri Alanko
@ 2003-04-03 17:40     ` Ville-Pertti Keinonen
  0 siblings, 0 replies; 28+ messages in thread
From: Ville-Pertti Keinonen @ 2003-04-03 17:40 UTC (permalink / raw)
  To: Lauri Alanko; +Cc: caml-list


> For occasional hotspots where naked integers are essential for
> performance, wouldn't the easiest solution be to use the equivalent of
> GHC's unboxed ints: a special _non-polymorphic_ datatype that doesn't
> have tags. This type would be given a kind different from other types 
> to
> prevent it from being used as a type parameter. Of course the GC still
> needs to be prevented from following such values, but a separate stack
> for them ought to do the trick.

Untagged non-pointers on the stack are already identified by frame 
descriptors.

Something like that but less restrictive could probably be implemented 
as optimized calling conventions for int32/int64 when explicitly 
specified.

Native-sized integers are currently handled unboxed locally inside 
functions, they just require boxing when stored in a block, passed as 
parameters or returned.  Using them is pretty inconvenient, though.

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* RE: [Caml-list] Bug?  Printf, %X and negative numbers
@ 2003-04-03  9:29 Fabrice Le Fessant
  0 siblings, 0 replies; 28+ messages in thread
From: Fabrice Le Fessant @ 2003-04-03  9:29 UTC (permalink / raw)
  To: Ville-Pertti Keinonen, Gregory Morrisett; +Cc: caml-list

 
> I agree that the OCaml runtime makes good compromises that 
> work well in practice.  Any added complexity would probably 
> hurt symbolic code, which seems to have had a high priority 
> in considerations of tradeoffs.

Just my two pence: in MLdonkey, int64 are used everywhere instead of
int, and instead of int32, which are two
small for file sizes. So, it will not benefit from any optimization on
int32. However, it would benefit 
from a new type 'long', that would be at-least a 63-bit integer.
Depending on the platform, this type could 
be implemented either by a traditionnal int (with the integer-bit set,
on 64-bit platforms), or by an int64 
on other platforms.

Since in the next years, more and more computers will be 64-bit, and
more and more applications will need 
support for integers in the range 33-bit ... 63-bit, this could be more
interesting than optimizing 32-bit 
integers (using the 'long' type, a program that would have used 32-bit
integers, would have the guaranty 
that the longs are not allocated on 64-bit platforms). Moreover, it can
probably be implemented in the 
Pervasives module without any changes in the compiler. But maybe int32
are already implemented by a normal int 
on 64-bit platforms ?


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* RE: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-02 18:42 Gregory Morrisett
  2003-04-02 21:12 ` Ville-Pertti Keinonen
@ 2003-04-03  0:52 ` brogoff
  1 sibling, 0 replies; 28+ messages in thread
From: brogoff @ 2003-04-03  0:52 UTC (permalink / raw)
  To: Gregory Morrisett; +Cc: Ville-Pertti Keinonen, Andreas Rossberg, caml-list

On Wed, 2 Apr 2003, Gregory Morrisett wrote:
> MLTON avoids these issues by specializing polymorphic code at
> all of its uses so that it becomes monomorphic (not unlike C++), 
> at the price of separate compilation.

And, as I think you're implying, polymorphic recursion. 

In Okasaki's PFDS book, he describes the techniques you'd use to convert 
non-uniform types to uniform ones and rewriting the functions. Has anyone 
played with the idea of automating these transformations, so that a MLTON like 
monomorphizing compiler could work for a language with non uniform recursion? 

No, I'm not suggesting that for OCaml. I agree that the OCaml implementation is 
at some sweet spot where it isn't too complex, is very efficient, compiles 
quickly, etc. 

-- Brian


-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-02 21:12 ` Ville-Pertti Keinonen
@ 2003-04-02 21:46   ` Lauri Alanko
  2003-04-03 17:40     ` Ville-Pertti Keinonen
  2003-04-04 16:14   ` Brian Hurt
  1 sibling, 1 reply; 28+ messages in thread
From: Lauri Alanko @ 2003-04-02 21:46 UTC (permalink / raw)
  To: caml-list

> I don't feel strongly about the need for naked integers, so on my part 
> this is just speculation and general curiosity.

For occasional hotspots where naked integers are essential for
performance, wouldn't the easiest solution be to use the equivalent of
GHC's unboxed ints: a special _non-polymorphic_ datatype that doesn't
have tags. This type would be given a kind different from other types to
prevent it from being used as a type parameter. Of course the GC still
needs to be prevented from following such values, but a separate stack
for them ought to do the trick.


Lauri Alanko
la@iki.fi

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* Re: [Caml-list] Bug?  Printf, %X and negative numbers
  2003-04-02 18:42 Gregory Morrisett
@ 2003-04-02 21:12 ` Ville-Pertti Keinonen
  2003-04-02 21:46   ` Lauri Alanko
  2003-04-04 16:14   ` Brian Hurt
  2003-04-03  0:52 ` brogoff
  1 sibling, 2 replies; 28+ messages in thread
From: Ville-Pertti Keinonen @ 2003-04-02 21:12 UTC (permalink / raw)
  To: Gregory Morrisett; +Cc: caml-list


> While this approach is viable, it has a lot of costs.  For
> some of the tradeoffs, I suggest reading Xavier's excellent
> paper in the 1998 Types in Compilation workshop.

Do you mean the '97 paper (unboxing of floats in OCaml, among other 
things)?  I had read that one.  I just read the '98 paper, too, but it 
doesn't go into much detail.

> MLTON avoids these issues by specializing polymorphic code at
> all of its uses so that it becomes monomorphic (not unlike C++),
> at the price of separate compilation.

This is what I was suggesting.  With its whole-program analysis, this 
is obviously more straightforward for MLton, but I think it's also 
feasible for more practical compilers (without ending up with C++-like 
compile times).

I was thinking about keeping separate compilation by either using 
specialization as an optimization when the number of variations is 
reasonable at the point where the polymorphic code is implemented, or 
passing the generic code in a semi-compiled form and letting it be 
specialized on (first) use.  The latter is obviously better, but 
requires quite a bit of work on the intermediate compiled form and 
linking.

> Generics in C# go yet another route with runtime specialization
> which has distinct advantages like the possibility of supporting
> polymorphic recursion (see Andrew Kennedy & co's papers.)
> There are different tradeoffs here, due to features such as
> reflection and "instanceof", etc.

Thanks for the pointer.

> In short, there's a wealth of literature on this subject.
> Ocaml has taken a very expedient approach and in my opinion,
> it would be difficult to produce an alternative that
> achieves the same performance without introducing a lot
> of complexity.

I agree that the OCaml runtime makes good compromises that work well in 
practice.  Any added complexity would probably hurt symbolic code, 
which seems to have had a high priority in considerations of tradeoffs.

I don't feel strongly about the need for naked integers, so on my part 
this is just speculation and general curiosity.

What I would like is specialization of functors.  I hate using data 
structures that lose to Java in performance. ;-)

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

* RE: [Caml-list] Bug?  Printf, %X and negative numbers
@ 2003-04-02 18:42 Gregory Morrisett
  2003-04-02 21:12 ` Ville-Pertti Keinonen
  2003-04-03  0:52 ` brogoff
  0 siblings, 2 replies; 28+ messages in thread
From: Gregory Morrisett @ 2003-04-02 18:42 UTC (permalink / raw)
  To: Ville-Pertti Keinonen, Andreas Rossberg; +Cc: caml-list

>For generic code, it obviously requires either boxing or specialized 
>versions of the code, as I suggested in a different message.

The TIL (and TILT) and MLTON compilers support untagged integers.
As you suggest (and Xavier well knows) the hard part is dealing
with polymorphic code of which there is a lot in ML.  Consider, for
instance, a function such as map -- whether it produces integer
cons-cells depends upon how map is instantiated.  Life gets
complicated when you don't have tags.  TIL/T solved this by 
passing type representations to polymorphic functions.  These
representations could be used to construct header words for
objects to indicate which fields were[n't] pointers.  The information
was also used to support unboxed doubles, and a few other things.
See my thesis for more information.  

While this approach is viable, it has a lot of costs.  For
some of the tradeoffs, I suggest reading Xavier's excellent 
paper in the 1998 Types in Compilation workshop.  

MLTON avoids these issues by specializing polymorphic code at
all of its uses so that it becomes monomorphic (not unlike C++), 
at the price of separate compilation.

Generics in C# go yet another route with runtime specialization
which has distinct advantages like the possibility of supporting
polymorphic recursion (see Andrew Kennedy & co's papers.)    
There are different tradeoffs here, due to features such as
reflection and "instanceof", etc.

In short, there's a wealth of literature on this subject.  
Ocaml has taken a very expedient approach and in my opinion,
it would be difficult to produce an alternative that 
achieves the same performance without introducing a lot
of complexity.  

-Greg

-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners


^ permalink raw reply	[flat|nested] 28+ messages in thread

end of thread, other threads:[~2003-04-04 17:27 UTC | newest]

Thread overview: 28+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-03-28 21:19 [Caml-list] Bug? Printf, %X and negative numbers Brian Hurt
2003-03-28 22:21 ` Yutaka OIWA
2003-03-30  9:51 ` Xavier Leroy
2003-03-31 15:44   ` Brian Hurt
2003-03-31 17:13     ` Ville-Pertti Keinonen
2003-04-01  8:19     ` Xavier Leroy
2003-04-01 16:09       ` David Brown
2003-04-01 16:45       ` Tim Freeman
2003-04-01 18:59         ` Brian Hurt
2003-04-01 19:16           ` Ville-Pertti Keinonen
2003-04-01 19:23             ` Tim Freeman
2003-04-01 21:00               ` Ville-Pertti Keinonen
2003-04-01 19:56             ` Brian Hurt
2003-04-01 20:45               ` Ville-Pertti Keinonen
2003-04-01 21:03                 ` Brian Hurt
2003-04-02  8:55             ` Andreas Rossberg
2003-04-02  9:20               ` Ville-Pertti Keinonen
2003-04-01 18:34       ` Ville-Pertti Keinonen
2003-04-02 11:44 ` Claude Marche
2003-04-02 18:42 Gregory Morrisett
2003-04-02 21:12 ` Ville-Pertti Keinonen
2003-04-02 21:46   ` Lauri Alanko
2003-04-03 17:40     ` Ville-Pertti Keinonen
2003-04-04 16:14   ` Brian Hurt
2003-04-04 17:14     ` Ville-Pertti Keinonen
2003-04-04 17:27     ` Falk Hueffner
2003-04-03  0:52 ` brogoff
2003-04-03  9:29 Fabrice Le Fessant

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).