興味深いことに、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コアとの時間を実行している
はあなたが基準との適切なマイクロベンチマークを構築しようとしたことがありますか?それは、構成と乗算を測定するように思えますし、すべてを一度に印刷するためのIOは、実際のユースケースには接続しないノイズと結果がたくさんあります。 –
また、Repsは平行でLAPACKはこの場合ではないかもしれません – MFlamer
@ ThomasM.DuBuisson:良い提案!しかし、私はこのケースでは建設に時間がかかり過ぎるとは思っていません。マトリックスに1つの要素しか印刷していないので、IOも大きな問題ではありません。私は時間があるときに基準を試してみます。 – kai