Lisp HUG Maillist Archive

Re: floating point code without consing?

Unable to parse email body. Email id is 200

Re: floating point code without consing?

Am Son, 2002-03-17 um 19.40 schrieb Barry Wilkes:
> 
> Just to be clear, the following syntax 'works' (ie, is accepted by the LW
> compiler) :
> <snip>
> (loop for alpha fixnum from 0 to conf
>        sum (the short-float (* (aref m1 i alpha) (aref m2 alpha j)))
>               into acc of-type short-float finally (return (the short-float acc)))
> <snip>
> 
> - note the use of the 'of-type' keyword. However, this still doesn't get rid of the
> consing.

LW has a optimize declaration which is named "float". Setting it to 0
can lead to dramatic speedups with floating point code.

Another declaration many do not know is "fixnum-safety" (be careful with
that!)

ciao,
Jochen


Re: floating point code without consing?

Jochen Schmidt <jsc@dataheaven.de> writes:
> 
> LW has a optimize declaration which is named "float". Setting it to 0
> can lead to dramatic speedups with floating point code.

I did discover this by searching on Google groups :

http://groups.google.com/groups?hl=en&ie=ISO-8859-1&oe=ISO-8859-1&threadm=357c3188.3987049031%40newshost&rnum=1&prev=/groups%3Fq%3DLispworks%2B%252B%2Bfloating%2Bpoint%2B%2Bgroup:comp.lang.lisp%26hl%3Den%26ie%3DISO-8859-1%26oe%3DISO-8859-1%26selm%3D357c3188.3987049031%2540newshost%26rnum%3D1

Sadly, I think that the problem I am seeing is that the 'future PC release
with floating point optimization' never happened. Hopefully, someone from
Xanalys will give the definitive answer.

I cannot even stop the following from consing :

(defun testing (a b c)
  (declare (type short-float a b c)
           (optimize (speed 3) (safety 0) (float 0) (debug 0)))
  (setf a (the short-float (+ b c ))))

It seems as though *all* arithmetic operations (+ * /) cons when used with floating
point types on both the Linux and Windows versions of LispWorks 4.2.

I specifically tried short-float as the type based on the following
which I also Googled up :

http://groups.google.com/groups?q=Lispworks+%2B+short-float+%2B+unboxed+group:comp.lang.lisp&hl=en&ie=ISO-8859-1&oe=ISO-8859-1&selm=LGM.94Mar9091703%40polaris.flw.att.com&rnum=1

This seemed to suggest that LispWorks supported 'unboxed'
short-floats. Unfortunatly, I think the first message suggests that
this applies to the 'UNIX' version, as distinct to the x86 (Linux and Windows)
versions.

Regards,

Barry.

--
If in the last few years you haven't discarded a major opinion or  
acquired a new one, check your pulse.  You may be dead.

-- Gelett Burgess (1866-1951)


Re: floating point code without consing?

Unable to parse email body. Email id is 206

Re: floating point code without consing?

I'd just like to thank everyone who responded to my question - this
was the first time I have attempted to do any real floating point optimisation
of my code (well, that much must have been obvious), and I have learned a lot
from you all.

Thanks,

Barry Wilkes.

-- 
If in the last few years you haven't discarded a major opinion or  
acquired a new one, check your pulse.  You may be dead.

-- Gelett Burgess (1866-1951)


Re: floating point code without consing?

* Barry Wilkes wrote:

> (defun testing (a b c)
>   (declare (type short-float a b c)
>            (optimize (speed 3) (safety 0) (float 0) (debug 0)))
>   (setf a (the short-float (+ b c ))))

> It seems as though *all* arithmetic operations (+ * /) cons when
> used with floating point types on both the Linux and Windows
> versions of LispWorks 4.2.

No, this isn't so.  This does not cons:

    (defun float-mult (a b c)
      (declare (optimize speed
			 (debug 0)
			 (safety 0) (space 0)
			 float)
	       (type (simple-array short-float (*)) a b c))
      (loop for i of-type fixnum from 0 below (length a)
	    do (setf (aref c i) (* (aref a i) (aref b i)))
	    finally (return c)))

Anything that returns a float will almost certainly have to box at
least the float it is returning I think, so in general you want to do
float operations as array -> array operations so you can keep the
floats unboxed inside the array, and pass in the result array (this is
sort-of as if you are passing in a box which the function then
modifies...).

The only Lisp implementation I know which can, I think, avoid result
consing is CMUCL if you block-compile things.  I guess the equivalent
case for LW would be if the function is completely local, when it
might be able to know enough to not box.  I don't really know anything
about LW's compiler though and how seriously it tries to do this kind
of thing (I couldn't get it to do SQRT without consing for instance, though I
didn't try hard).

--tim







Updated at: 2020-12-10 09:02 UTC