14

Data.Array.Repa が実際に hmatrix よりも高速であることは興味深いことです。hmatrix は LAPACK を使用して実装されているため、これは予想外です。これはレパがアンボックスタイプを使っているからでしょうか?

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)

1 コアでの
実行時間: 7.011 秒 2 コアでの実行時間: 3.975 秒

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)

実行時間: 20.714 秒

4

1 に答える 1

7

最適化されていない LAPACK ライブラリを使用している可能性があります。私のコンピューターでは、libatlas-base を使用して、実行時間は ~0.4 秒です。

$猫matrixproduct.hs

import Numeric.LinearAlgebra

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

$ ghc マトリックス製品.hs -O

$ 時間 ./matrixproduct

1.0
1.0
1000.0

real    0m0.331s
user    0m0.512s
sys     0m0.016s
于 2013-11-03T20:19:28.530 に答える