[cmucl-imp] Re: Static array support

Raymond Toy toy.raymond at gmail.com
Tue Dec 1 23:08:55 CET 2009


Lynn Quam wrote:
> There are a number of subtleties in implementing the "static" arrays. 
> The Allegro :ALLOCATION keyword argument to MAKE-ARRAY is interpreted
> as follows (taken from the Allegro 7.0 documentation):
>
> |:static|  or |:malloc| ||
>
>     Allocate the new array in malloc (foreign) space. The array will
>     never be touched by the garbage collector and must be deallocated
>     explicitly. Only a restricted number of element types are
>     supported for static arrays. They are listed below. :malloc and
>     :static are synonyms.
>
I believe this is what the is currently implemented using your foreign
vectors.  (Except there's no function to deallocate such vectors
currently.)   And they are vectors, not n-dimensional arrays. 

These are also no currently exported but could be if desired.
>
> |:static-reclaimable|
>
>     Allocate the new array data in malloc (foreign) space and the
>     header in Lisp space. The data will never be touched by the
>     garbage collector but it will be deallocated when there are no
>     pointers from Lisp (using a finalization). Only a restricted
>     number of element types are supported for static arrays. They are
>     listed below. 
>
This is how the static vectors are implemented.  A complex array header
is allocated, and the data vector slot is the foreign vector
(static/malloc vector above).  We use a finalizer to free the foreign
vector when the complex array header becomes garbage.
>
>     ||
>     ||
>
> |:lispstatic-reclaimable|
>
>     Allocate the new array in malloc (foreign) space. The array will
>     never be touched by the garbage collector until there are no
>     pointers from Lisp, at which point the whole array will be
>     deallocated explicitly. Any Lisp type can be contained in the array.
>
This is not currently implemented.   If any Lisp type can be contained
in the array, we'll have to teach GC to scan the array elements in case
a lisp object moves.  And I'm not sure how to tell when such an array
becomes garbage.
>
> It is important to note the  difference between |:static-reclaimable|
> and |:lispstatic-reclaimable|.  I think that |:lispstatic-reclaimable
> is what needs to be implemented for CMUCL.  |An array allocated as
> |:static-reclaimable| cannot be a simple-array in CMUCL since the
> array data does not immediately follow the header.  Therefore, it is
> difficult to compile inline array accesses unless
> KERNEL::%WITH-ARRAY-DATA or  kernel::%array-data-vector is used to get
> the actual data-vector.   
> ||
Yes, the current static arrays are not simple-arrays.  And n-dimensional
arrays always have array headers, so inline access is never done in that
case  But some time ago I measured the difference between arrays with
and without the array header  and there was only a 10-25% (?)
difference.  (I think I compared 2D arrays, so perhaps that's not a good
test.)

Ray




More information about the cmucl-imp mailing list