Commit 755d64f8 authored by Alfredo Di Napoli's avatar Alfredo Di Napoli Committed by Alfredo Di Napoli

Add basic benchmarks

parent c9385388
{-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeApplications #-}
{-# LANGUAGE OverloadedStrings #-}
module Main where module Main where
...@@ -9,9 +10,14 @@ import Gargantext.Core.Viz.Phylo.API.Tools (readPhylo) ...@@ -9,9 +10,14 @@ import Gargantext.Core.Viz.Phylo.API.Tools (readPhylo)
import Gargantext.Core.Viz.Phylo.PhyloMaker (toPhylo) import Gargantext.Core.Viz.Phylo.PhyloMaker (toPhylo)
import Gargantext.Core.Viz.Phylo.PhyloTools import Gargantext.Core.Viz.Phylo.PhyloTools
import Gargantext.Prelude.Crypto.Auth (createPasswordHash) import Gargantext.Prelude.Crypto.Auth (createPasswordHash)
import qualified Gargantext.Core.LinearAlgebra as LA
import qualified Gargantext.Core.Methods.Similarities.Accelerate.Distributional as Accelerate
import Test.Tasty.Bench import Test.Tasty.Bench
import Paths_gargantext import Paths_gargantext
import qualified Data.Array.Accelerate as A
import qualified Data.Massiv.Array as Massiv
import qualified Data.Array.Accelerate.Interpreter as Naive
phyloConfig :: PhyloConfig phyloConfig :: PhyloConfig
phyloConfig = PhyloConfig { phyloConfig = PhyloConfig {
...@@ -37,6 +43,28 @@ phyloConfig = PhyloConfig { ...@@ -37,6 +43,28 @@ phyloConfig = PhyloConfig {
, exportFilter = [ByBranchSize {_branch_size = 3.0}] , exportFilter = [ByBranchSize {_branch_size = 3.0}]
} }
testMatrix :: A.Matrix Int
testMatrix = A.fromList (A.Z A.:. 14 A.:. 14) $
[ 30, 36, -36, -16, 0, 7, 34, -7, 5, -4, 0, 21, 6, -35,
0, -31, 20, -15, -22, -7, -22, -37, -29, -29, 23, -31, -29, -23,
-24, -29, 19, -6, 16, 7, 15, -27, -27, -30, -9, -33, 18, -23,
7, -36, 12, 26, -17, -3, -2, -15, -4, 26, 24, 9, -4, 4,
32, 28, -2, -10, 34, -3, 20, -9, -22, 20, -26, 34, 18, -21,
7, -12, 12, -2, 36, 10, 34, -37, 13, -9, -28, 34, 33, -18,
-4, -32, -1, 29, 29, -28, 24, 28, 35, 19, 8, -18, 25, -35,
-14, -4, -24, -1, 7, 34, -37, -28, -12, -32, -5, -23, 27, 33,
-36, -28, 21, -29, -2, -26, -4, -31, -26, -21, 33, -11, -33, 20,
25, 14, 5, -7, 5, 24, 37, 1, -3, 23, 25, -16, 17, 5,
-35, 36, -2, -2, 1, -14, 34, -30, -10, 12, 25, 21, 0, 34,
17, -1, 20, -19, 15, 20, -5, -30, -35, -13, 5, 17, -10, -19,
-34, -11, -18, 26, -29, -28, 0, 3, 23, -6, 36, 4, 16, 28,
13, -37, -16, 2, 7, -13, 21, -10, -33, -33, -26, -19, -1, 29]
{-# INLINE testMatrix #-}
testMassivMatrix :: Massiv.Matrix Massiv.D Int
testMassivMatrix = LA.accelerate2MassivMatrix testMatrix
{-# INLINE testMassivMatrix #-}
main :: IO () main :: IO ()
main = do main = do
_issue290Phylo <- force . setConfig phyloConfig <$> (readPhylo =<< getDataFileName "bench-data/phylo/issue-290.json") _issue290Phylo <- force . setConfig phyloConfig <$> (readPhylo =<< getDataFileName "bench-data/phylo/issue-290.json")
...@@ -51,5 +79,10 @@ main = do ...@@ -51,5 +79,10 @@ main = do
, bgroup "Phylo" [ , bgroup "Phylo" [
bench "toPhylo (small)" $ nf toPhylo issue290PhyloSmall bench "toPhylo (small)" $ nf toPhylo issue290PhyloSmall
] ]
, bgroup "distributional" [
bench "Accelerate (Naive)" $ nf (Accelerate.distributionalWith @Double Naive.run) testMatrix
, bench "Accelerate (LLVM)" $ nf Accelerate.distributional testMatrix
, bench "Massiv " $ nf (Massiv.computeAs Massiv.U . LA.distributional @Double) testMassivMatrix
]
] ]
] ]
...@@ -902,6 +902,10 @@ benchmark garg-bench ...@@ -902,6 +902,10 @@ benchmark garg-bench
Paths_gargantext Paths_gargantext
build-depends: base build-depends: base
, bytestring ^>= 0.11.5.3 , bytestring ^>= 0.11.5.3
, accelerate
, accelerate-llvm
, massiv
, deepseq
, gargantext , gargantext
, gargantext-prelude , gargantext-prelude
, tasty-bench , tasty-bench
......
{-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-| {-|
Module : Gargantext.Core.LinearAlgebra Module : Gargantext.Core.LinearAlgebra
Description : Linear Algebra utility functions Description : Linear Algebra utility functions
...@@ -19,6 +20,11 @@ module Gargantext.Core.LinearAlgebra ( ...@@ -19,6 +20,11 @@ module Gargantext.Core.LinearAlgebra (
-- * Functions -- * Functions
, createIndices , createIndices
-- * Convertion functions
, accelerate2MassivMatrix
, massiv2AccelerateMatrix
, massiv2AccelerateVector
-- * Operations on matrixes -- * Operations on matrixes
, (.*) , (.*)
, diag , diag
...@@ -26,15 +32,18 @@ module Gargantext.Core.LinearAlgebra ( ...@@ -26,15 +32,18 @@ module Gargantext.Core.LinearAlgebra (
, distributional , distributional
) where ) where
import Data.Array.Accelerate qualified as Acc
import Data.Bimap (Bimap) import Data.Bimap (Bimap)
import Data.Bimap qualified as Bimap import Data.Bimap qualified as Bimap
import Data.List.Split qualified as Split
import Data.Map.Strict (Map) import Data.Map.Strict (Map)
import Data.Map.Strict qualified as M import Data.Map.Strict qualified as M
import Data.Massiv.Array (D, Matrix, Vector, Array, Ix3)
import Data.Massiv.Array qualified as A
import Data.Set qualified as S import Data.Set qualified as S
import Data.Set (Set) import Data.Set (Set)
import Prelude import Prelude
import Data.Massiv.Array qualified as A import Protolude.Safe (headMay)
import Data.Massiv.Array (D, Matrix, Vector, Array, Ix3)
newtype Index = Index { _Index :: Int } newtype Index = Index { _Index :: Int }
deriving newtype (Eq, Show, Ord, Num, Enum) deriving newtype (Eq, Show, Ord, Num, Enum)
...@@ -48,6 +57,28 @@ createIndices = set2indices . map2set ...@@ -48,6 +57,28 @@ createIndices = set2indices . map2set
set2indices :: Ord t => Set t -> Bimap Index t set2indices :: Ord t => Set t -> Bimap Index t
set2indices s = foldr (uncurry Bimap.insert) Bimap.empty (zip [0..] $ S.toList s) set2indices s = foldr (uncurry Bimap.insert) Bimap.empty (zip [0..] $ S.toList s)
-- | Converts an accelerate matrix into a Massiv matrix.
accelerate2MassivMatrix :: (A.Unbox a, Acc.Elt a) => Acc.Matrix a -> Matrix D a
accelerate2MassivMatrix m =
let (Acc.Z Acc.:. _r Acc.:. c) = Acc.arrayShape m
in A.delay $ A.fromLists' @A.U A.Par $ Split.chunksOf c (Acc.toList m)
-- | Converts a massiv matrix into an accelerate matrix.
massiv2AccelerateMatrix :: (Acc.Elt a, A.Source r a) => Matrix r a -> Acc.Matrix a
massiv2AccelerateMatrix m =
let m' = A.toLists2 m
r = Prelude.length m'
c = maybe 0 Prelude.length (headMay m')
in Acc.fromList (Acc.Z Acc.:. r Acc.:. c) (mconcat m')
-- | Converts a massiv vector into an accelerate one.
massiv2AccelerateVector :: (A.Source r a, Acc.Elt a) => A.Vector r a -> Acc.Vector a
massiv2AccelerateVector m =
let m' = A.toList m
r = Prelude.length m'
in Acc.fromList (Acc.Z Acc.:. r) m'
-- | Computes the diagnonal matrix of the input one. -- | Computes the diagnonal matrix of the input one.
diag :: Num e => Matrix D e -> Vector D e diag :: Num e => Matrix D e -> Vector D e
diag matrix = diag matrix =
......
...@@ -97,24 +97,6 @@ testMatrix_02 = SquareMatrix $ fromList (Z :. 7 :. 7) $ ...@@ -97,24 +97,6 @@ testMatrix_02 = SquareMatrix $ fromList (Z :. 7 :. 7) $
13, -37, -16, 2, 7, -13, 21] 13, -37, -16, 2, 7, -13, 21]
accelerate2MassivMatrix :: (Massiv.Unbox a, Elt a) => Matrix a -> Massiv.Matrix Massiv.D a
accelerate2MassivMatrix m =
let (Z :. _r :. c) = A.arrayShape m
in Massiv.delay $ Massiv.fromLists' @Massiv.U Massiv.Par $ Split.chunksOf c (A.toList m)
massiv2AccelerateMatrix :: (Elt a, Massiv.Source r a) => Massiv.Matrix r a -> Matrix a
massiv2AccelerateMatrix m =
let m' = Massiv.toLists2 m
r = Prelude.length m'
c = maybe 0 Prelude.length (headMay m')
in A.fromList (Z :. r :. c) (mconcat m')
massiv2AccelerateVector :: (Massiv.Source r a, Elt a) => Massiv.Vector r a -> Vector a
massiv2AccelerateVector m =
let m' = Massiv.toList m
r = Prelude.length m'
in A.fromList (Z :. r) m'
-- --
-- Main test runner -- Main test runner
-- --
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment