From 3631b758acfb2585809fdb0755e1a8e7afe3b9b7 Mon Sep 17 00:00:00 2001 From: Tom Smeding Date: Mon, 24 Feb 2025 22:10:47 +0100 Subject: Dual arrays is >100x faster than 'ad' on large fneural ad:Numeric.AD.Double / ad-dual:Numeric.ADDual.Array.Internal Prelude> 1.129e-3 / 41.89e-6 -- neural-100 26.951539746956314 Prelude> 34.67e-3 / 156.9e-6 -- neural-180 220.9687699171447 Prelude> 79.03e-3 / 178.6e-6 -- neural-500 442.4972004479283 Prelude> 365.3e-3 / 665.5e-6 -- neural-2000 548.9105935386928 --- bench/Main.hs | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) (limited to 'bench') diff --git a/bench/Main.hs b/bench/Main.hs index 1174a3a..cccc686 100644 --- a/bench/Main.hs +++ b/bench/Main.hs @@ -11,8 +11,10 @@ import System.Environment (getArgs) import System.Mem (performGC) import qualified Numeric.AD as AD +import qualified Numeric.AD.Double as AD.Double import qualified Numeric.ADDual as ADD +import qualified Numeric.ADDual.Array.Internal as ADDA import Numeric.ADDual.Examples @@ -29,6 +31,10 @@ mainCriterion = defaultMain ,benchNeural 180 -- rather stably 2 GCs ,benchNeural 500 ,benchNeural 2000 + ,benchNeuralA 100 + ,benchNeuralA 180 -- rather stably 2 GCs + ,benchNeuralA 500 + ,benchNeuralA 2000 ] where benchNeural :: Int -> Benchmark @@ -36,7 +42,14 @@ mainCriterion = defaultMain env (pure (makeNeuralInput n)) $ \input -> bgroup ("neural-" ++ show n) [bench "dual" $ nf (\inp -> ADD.gradient' fneural inp 1.0) input - ,bench "ad" $ nf (\inp -> AD.grad fneural inp) input] + ,bench "ad" $ nf (\inp -> AD.grad fneural inp) input + ,bench "ad.Double" $ nf (\inp -> AD.Double.grad fneural inp) input] + + benchNeuralA :: Int -> Benchmark + benchNeuralA n = + env (pure (makeNeuralInput_A n)) $ \input -> + bgroup ("neuralA-" ++ show n) + [bench "dual" $ nf (\inp -> ADDA.gradient' fneural_A inp 1.0) input] mainNeuralGraph :: IO () mainNeuralGraph = do -- cgit v1.2.3-70-g09d2