2013-11-01 24 views
13

興味深いことに、Data.Array.Repaはhmatrixより高速ですが、hmatrixはLAPACKを使用して実装されているため予期せぬことです。これは、Repaがボックス化されていないタイプを使用しているためですか?なぜ行列乗算はhmatrixよりもRepaで高速ですか?

1つのコアとの時間を実行している
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) 

:実行時間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) 

:7.011s
は2コアとの時間を実行している

+9

はあなたが基準との適切なマイクロベンチマークを構築しようとしたことがありますか?それは、構成と乗算を測定するように思えますし、すべてを一度に印刷するためのIOは、実際のユースケースには接続しないノイズと結果がたくさんあります。 –

+0

また、Repsは平行でLAPACKはこの場合ではないかもしれません – MFlamer

+0

@ ThomasM.DuBuisson:良い提案!しかし、私はこのケースでは建設に時間がかかり過ぎるとは思っていません。マトリックスに1つの要素しか印刷していないので、IOも大きな問題ではありません。私は時間があるときに基準を試してみます。 – kai

答えて

6

20.714sおそらくあなたは、非最適化LAPACKを使用していますとしょうかん。私のコンピュータでは、libatlas-baseを使って、実行時間は〜0.4sです。

$猫が

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

をmatrixproduct.hs $時間./matrixproduct

1.0 
1.0 
1000.0 

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

あなたは正しいです!それが問題を解決します。しかし、Centosではlibatlas-baseを見つけることができませんが、Ubuntuにはlibatlas-baseがあります。 – kai

+0

最適化されたライブラリを使用するようにhmatrixに指示するために何かする必要がありますか?私はlibatlas-baseをインストールし、hmatrixと私のコードを再構築し、perfに違いは見られません。 –

関連する問題