aboutsummaryrefslogtreecommitdiff
path: root/bench
diff options
context:
space:
mode:
authorTom Smeding <tom@tomsmeding.com>2025-02-24 22:10:47 +0100
committerTom Smeding <tom@tomsmeding.com>2025-02-24 22:11:24 +0100
commit3631b758acfb2585809fdb0755e1a8e7afe3b9b7 (patch)
treecba5d6b110e3b7679d7558ad30e7454fc6716616 /bench
parentcbb0dd08449cddd141145a2d2f280e3457279b47 (diff)
Dual arrays is >100x faster than 'ad' on large fneuralHEADmaster
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
Diffstat (limited to 'bench')
-rw-r--r--bench/Main.hs15
1 files changed, 14 insertions, 1 deletions
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