(format nil "線型方程式~7@{~a~:*~}" "の続き")

id:yshl:20130601:1370092972 の続きです。
Common LispScheme に対してブロック化 LU 分解とストリップマイニングをほどこしたら速度が以下のような感じに。

  • SBCL: 1.0 s
  • ECL 0.94 s
  • Bigloo 1.2 s
  • Chicken 3.5 s

ソースは https://github.com/yshl/1000x1000 にあります。
現状では下のコードのように、配列 a の i1行と k 列の内積で、8個数値を取り出して別々の変数に代入し、内積の積をベタに書く、となっているのですけど、Lisp のマクロならこの繰り返しをコンパイル時に自動でやってくれるんじゃないかと思うんですが、やりかたがわからない。

(let ((aij0 (aref a i1 (+ j 0)))
      (aij1 (aref a i1 (+ j 1)))
      (aij2 (aref a i1 (+ j 2)))
      (aij3 (aref a i1 (+ j 3)))
      (aij4 (aref a i1 (+ j 4)))
      (aij5 (aref a i1 (+ j 5)))
      (aij6 (aref a i1 (+ j 6)))
      (aij7 (aref a i1 (+ j 7)))
      )
  (loop for k fixnum from blockend below n do
        (sub-setf (aref a i1 k)
                  (+ (* aij0 (aref a (+ j 0) k))
                     (* aij1 (aref a (+ j 1) k))
                     (* aij2 (aref a (+ j 2) k))
                     (* aij3 (aref a (+ j 3) k))
                     (* aij4 (aref a (+ j 4) k))
                     (* aij5 (aref a (+ j 5) k))
                     (* aij6 (aref a (+ j 6) k))
                     (* aij7 (aref a (+ j 7) k))
                     ))))