Es ist interessant, dass Data.Array.Repa ist tatsächlich schneller als Hmatrix, die unerwartet ist, da Hmatrix mit LAPACK implementiert ist. Liegt das daran, dass Repa den unboxed Typ verwendet?Warum ist Matrix-Multiplikation schneller mit Repa als mit Hmatrix?
import Data.Array.Repa
import Data.Array.Repa.Algorithms.Matrix
main = do
let
a = fromListUnboxed (Z:.1000:.1000::DIM2) $ replicate (1000*1000) 1.0 :: Array U DIM2 Double
b = fromListUnboxed (Z:.1000:.1000::DIM2) $ replicate (1000*1000) 1.0 :: Array U DIM2 Double
m <- (a `mmultP` b)
print $ m!(Z:.900:.900)
Laufzeit mit 1 Kern: 7.011s
Zeit mit 2-Kern läuft: 3.975s
import Numeric.LinearAlgebra
import Numeric.LinearAlgebra.LAPACK
main = do
let
a = (1000><1000) $ replicate (1000*1000) 1.0
b = (1000><1000) $ replicate (1000*1000) 1.0
print $ (a `multiplyR` b) @@> (900,900)
Laufzeit: 20.714s
Haben Sie versucht, eine richtige-Micro mit Criterion bauen? Es scheint so, als würde die Messung von Konstruktion und Multiplikation und IO für das Drucken in einem einzigen Vorgang zu einer Menge Rauschen und Ergebnissen führen, die mit keinem realen Anwendungsfall in Verbindung stehen. –
Auch, Reps ist parallel und LAPACK ist möglicherweise in diesem Fall nicht – MFlamer
@ ThomasM.DuBuisson: Guter Vorschlag! Ich glaube jedoch nicht, dass Konstruktion in diesem Fall zu viel Zeit in Anspruch nehmen würde, und da ich nur ein Element in der Matrix gedruckt habe, ist IO auch keine große Sache. Ich werde Criterion ausprobieren, wenn ich Zeit habe. – kai