Skip to content

datadeps: Make some Array allocations eagerly freeable - #726

Merged
jpsamaroo merged 3 commits into
masterfrom
jps/datadeps-libc-alloc
Jul 27, 2026
Merged

datadeps: Make some Array allocations eagerly freeable#726
jpsamaroo merged 3 commits into
masterfrom
jps/datadeps-libc-alloc

Conversation

@jpsamaroo

Copy link
Copy Markdown
Member

Allows freeing Array allocations within Datadeps when no longer used, by allocating temporary slots from Libc.malloc (which we can then Libc.free). Should greatly reduce memory usage for CPU multi-processor execution.

Written by Claude

@github-actions

github-actions Bot commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

Dagger benchmarks: dirty vs master

master dirty master / dirty
array/dagger/N=1024 (block 512)/add (X + X) 4.21 ± 0.09 ms 4.3 ± 0.15 ms 0.979 ± 0.041
array/dagger/N=1024 (block 512)/alloc (rand) 3.42 ± 0.24 ms 3.73 ± 0.092 ms 0.918 ± 0.068
array/dagger/N=1024 (block 512)/broadcast (X .+ 1) 2.83 ± 0.063 ms 1.97 ± 0.17 ms 1.44 ± 0.13
array/dagger/N=1024 (block 512)/map (sin.(X)) 7.23 ± 0.023 ms 5.44 ± 1.7 ms 1.33 ± 0.41
array/dagger/N=1024 (block 512)/norm 1.2 ± 0.071 ms 1.31 ± 0.025 ms 0.916 ± 0.057
array/dagger/N=1024 (block 512)/reduce (sum) 2.61 ± 0.28 ms 2.52 ± 1.3 ms 1.04 ± 0.54
array/dagger/N=1024 (block 512)/transpose (permutedims) 6.74 ± 1.4 ms 7.22 ± 1.4 ms 0.934 ± 0.26
array/dagger/N=256 (block 256)/add (X + X) 1.31 ± 0.36 ms 1.38 ± 0.12 ms 0.946 ± 0.27
array/dagger/N=256 (block 256)/alloc (rand) 1.14 ± 0.11 ms 1.08 ± 0.036 ms 1.05 ± 0.11
array/dagger/N=256 (block 256)/broadcast (X .+ 1) 0.558 ± 0.17 ms 0.655 ± 0.25 ms 0.852 ± 0.41
array/dagger/N=256 (block 256)/map (sin.(X)) 1.11 ± 0.11 ms 1.27 ± 0.021 ms 0.877 ± 0.088
array/dagger/N=256 (block 256)/norm 0.537 ± 0.012 ms 0.527 ± 0.039 ms 1.02 ± 0.079
array/dagger/N=256 (block 256)/reduce (sum) 1.05 ± 0.21 ms 1.16 ± 0.27 ms 0.906 ± 0.27
array/dagger/N=256 (block 256)/transpose (permutedims) 1.14 ± 0.12 ms 1.04 ± 0.49 ms 1.1 ± 0.53
linalg/dagger/N=1024 (block 512)/cholesky 22.4 ± 4.6 ms 19.5 ± 1.7 ms 1.15 ± 0.26
linalg/dagger/N=1024 (block 512)/lu 0.0456 ± 0.0036 s 0.0432 ± 0.0046 s 1.06 ± 0.14
linalg/dagger/N=1024 (block 512)/matmul (A*A) 0.0517 ± 0.0084 s 0.047 ± 0.0023 s 1.1 ± 0.19
linalg/dagger/N=1024 (block 512)/matvec (A*x) 3.13 ± 0.16 ms 3.02 ± 0.13 ms 1.04 ± 0.068
linalg/dagger/N=1024 (block 512)/qr 0.116 ± 0.0044 s 0.118 ± 0.0031 s 0.981 ± 0.045
linalg/dagger/N=1024 (block 512)/solve (A\b via lu) 0.0517 ± 0.0031 s 0.0534 ± 0.0035 s 0.968 ± 0.086
linalg/dagger/N=1024 (block 512)/syrk (A'*A) 0.0359 ± 0.0017 s 0.0357 ± 0.0055 s 1.01 ± 0.16
linalg/dagger/N=256 (block 256)/cholesky 2.73 ± 0.27 ms 3.23 ± 0.68 ms 0.845 ± 0.2
linalg/dagger/N=256 (block 256)/lu 4.52 ± 0.19 ms 4.53 ± 2.1 ms 0.998 ± 0.47
linalg/dagger/N=256 (block 256)/matmul (A*A) 2.74 ± 0.62 ms 2.19 ± 0.4 ms 1.25 ± 0.36
linalg/dagger/N=256 (block 256)/matvec (A*x) 1.37 ± 0.067 ms 1.66 ± 0.26 ms 0.824 ± 0.13
linalg/dagger/N=256 (block 256)/qr 5.31 ± 0.35 ms 5.62 ± 0.79 ms 0.945 ± 0.15
linalg/dagger/N=256 (block 256)/solve (A\b via lu) 8.43 ± 0.086 ms 8.89 ± 0.46 ms 0.948 ± 0.05
linalg/dagger/N=256 (block 256)/syrk (A'*A) 3.28 ± 0.59 ms 3.84 ± 0.65 ms 0.854 ± 0.21
stencil/dagger/N=1024 (block 512)/alloc (neighbors Wrap) 26.7 ± 0.3 ms 26 ± 3 ms 1.02 ± 0.12
stencil/dagger/N=1024 (block 512)/assign (const) 1.44 ± 0.029 ms 1.65 ± 0.17 ms 0.876 ± 0.091
stencil/dagger/N=1024 (block 512)/multi-expr 3.87 ± 0.13 ms 4 ± 0.046 ms 0.966 ± 0.034
stencil/dagger/N=1024 (block 512)/neighbors (Clamp) 23.9 ± 1.5 ms 25.4 ± 1.3 ms 0.94 ± 0.077
stencil/dagger/N=1024 (block 512)/neighbors (Pad) 24.2 ± 2.4 ms 23.9 ± 0.7 ms 1.01 ± 0.11
stencil/dagger/N=1024 (block 512)/neighbors (Reflect) 24.8 ± 0.21 ms 25 ± 1.4 ms 0.991 ± 0.055
stencil/dagger/N=1024 (block 512)/neighbors (Wrap) 24.8 ± 0.53 ms 26 ± 6.6 ms 0.954 ± 0.24
stencil/dagger/N=1024 (block 512)/update (+) 2.93 ± 0.26 ms 3.42 ± 0.36 ms 0.857 ± 0.12
stencil/dagger/N=256 (block 256)/alloc (neighbors Wrap) 4.95 ± 0.13 ms 5.12 ± 0.14 ms 0.966 ± 0.037
stencil/dagger/N=256 (block 256)/assign (const) 0.72 ± 0.096 ms 0.785 ± 0.052 ms 0.917 ± 0.14
stencil/dagger/N=256 (block 256)/multi-expr 1.5 ± 0.2 ms 1.53 ± 0.029 ms 0.983 ± 0.13
stencil/dagger/N=256 (block 256)/neighbors (Clamp) 4.81 ± 0.21 ms 4.65 ± 0.5 ms 1.03 ± 0.12
stencil/dagger/N=256 (block 256)/neighbors (Pad) 4.71 ± 0.36 ms 4.97 ± 0.95 ms 0.947 ± 0.2
stencil/dagger/N=256 (block 256)/neighbors (Reflect) 4.91 ± 0.17 ms 4.74 ± 0.18 ms 1.04 ± 0.053
stencil/dagger/N=256 (block 256)/neighbors (Wrap) 4.81 ± 0.35 ms 4.97 ± 0.71 ms 0.967 ± 0.15
stencil/dagger/N=256 (block 256)/update (+) 0.884 ± 0.0071 ms 0.865 ± 0.025 ms 1.02 ± 0.031
time_to_load 1.04 ± 0.011 s 1.09 ± 0.04 s 0.957 ± 0.037

Plots

No regressions beyond 25.0% 🎉

Improvements (> 25.0% faster)

  • array/dagger/N=1024 (block 512)/broadcast (X .+ 1): -30.5%

Full results and plots (download the benchmark-results artifact).

@jpsamaroo
jpsamaroo force-pushed the jps/datadeps-libc-alloc branch from 9f2b4d8 to f31328b Compare July 26, 2026 21:24
@jpsamaroo
jpsamaroo force-pushed the jps/datadeps-libc-alloc branch from f31328b to aa70405 Compare July 27, 2026 00:08
@jpsamaroo
jpsamaroo merged commit 741079e into master Jul 27, 2026
26 of 36 checks passed
@jpsamaroo
jpsamaroo deleted the jps/datadeps-libc-alloc branch July 27, 2026 01:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant