|
(a)
(defun product (v1 v2)
(defun product (v1 v2)
(let ((sum 0.0)
(size (size-of v1))
(elm-a (future (nth-element v2 0))) ; request for the first
(elm-b nil)
(dotimes (i size)
(setf elm-b
(future (nth-element v2 (+ i 1)))) ; request for the next
(setf sum (+ sum (* (nth-element v1 i)
(touch elm-a)))) ; use of the value
(setf elm-a elm-b))
sum))
(let ((sum 0.0) (size (size-of v1)) (elm-a (future (nth-element v2 0))) ; request for the first (elm-b nil) (dotimes (i size) (setf elm-b (future (nth-element v2 (+ i 1)))) ; request for the next (setf sum (+ sum (* (nth-element v1 i) (touch elm-a)))) ; use of the value (setf elm-a elm-b)) sum)) (b) (defun product (v1 v2)
(defun product (v1 v2)
(let* ((sum 0.0)
(size (size-of v1))
(elms (make-array size)))
(dotimes (i size) ; request for all
(setf (aref elms i) ; the elements
(future (nth-element v2 i))))
(dotimes (i size)
(setf sum (+ sum (* (nth-element v1 i)
(touch (aref elms i)))))) ; use of the values
sum))
(let* ((sum 0.0) (size (size-of v1)) (elms (make-array size))) (dotimes (i size) ; request for all (setf (aref elms i) ; the elements (future (nth-element v2 i)))) (dotimes (i size) (setf sum (+ sum (* (nth-element v1 i) (touch (aref elms i)))))) ; use of the values sum)) |
|
(a)
(defun product (v1 v2)
(defun product (v1 v2)
(let ((sum 0.0) (size (size-of v1))
(dotimes (i size)
(setf sum
(+ sum (* (nth-element v1 i)
(nth-element v2 i)))) ; performs touch here
(let ((sum 0.0) (size (size-of v1)) (dotimes (i size) (setf sum (+ sum (* (nth-element v1 i) (nth-element v2 i)))) ; performs touch here {prefetch (nth-element v2 (+ i 1))}) ; sends a request
{prefetch (nth-element v2 0)}
sum))) {prefetch (nth-element v2 (+ i 1))}) ; sends a request
{prefetch (nth-element v2 0)}
sum)))
(b) (defun product (v1 v2)
(defun product (v1 v2)
(let ((sum 0.0) (size (size-of v1))
(dotimes (i size)
(setf sum
(+ sum (* (nth-element v1 i)
(nth-element v2 i))))) ; performs touch here
(let ((sum 0.0) (size (size-of v1)) (dotimes (i size) (setf sum (+ sum (* (nth-element v1 i) (nth-element v2 i))))) ; performs touch here {prefetch (dotimes (i size) ; even iterations can be
(nth-element v2 i))} ; written in annotations
sum))) {prefetch (dotimes (i size) ; even iterations can be
(nth-element v2 i))} ; written in annotations
sum)))
|