caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
From: Dave Berry <dave@kal.com>
To: Xavier Leroy <Xavier.Leroy@inria.fr>,
	Norman Ramsey <nr@eecs.harvard.edu>
Cc: caml-list@inria.fr
Subject: RE: questions about costs of nativeint vs int
Date: Fri, 12 Jan 2001 12:39:06 -0000	[thread overview]
Message-ID: <3145774E67D8D111BE6E00C0DF418B663AF87C@nt.kal.com> (raw)

Do you have any plans to implement unboxed native integers?

We had such a plan during the development of MLWorks, but never implemented
it.  The register allocation code recognised a set of GC-able registers and
a set of non-GC registers.  (Since we never implemented unboxed native ints,
the set of non-GC registers was always 0 in practice).  We were planning to
change the heap layout so that the header word would encode the number of
untagged words.  The GC scan routine would skip the unboxed words, and
continue scanning the tagged words.  Obviously the compiler would have to
change to emit the correct data structures.

There were various complications.  One arose from our omission of header
words on pairs (which saved a large amount of space), but a little trickery
handled this.  I think there were some potential complications to make sure
the compiler always had enough information about data layout, but that
should be easier in OCaml than SML  (with the possible exception of objects,
which I've never implemented).

I would really have liked to see this happen, because it would have made
integration with C both easier and more efficient.

Dave.

-----Original Message-----
From: Xavier Leroy [mailto:Xavier.Leroy@inria.fr]
Sent: Thursday, January 11, 2001 18:34
To: Norman Ramsey
Cc: caml-list@inria.fr
Subject: Re: questions about costs of nativeint vs int


Dear Norman,

> We're designing interfaces for tools that will sometimes have to
> manipulate 32-bit integers, but will often be able to make do with the
> limited precision provided by the int type.  I would love to get some
> information about the relative cost of int vs nativeint in both
> parameter passing and datatype representation.

Values of type "nativeint", "int32" and "int64" are boxed
(heap-allocated and handled through a pointer), while values of type
"int" are unboxed.  So, in terms of space, we have:
        nativeint       1 word for the pointer + 2 words for the heap block
        int32           same
        int64           same on 64-bit machines, add 1 word for a 32-bitter
        int             1 word for the data
In terms of speed, operations on boxed integers are more expensive due
to the extra loads (on operands) and heap allocations (on results).
ocamlopt can avoid loads and allocations that cancel each other in
simple cases, but the fact remains that nativeint arithmetic is more
expensive than int arithmetic.

> For example, what are the relative costs (e.g., memory requirements)
> of these two definitions?
> 
>   type loc = Cell of char * int * width
>            | Slice of ...
> 
>   type loc' = Cell of char * nativeint * width
>             | Slice of ...

A "Cell" requires two more memory words in the latter case.

> As another example, what are the costs of calling these functions:
> 
>   type t
>   val add  : rd:int       -> rs1:int       -> rs2:int       -> t
>   val add' : rd:nativeint -> rs1:nativeint -> rs2:nativeint -> t

Assuming the nativeints are already available, the cost is exactly the
same: a pointer is passed instead of an unboxed integer.  However,
computing the nativeint arguments in the first place can be more expensive
if arithmetic operations are involved.

> To extend the question, what happens if I use int32 or int64 in place
> of nativeint?

No major differences.  On a 32-bit processor, int64 requires one more
memory word than the other two.  And of course 64-bit arithmetic is
slower than 32-bit arithmetic on a 32-bit processor.

Actually, "nativeint" is isomorphic to "int32" on a 32-bit platform
and to "int64" on a 64-bit platform.  The reason for having all three
types is that some applications require 32-bit integers (no more, no
less, regardless of the platform), some require 64-bit integers, and
some just want to get at the natural word size for the architecture.

> Finally, a procedural question: should I be posting these sorts of
> questions to comp.lang.ml instead of sending them to
> caml-list@inria.fr?

For technical questions about the Caml implementation, I think you get
a better chance of a reply here on caml-list.

All the best,

- Xavier



             reply	other threads:[~2001-01-12 19:03 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2001-01-12 12:39 Dave Berry [this message]
2001-01-14 11:13 ` Xavier Leroy
2001-01-15  2:09   ` John Prevost
  -- strict thread matches above, loose matches on Subject: below --
2001-01-17 13:47 Dave Berry
2001-01-12 19:53 Brent Fulgham
2001-01-10 18:25 Norman Ramsey
2001-01-11 18:34 ` Xavier Leroy
2001-01-11 22:17   ` Norman Ramsey

Reply instructions:

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

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

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

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

  git send-email \
    --in-reply-to=3145774E67D8D111BE6E00C0DF418B663AF87C@nt.kal.com \
    --to=dave@kal.com \
    --cc=Xavier.Leroy@inria.fr \
    --cc=caml-list@inria.fr \
    --cc=nr@eecs.harvard.edu \
    /path/to/YOUR_REPLY

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

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