Unpacking across modules

Simon Marlow simonmarhaskell at gmail.com
Tue Nov 13 06:45:26 EST 2007

Scott Dillard wrote:

> What is the interaction between the UNPACK pragma and modules? I've
> attached a small test case where a datatype is unpacked when it and
> its associated functions are defined in the same file in which they
> are used, but it is not unpacked if the definitions are given in
> another module. There are two versions of the data type, a monomorphic
> one, defined by:
>> data Vec3 = Vec3 Double Double Double
> and a polymorphic, recursive one, defined by
>> data C a b = C a b
> With the following typedef to make them equivalent
>> type Vec3 = C Double (C Double (C Double () ))

Firstly, adding an UNPACK pragma to a polymorphic component has no effect 
(try removing them, you'll get the same result).  The UNPACK pragma affects 
the representation of the constructor; a given constructor has only one 
representation, not one per instantiation, so a polymorphic field is always 
represented by a pointer.  There's a good reason for this: if a constructor 
had multiple representations, it would require compiling multiple versions 
of code that pattern matched on it, and things get quite complicated.  It's 
not impossible - I believe .NET does this, but GHC doesn't.

What you're seeing here is the magic of automatic specialisation.  When the 
Vec type and instances are in the same module as the use, GHC can see what 
type the instances are being used at, and can create specialised instances, 
which it does.  Then the strictness analyser kicks in and everything is 
unboxed.  When the use of the instance is in a separate module, GHC cannot 
specialise, because it doesn't know what type to specialise at.  If you add 
appropriate {-# SPECIALISE instance #-} pragmas in the POLY_OTHER case, you 
should be able to get good code.

> PS: Also, when the INLINE pragma is used with the Storable instance
> for the polymorphic data type, it causes heap explosion, even in the
> same file. Any thoughts here?

I suspect this is defeating the specialisation somehow, but I'm not sure.


More information about the Glasgow-haskell-users mailing list