2013-11-01 88 views
13

有趣的是,Data.Array.Repa實際上比hmatrix更快,這是意外的,因爲hmatrix是使用LAPACK實現的。這是因爲Repa使用的是取消裝箱類型?爲什麼矩陣的乘法運算比使用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) 

運行時間1個核心:7.011s
有2個核心運行時間: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) 

運行時間:20.714s

+9

你試過建設有標準適當的微基準?看起來好像測量結構和乘法以及一次性打印所有IO一定會得到很多噪音和結果,而這些噪音和結果不會與任何實際用例相關聯。 –

+0

此外,代表並行,LAPACK可能不在這種情況下 – MFlamer

+0

@ ThomasM.DuBuisson:好的建議!但是,我不認爲在這種情況下構建會花費太多時間,並且由於我只在矩陣中打印了一個元素,IO也不是什麼大不了的事情。有空的時候我會試試Criterion。 – kai

回答

6

也許你正在使用非優化的LAPACK圖書館。在我的電腦中,使用libatlas-base,運行時間爲〜0.4s。

$貓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

$時間./matrixproduct

1.0 
1.0 
1000.0 

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

你是對的!解決了這個問題。但是我無法在Centos上找到libatlas,而Ubuntu有一個。 – kai

+0

您是否需要做任何事情來告訴hmatrix使用優化的庫?我已經安裝了libatlas-base並重建了hmatrix和我的代碼,並發現perf中沒有區別。 –

相關問題