From: Raymond T. <to...@rt...> - 2000-01-28 16:48:40
|
If I do a (make-array 10 :element-type 'double-float), will CLISP allocate some array somewhere that really only holds 'double-float types? The reason I'm asking is that my old Lisp FFI to LAPACK has been resurrected by someone with some time to actually work on it. It currently only supports CMUCL but it would be nice if CLISP could use it too. To make it work, I think there are only two requirments: 1. The Lisp should support simple-array's of single-float and double-float that are eventually laid out in memory just like C or Fortran would lay them out. 2. A function or some other means to get a hold of that piece of memory. If seems that 1 is not true since upgraded-array-element-type always returns T. Of course, even if these requirements were met, there'd be a some work to get the FFI ported to CLISP, but at least it would be possible to do. Thanks, Ray |
From: Bruno H. <ha...@il...> - 2000-01-28 19:33:26
|
Raymond writes: > > If I do a (make-array 10 :element-type 'double-float), will CLISP > allocate some array somewhere that really only holds 'double-float > types? No. In CLISP, single-float and double-float are boxed [well, single-float is immediate on 64-bit platforms, but that's a detail]. Floats already cons a lot, on every FP operation. If AREF would need cons up a new double-float, numerical stuff would become even more inefficient. > The reason I'm asking is that my old Lisp FFI to LAPACK has been > resurrected by someone with some time to actually work on it. It > currently only supports CMUCL but it would be nice if CLISP could use > it too. CLISP's FFI supports arrays of double-floats. But it supports them by copying in and out. The question how CLISP represents arrays of double-floats is irrelevant for FFI issues, because you cannot poke around in a CLISP object from within a foreign C/Fortran routine anyway. The latter also because of GC issues: You are allowed to call Lisp callbacks, and they can hich could cause a GC, the array might be moved. Bruno |
From: Raymond T. <to...@rt...> - 2000-01-28 19:46:32
|
>>>>> "Bruno" == Bruno Haible <ha...@il...> writes: Bruno> Raymond writes: >> >> If I do a (make-array 10 :element-type 'double-float), will CLISP >> allocate some array somewhere that really only holds 'double-float >> types? Bruno> No. In CLISP, single-float and double-float are boxed Bruno> [well, single-float is immediate on 64-bit platforms, but Bruno> that's a detail]. Floats already cons a lot, on every FP That's what I thought. The point of having this FFI was to take advantage of the good linear algebra stuff out there so Clisp (and CMUCL) would benefit from that knowledge. >> The reason I'm asking is that my old Lisp FFI to LAPACK has been >> resurrected by someone with some time to actually work on it. It >> currently only supports CMUCL but it would be nice if CLISP could use >> it too. Bruno> CLISP's FFI supports arrays of double-floats. But it Bruno> supports them by copying in and out. This makes the use of LAPACK less than optimum, but still better than redoing LAPACK in lisp. I'll look into this. Bruno> The question how CLISP represents arrays of double-floats Bruno> is irrelevant for FFI issues, because you cannot poke Bruno> around in a CLISP object from within a foreign C/Fortran Bruno> routine anyway. The latter also because of GC issues: You Bruno> are allowed to call Lisp callbacks, and they can hich could Bruno> cause a GC, the array might be moved. When I created this for CMUCL, CMUCL had a limit on how much alien memory could be malloc'ed because CMUCL's heap was about 8MB above the C heap. That's changed now in recent x86 ports, but perhaps not for others. Since the lisp heap was "unlimited", I figured out how to get a hold of the lisp data itself, which isn't boxed. I turn off GC before getting these pointers so that nothing would move while the foreign routines worked on the data. It seems to work. :-) Thanks for your help, Ray |