2013-11-01 11 views
13

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

+9

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. –

+0

Auch, Reps ist parallel und LAPACK ist möglicherweise in diesem Fall nicht – MFlamer

+0

@ 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

Antwort

6

Vielleicht verwenden Sie einen nicht-optimierte LAPACK Bibliothek. In meinem Computer, mit libatlas-base, ist die Laufzeit ~ 0,4s.

$ cat matrixproduct.hs

import Numeric.LinearAlgebra 

main = do 
    let a = (1000><1000) $ replicate (1000*1000) (1::Double) 
     b = konst 1 (1000,1000) 
    print $ [email protected]@>(100,100) 
    print $ [email protected]@>(100,100) 
    print $ (a <> b) @@> (900,900) 

$ ghc matrixproduct.hs -O

$ time ./matrixproduct

1.0 
1.0 
1000.0 

real 0m0.331s 
user 0m0.512s 
sys  0m0.016s 
+0

Sie haben Recht! Das löst das Problem. Aber ich kann keine libatlas-Basis auf Centos finden, während es eine für Ubuntu gibt. – kai

+0

Müssen Sie etwas tun, um der hmatrix mitzuteilen, die optimierten Bibliotheken zu verwenden? Ich habe libatlas-base und umgebaute hmatrix und meinen Code installiert, und sehe keinen Unterschied in perf. –

Verwandte Themen