By unrolling the loops of matrix multiply, substituting the values from the coefficient matrix, and performing partial evaluation on the result, a specialized version of the matrix multiply is obtained:
> (fnopt 'mxmult 'rotate-x '(b theta x)) (LAMBDA-BLOCK ROTATE-X (B THETA X) (PROGN (SETF (AREF X 0 0) (AREF B 0 0)) (SETF (AREF X 0 1) (AREF B 0 1)) (SETF (AREF X 0 2) (AREF B 0 2)) (SETF (AREF X 0 3) (AREF B 0 3)) (SETF (AREF X 1 0) (- (* (COS THETA) (AREF B 1 0)) (* (SIN THETA) (AREF B 2 0)))) (SETF (AREF X 1 1) (- (* (COS THETA) (AREF B 1 1)) (* (SIN THETA) (AREF B 2 1)))) . . . ))
This version saves many operations:
Version: | Load | Store | Add/Sub | Mul | Total |
General | 128 | 16 | 48 | 64 | 256 |
Specialized | 24 | 16 | 8 | 16 | 64 |
Contents    Page-10    Prev    Next    Page+10    Index