[Ecls-list] Integer dot product
    Waldek Hebisch 
    hebisch at math.uni.wroc.pl
       
    Wed Sep  2 01:47:58 UTC 2009
    
    
  
The following file at safety 0 in 64-bit sbcl produces inline code
(with no function calls in inner loop).  However, in ecl operations
are done via function calls.  If I replace types with specified
accuracy by fixnum array access, addition and multiplication
is done via inline code.  However, I would like to avoid
overhead for untagging values and extra space taken by
fixnums on 64-bit machines.  Also, fixnum accuracy on 32-bit
machines is too low, so I have to specify 64-bit type.
I wonder how much effort it would take to generate inline
code for 32-bit and 64-bit types.  I looked at sysfun.lsp
and it seems that before defining inline I need a correct
"representation types".
Remark: For the specific code I could probably put all code
in a single C inline.  But I would like to compose several
similar functions using macros...
----------------<cut here>---------------------------
;;; (proclaim '(optimize (speed 3) (safety 0)))
;;; Vectors of 32-bit numbers
(defmacro ELT32(v i)
    `(aref (the (simple-array (unsigned-byte 32) (*)) ,v) ,i))
;;; (x*y + z) using 32-bit x and y and 64-bit z and assuming that
;;; intermediate results fits into 64 bits
(defmacro QSMULADD64-32 (x y z)
    `(the (unsigned-byte 64)
         (+ (the (unsigned-byte 64)
               (* (the (unsigned-byte 32) ,x)
                  (the (unsigned-byte 32) ,y)))
            (the (unsigned-byte 64) ,z))))
(defmacro QSMUL64-32 (x y)
    `(the (unsigned-byte 64)
         (* (the (unsigned-byte 32) ,x)
            (the (unsigned-byte 32) ,y))))
(defmacro QSMOD64-32 (x p)
    `(the (unsigned-byte 32)
         (rem (the (unsigned-byte 64) ,x) (the (unsigned-byte 32) ,p))))
(defmacro QSPLUS (x y)
    `(the fixnum (+ (the fixnum ,x) (the fixnum ,y))))
(defmacro QMODDOT0 (eltfun varg1 varg2 ind1 ind2 kk s0 p)
    `(let ((s ,s0)
           (v1 ,varg1)
           (v2 ,varg2)
           (i1 ,ind1)
           (i2 ,ind2)
           (k0 ,kk)
           (k 0))
          (declare (type (unsigned-byte 64) s)
                   (type fixnum i1 i2 k k0))
          (prog ()
             l1
              (if (>= k k0) (return (QSMOD64-32 s ,p)))
              (setf s (QSMULADD64-32 (,eltfun v1 (QSPLUS i1 k))
                                     (,eltfun v2 (QSPLUS i2 k))
                                     s))
              (setf k (QSPLUS k 1))
              (go l1))))
(defmacro QMODDOT32 (v1 v2 ind1 ind2 kk s0 p)
     `(QMODDOT0 ELT32 ,v1 ,v2 ,ind1 ,ind2 ,kk ,s0 ,p))
(defun |myDot| (v1 v2 ind1 ind2 kk s0 p) (QMODDOT32 v1 v2 ind1 ind2 kk s0 p))
-----------------------<cut here>----------------------------------------
-- 
                              Waldek Hebisch
hebisch at math.uni.wroc.pl 
    
    
More information about the ecl-devel
mailing list