This appendix contains two more versions of the determinant function
from the linear equation solver described in
Section *. The version on the left is the
original sequential version. That on the right is a slightly
cleaned-up version of the directly-parallel code originally written.
Compared with the strategic version presented earlier, the directly
parallel version is both lower-level and more obscure.
Sequential Version: sum l_par where l_par = map determine1 [jLo..jHi] determine1 j = (if pivot > 0 then sign*pivot*det' else 0) where sign = if (even (j-jLo)) then 1 else -1 pivot = (head mat) !! (j-1) mat' = SqMatrixC ((iLo,jLo),(iHi-1,jHi-1)) (map (newLine j) (tail mat)) det' = determinant mat' |
Direct Parallel Version: sum l_par where l_par = do_it_from_to jLo do_it_from_to j | j>jHi = [] | otherwise = fx `par` (fx:rest) where sign = if (even (j-jLo)) then 1 else -1 mat' = SqMatrixC ((iLo,jLo),(iHi-1,jHi-1)) (parMap (newLine j) (tail mat)) pivot = (head mat) !! (j-1) det' = mat' `seq` determinant mat' x = case pivot of 0 -> 0 _ -> sign*pivot*det' fx = sign `par` if pivot>0 then det' `par` x else x rest = do_it_from_to (j+1) |