Skip to content

Optimizations to multi-process and multi-rank Datadeps - #739

Draft
jpsamaroo wants to merge 6 commits into
masterfrom
jps/hierarchical-mp-mr
Draft

Optimizations to multi-process and multi-rank Datadeps#739
jpsamaroo wants to merge 6 commits into
masterfrom
jps/hierarchical-mp-mr

Conversation

@jpsamaroo

Copy link
Copy Markdown
Member

Written by Claude Opus

@github-actions

github-actions Bot commented Aug 19, 2026

Copy link
Copy Markdown
Contributor

Dagger benchmarks: dirty vs master

Multi-threaded benchmarks (4 threads)

Dagger benchmarks: dirty vs master

Summary by job

Job Regressions Improvements Within noise
stencil/dagger ⚠️ 1 4 9
linalg/dagger ⚠️ 1 3 9
array/dagger 0 0 5
sparse/dagger 0 0 0

Median time

master dirty master / dirty
array/dagger/N=1024 (block 128)/add (X + X) 20.5 ± 1.5 ms 19 ± 0.8 ms 1.08 ± 0.09
array/dagger/N=1024 (block 128)/alloc (rand) 13.2 ± 0.41 ms 13.9 ± 1.2 ms 0.952 ± 0.088
array/dagger/N=1024 (block 128)/broadcast (X .+ 1) 13.6 ± 0.95 ms 12 ± 0.24 ms 1.13 ± 0.082
array/dagger/N=1024 (block 128)/map (sin.(X)) 11.1 ± 0.81 ms 11.1 ± 0.26 ms 1 ± 0.076
array/dagger/N=1024 (block 128)/norm 13.1 ± 0.099 ms 13 ± 1.3 ms 1.01 ± 0.1
array/dagger/N=1024 (block 128)/reduce (sum) 25.9 ± 0.68 ms 26.3 ± 0.33 ms 0.984 ± 0.029
array/dagger/N=1024 (block 128)/transpose (permutedims) 13.9 ± 0.8 ms 14.4 ± 0.88 ms 0.963 ± 0.081
array/dagger/N=1024 (block 512)/add (X + X) 2.63 ± 1.7 ms 2.34 ± 0.59 ms 1.12 ± 0.79
array/dagger/N=1024 (block 512)/alloc (rand) 1.97 ± 0.32 ms 2.05 ± 0.16 ms 0.963 ± 0.18
array/dagger/N=1024 (block 512)/broadcast (X .+ 1) 2.6 ± 0.62 ms 1.91 ± 0.13 ms 1.36 ± 0.34
array/dagger/N=1024 (block 512)/map (sin.(X)) 6.63 ± 0.8 ms 6.62 ± 0.47 ms 1 ± 0.14
array/dagger/N=1024 (block 512)/norm 1.07 ± 0.037 ms 1.1 ± 0.051 ms 0.971 ± 0.056
array/dagger/N=1024 (block 512)/reduce (sum) 2.45 ± 1.8 ms 2.05 ± 0.11 ms 1.19 ± 0.86
array/dagger/N=1024 (block 512)/transpose (permutedims) 4.62 ± 1.8 ms 4.97 ± 0.25 ms 0.929 ± 0.36
array/dagger/N=256 (block 128)/add (X + X) 3.77 ± 1.3 ms 4.33 ± 1.6 ms 0.871 ± 0.43
array/dagger/N=256 (block 128)/alloc (rand) 1.36 ± 0.88 ms 1.56 ± 0.74 ms 0.874 ± 0.7
array/dagger/N=256 (block 128)/broadcast (X .+ 1) 1.87 ± 1.3 ms 1.69 ± 2.7 ms 1.1 ± 1.9
array/dagger/N=256 (block 128)/map (sin.(X)) 4.02 ± 2.2 ms 1.29 ± 0.67 ms 3.12 ± 2.4
array/dagger/N=256 (block 128)/norm 2.96 ± 2.2 ms 0.973 ± 0.15 ms 3.04 ± 2.3
array/dagger/N=256 (block 128)/reduce (sum) 3.85 ± 1.7 ms 2.54 ± 2 ms 1.51 ± 1.4
array/dagger/N=256 (block 128)/transpose (permutedims) 1.49 ± 2.7 ms 1.72 ± 0.16 ms 0.862 ± 1.5
array/dagger/N=256 (block 256)/add (X + X) 0.789 ± 0.027 ms 0.886 ± 0.038 ms 0.891 ± 0.048
array/dagger/N=256 (block 256)/alloc (rand) 0.729 ± 0.14 ms 0.733 ± 0.047 ms 0.995 ± 0.2
array/dagger/N=256 (block 256)/broadcast (X .+ 1) 0.405 ± 0.16 ms 0.605 ± 0.099 ms 0.67 ± 0.28
array/dagger/N=256 (block 256)/map (sin.(X)) 1.11 ± 0.13 ms 1.07 ± 0.028 ms 1.04 ± 0.12
array/dagger/N=256 (block 256)/norm 0.417 ± 0.057 ms 0.415 ± 0.042 ms 1 ± 0.17
array/dagger/N=256 (block 256)/reduce (sum) 0.644 ± 0.032 ms 0.623 ± 0.012 ms 1.03 ± 0.055
array/dagger/N=256 (block 256)/transpose (permutedims) 0.767 ± 0.044 ms 0.768 ± 0.013 ms 0.999 ± 0.06
linalg/dagger/N=1024 (block 128)/cholesky 0.0625 ± 0.006 s 0.0648 ± 0.013 s 0.965 ± 0.21
linalg/dagger/N=1024 (block 128)/lu 0.13 ± 0.018 s 0.124 ± 0.0046 s 1.05 ± 0.15
linalg/dagger/N=1024 (block 128)/matmul (A*A) 0.19 ± 0.072 s 0.114 ± 0.0073 s 1.66 ± 0.64
linalg/dagger/N=1024 (block 128)/matvec (A*x) 12.3 ± 3.2 ms 15.5 ± 2.3 ms 0.79 ± 0.23
linalg/dagger/N=1024 (block 128)/qr 0.137 ± 0.028 s 0.145 ± 0.01 s 0.942 ± 0.2
linalg/dagger/N=1024 (block 128)/solve (A\b via lu) 0.194 ± 0.019 s 0.197 ± 0.026 s 0.983 ± 0.16
linalg/dagger/N=1024 (block 128)/svd 26.1 s 28.7 s 0.909
linalg/dagger/N=1024 (block 128)/syrk (A'*A) 0.082 ± 0.0029 s 0.1 ± 0.017 s 0.816 ± 0.14
linalg/dagger/N=1024 (block 512)/cholesky 20.1 ± 4 ms 23.6 ± 6 ms 0.854 ± 0.27
linalg/dagger/N=1024 (block 512)/lu 0.0451 ± 0.002 s 0.0499 ± 0.008 s 0.903 ± 0.15
linalg/dagger/N=1024 (block 512)/matmul (A*A) 0.0479 ± 0.0031 s 0.0555 ± 0.01 s 0.863 ± 0.16
linalg/dagger/N=1024 (block 512)/matvec (A*x) 2.35 ± 1.2 ms 3.33 ± 0.23 ms 0.704 ± 0.36
linalg/dagger/N=1024 (block 512)/qr 0.11 ± 0.00098 s 0.113 ± 0.0074 s 0.976 ± 0.065
linalg/dagger/N=1024 (block 512)/solve (A\b via lu) 0.0565 ± 0.003 s 0.0507 ± 0.0042 s 1.11 ± 0.11
linalg/dagger/N=1024 (block 512)/svd 0.0408 h 0.0397 h 1.03
linalg/dagger/N=1024 (block 512)/syrk (A'*A) 0.038 ± 0.00052 s 0.0402 ± 0.003 s 0.946 ± 0.071
linalg/dagger/N=256 (block 128)/cholesky 5.77 ± 2.9 ms 7.9 ± 3.1 ms 0.73 ± 0.47
linalg/dagger/N=256 (block 128)/lu 9.9 ± 2.1 ms 11.1 ± 1 ms 0.892 ± 0.21
linalg/dagger/N=256 (block 128)/matmul (A*A) 3.11 ± 0.59 ms 5.76 ± 1.7 ms 0.54 ± 0.19
linalg/dagger/N=256 (block 128)/matvec (A*x) 3.24 ± 0.62 ms 2.15 ± 0.12 ms 1.51 ± 0.3
linalg/dagger/N=256 (block 128)/qr 8.49 ± 1.7 ms 8.85 ± 1.7 ms 0.959 ± 0.26
linalg/dagger/N=256 (block 128)/solve (A\b via lu) 31.5 ± 13 ms 29.4 ± 9.2 ms 1.07 ± 0.57
linalg/dagger/N=256 (block 128)/svd 0.764 ± 0.03 s 0.388 ± 0.02 s 1.97 ± 0.13
linalg/dagger/N=256 (block 128)/syrk (A'*A) 7.97 ± 4.5 ms 4.06 ± 0.5 ms 1.96 ± 1.1
linalg/dagger/N=256 (block 256)/cholesky 2.07 ± 1.8 ms 3 ± 0.97 ms 0.691 ± 0.63
linalg/dagger/N=256 (block 256)/lu 4.11 ± 0.056 ms 3.36 ± 0.49 ms 1.23 ± 0.18
linalg/dagger/N=256 (block 256)/matmul (A*A) 1.85 ± 0.46 ms 1.99 ± 0.057 ms 0.93 ± 0.23
linalg/dagger/N=256 (block 256)/matvec (A*x) 0.993 ± 0.0029 ms 2.07 ± 4.4 ms 0.479 ± 1
linalg/dagger/N=256 (block 256)/qr 6.21 ± 2.3 ms 4.48 ± 0.06 ms 1.39 ± 0.51
linalg/dagger/N=256 (block 256)/solve (A\b via lu) 10.7 ± 2.4 ms 10.9 ± 3.6 ms 0.989 ± 0.4
linalg/dagger/N=256 (block 256)/svd 0.635 ± 0.00037 s 0.375 ± 0.0073 s 1.69 ± 0.033
linalg/dagger/N=256 (block 256)/syrk (A'*A) 2.59 ± 2 ms 3.84 ± 0.7 ms 0.674 ± 0.53
sparse/dagger/N=1024 (block 64)/cg solve (laplacian) 0.805 ± 0.015 s 0.794 ± 0.02 s 1.01 ± 0.032
sparse/dagger/N=1024 (block 64)/spgemm (S*S) 0.469 ± 0.0075 s 0.459 ± 0.012 s 1.02 ± 0.031
sparse/dagger/N=1024 (block 64)/spmv (S*x) 0.0476 ± 0.0099 s 0.0457 ± 0.0049 s 1.04 ± 0.24
sparse/dagger/N=256 (block 16)/cg solve (laplacian) 0.793 ± 0.004 s 0.846 ± 0.027 s 0.937 ± 0.03
sparse/dagger/N=256 (block 16)/spgemm (S*S) 0.488 ± 0.007 s 0.456 ± 0.01 s 1.07 ± 0.028
sparse/dagger/N=256 (block 16)/spmv (S*x) 0.0481 ± 0.0063 s 0.0477 ± 0.0009 s 1.01 ± 0.13
stencil/dagger/N=1024 (block 128)/alloc (neighbors Wrap) 17.7 ± 1.8 ms 16.7 ± 1.2 ms 1.06 ± 0.13
stencil/dagger/N=1024 (block 128)/assign (const) 6.22 ± 3.7 ms 5.94 ± 1 ms 1.05 ± 0.65
stencil/dagger/N=1024 (block 128)/multi-expr 10.9 ± 0.047 ms 12.6 ± 1.3 ms 0.867 ± 0.088
stencil/dagger/N=1024 (block 128)/neighbors (Clamp) 12.7 ± 1.6 ms 12.2 ± 0.93 ms 1.04 ± 0.16
stencil/dagger/N=1024 (block 128)/neighbors (Pad) 11.3 ± 0.22 ms 12.7 ± 1.8 ms 0.894 ± 0.13
stencil/dagger/N=1024 (block 128)/neighbors (Reflect) 12.7 ± 0.45 ms 12.1 ± 0.87 ms 1.05 ± 0.083
stencil/dagger/N=1024 (block 128)/neighbors (Wrap) 12.8 ± 3.2 ms 12.3 ± 1.7 ms 1.04 ± 0.29
stencil/dagger/N=1024 (block 128)/update (+) 6.78 ± 0.55 ms 7.04 ± 0.18 ms 0.962 ± 0.082
stencil/dagger/N=1024 (block 512)/alloc (neighbors Wrap) 6.69 ± 0.98 ms 6.6 ± 0.35 ms 1.01 ± 0.16
stencil/dagger/N=1024 (block 512)/assign (const) 1.06 ± 0.5 ms 1.96 ± 2 ms 0.542 ± 0.61
stencil/dagger/N=1024 (block 512)/multi-expr 2.65 ± 1.5 ms 1.97 ± 3.3 ms 1.35 ± 2.4
stencil/dagger/N=1024 (block 512)/neighbors (Clamp) 6.4 ± 1 ms 6.23 ± 0.43 ms 1.03 ± 0.18
stencil/dagger/N=1024 (block 512)/neighbors (Pad) 6.06 ± 1.2 ms 6.32 ± 0.57 ms 0.958 ± 0.21
stencil/dagger/N=1024 (block 512)/neighbors (Reflect) 6.35 ± 0.43 ms 6.48 ± 1.4 ms 0.98 ± 0.22
stencil/dagger/N=1024 (block 512)/neighbors (Wrap) 6.56 ± 0.75 ms 5.82 ± 0.58 ms 1.13 ± 0.17
stencil/dagger/N=1024 (block 512)/update (+) 1.29 ± 0.51 ms 1.29 ± 0.62 ms 1.01 ± 0.62
stencil/dagger/N=256 (block 128)/alloc (neighbors Wrap) 3.18 ± 1.9 ms 2.38 ± 0.15 ms 1.34 ± 0.81
stencil/dagger/N=256 (block 128)/assign (const) 1 ± 0.49 ms 1.01 ± 0.13 ms 0.99 ± 0.5
stencil/dagger/N=256 (block 128)/multi-expr 2.64 ± 2.2 ms 2.73 ± 1.3 ms 0.968 ± 0.94
stencil/dagger/N=256 (block 128)/neighbors (Clamp) 3.06 ± 1.7 ms 4.23 ± 2.9 ms 0.723 ± 0.63
stencil/dagger/N=256 (block 128)/neighbors (Pad) 1.68 ± 0.47 ms 2.01 ± 1.9 ms 0.837 ± 0.82
stencil/dagger/N=256 (block 128)/neighbors (Reflect) 1.51 ± 0.87 ms 3.43 ± 1.4 ms 0.441 ± 0.31
stencil/dagger/N=256 (block 128)/neighbors (Wrap) 1.66 ± 0.88 ms 3.24 ± 2.3 ms 0.512 ± 0.46
stencil/dagger/N=256 (block 128)/update (+) 0.957 ± 0.56 ms 1.91 ± 0.55 ms 0.5 ± 0.33
stencil/dagger/N=256 (block 256)/alloc (neighbors Wrap) 1.68 ± 1.7 ms 1.55 ± 0.11 ms 1.08 ± 1.1
stencil/dagger/N=256 (block 256)/assign (const) 0.526 ± 0.048 ms 0.543 ± 0.034 ms 0.969 ± 0.11
stencil/dagger/N=256 (block 256)/multi-expr 0.915 ± 0.14 ms 3.99 ± 0.94 ms 0.229 ± 0.064
stencil/dagger/N=256 (block 256)/neighbors (Clamp) 1.61 ± 0.29 ms 1.45 ± 0.36 ms 1.11 ± 0.34
stencil/dagger/N=256 (block 256)/neighbors (Pad) 1.38 ± 0.053 ms 1.46 ± 0.14 ms 0.944 ± 0.099
stencil/dagger/N=256 (block 256)/neighbors (Reflect) 3.47 ± 2.2 ms 1.46 ± 0.25 ms 2.39 ± 1.6
stencil/dagger/N=256 (block 256)/neighbors (Wrap) 1.65 ± 0.25 ms 1.53 ± 0.093 ms 1.08 ± 0.17
stencil/dagger/N=256 (block 256)/update (+) 0.572 ± 0.044 ms 0.804 ± 0.31 ms 0.711 ± 0.28
time_to_load 1.1 ± 0.006 s 1.11 ± 0.0091 s 0.996 ± 0.0098

Allocations / memory

master dirty master / dirty
array/dagger/N=1024 (block 128)/add (X + X) 0.0792 M allocs: 11 MB 0.0805 M allocs: 11 MB 0.995
array/dagger/N=1024 (block 128)/alloc (rand) 0.043 M allocs: 9.44 MB 0.0429 M allocs: 9.43 MB 1
array/dagger/N=1024 (block 128)/broadcast (X .+ 1) 0.0381 M allocs: 9.29 MB 0.0377 M allocs: 9.28 MB 1
array/dagger/N=1024 (block 128)/map (sin.(X)) 0.0329 M allocs: 9.1 MB 0.0327 M allocs: 9.1 MB 1
array/dagger/N=1024 (block 128)/norm 0.0422 M allocs: 1.4 MB 0.0419 M allocs: 1.39 MB 1.01
array/dagger/N=1024 (block 128)/reduce (sum) 0.0836 M allocs: 2.84 MB 0.0846 M allocs: 2.89 MB 0.984
array/dagger/N=1024 (block 128)/transpose (permutedims) 0.0441 M allocs: 9.7 MB 0.0453 M allocs: 9.75 MB 0.995
array/dagger/N=1024 (block 512)/add (X + X) 5.59 k allocs: 8.22 MB 5.68 k allocs: 8.22 MB 1
array/dagger/N=1024 (block 512)/alloc (rand) 2.73 k allocs: 8.09 MB 2.74 k allocs: 8.09 MB 1
array/dagger/N=1024 (block 512)/broadcast (X .+ 1) 2.41 k allocs: 8.08 MB 2.39 k allocs: 8.08 MB 1
array/dagger/N=1024 (block 512)/map (sin.(X)) 2.1 k allocs: 8.07 MB 2.1 k allocs: 8.07 MB 1
array/dagger/N=1024 (block 512)/norm 2.68 k allocs: 0.0892 MB 2.66 k allocs: 0.0885 MB 1.01
array/dagger/N=1024 (block 512)/reduce (sum) 3.6 k allocs: 0.123 MB 3.64 k allocs: 0.124 MB 0.988
array/dagger/N=1024 (block 512)/transpose (permutedims) 3.31 k allocs: 8.14 MB 3.42 k allocs: 8.14 MB 1
array/dagger/N=256 (block 128)/add (X + X) 5.59 k allocs: 0.717 MB 5.73 k allocs: 0.722 MB 0.994
array/dagger/N=256 (block 128)/alloc (rand) 2.74 k allocs: 0.592 MB 2.76 k allocs: 0.593 MB 0.999
array/dagger/N=256 (block 128)/broadcast (X .+ 1) 2.43 k allocs: 0.583 MB 2.37 k allocs: 0.581 MB 1
array/dagger/N=256 (block 128)/map (sin.(X)) 2.09 k allocs: 0.57 MB 2.1 k allocs: 0.571 MB 1
array/dagger/N=256 (block 128)/norm 2.69 k allocs: 0.0897 MB 2.66 k allocs: 0.0888 MB 1.01
array/dagger/N=256 (block 128)/reduce (sum) 4.54 k allocs: 0.156 MB 4.51 k allocs: 0.155 MB 1.01
array/dagger/N=256 (block 128)/transpose (permutedims) 3.37 k allocs: 0.637 MB 3.44 k allocs: 0.64 MB 0.996
array/dagger/N=256 (block 256)/add (X + X) 1.73 k allocs: 0.575 MB 1.8 k allocs: 0.577 MB 0.996
array/dagger/N=256 (block 256)/alloc (rand) 0.754 k allocs: 0.526 MB 0.754 k allocs: 0.526 MB 1
array/dagger/N=256 (block 256)/broadcast (X .+ 1) 0.65 k allocs: 0.522 MB 0.65 k allocs: 0.522 MB 1
array/dagger/N=256 (block 256)/map (sin.(X)) 0.573 k allocs: 0.52 MB 0.573 k allocs: 0.52 MB 1
array/dagger/N=256 (block 256)/norm 0.713 k allocs: 24.5 kB 0.713 k allocs: 24.5 kB 1
array/dagger/N=256 (block 256)/reduce (sum) 0.814 k allocs: 30.4 kB 0.814 k allocs: 30.4 kB 1
array/dagger/N=256 (block 256)/transpose (permutedims) 1.11 k allocs: 0.551 MB 1.17 k allocs: 0.554 MB 0.996
linalg/dagger/N=1024 (block 128)/cholesky 0.115 M allocs: 15.6 MB 0.129 M allocs: 16.1 MB 0.97
linalg/dagger/N=1024 (block 128)/lu 0.312 M allocs: 23.5 MB 0.316 M allocs: 23.8 MB 0.99
linalg/dagger/N=1024 (block 128)/matmul (A*A) 0.238 M allocs: 15.9 MB 0.239 M allocs: 15.9 MB 1
linalg/dagger/N=1024 (block 128)/matvec (A*x) 0.0672 M allocs: 2.5 MB 0.0719 M allocs: 2.65 MB 0.941
linalg/dagger/N=1024 (block 128)/qr 0.248 M allocs: 25.3 MB 0.248 M allocs: 25.3 MB 1
linalg/dagger/N=1024 (block 128)/solve (A\b via lu) 0.429 M allocs: 28 MB 0.435 M allocs: 28.2 MB 0.99
linalg/dagger/N=1024 (block 128)/svd 4.14 M allocs: 2.34 GB 3.19 M allocs: 2.29 GB 1.02
linalg/dagger/N=1024 (block 128)/syrk (A'*A) 0.174 M allocs: 17.1 MB 0.174 M allocs: 17.1 MB 1
linalg/dagger/N=1024 (block 512)/cholesky 7.84 k allocs: 10.3 MB 8.05 k allocs: 10.3 MB 0.999
linalg/dagger/N=1024 (block 512)/lu 15.6 k allocs: 14.6 MB 15.9 k allocs: 14.7 MB 0.999
linalg/dagger/N=1024 (block 512)/matmul (A*A) 7.75 k allocs: 8.29 MB 7.85 k allocs: 8.29 MB 1
linalg/dagger/N=1024 (block 512)/matvec (A*x) 6.3 k allocs: 0.254 MB 6.48 k allocs: 0.256 MB 0.99
linalg/dagger/N=1024 (block 512)/qr 11.7 k allocs: 9.6 MB 12.2 k allocs: 9.62 MB 0.998
linalg/dagger/N=1024 (block 512)/solve (A\b via lu) 30.2 k allocs: 15.2 MB 30.8 k allocs: 15.3 MB 0.999
linalg/dagger/N=1024 (block 512)/svd 0.0505 M allocs: 0.198 GB 0.0512 M allocs: 0.198 GB 1
linalg/dagger/N=1024 (block 512)/syrk (A'*A) 9.1 k allocs: 20.4 MB 9.31 k allocs: 20.4 MB 1
linalg/dagger/N=256 (block 128)/cholesky 7.9 k allocs: 0.938 MB 8.04 k allocs: 0.944 MB 0.994
linalg/dagger/N=256 (block 128)/lu 16.3 k allocs: 1.52 MB 16 k allocs: 1.51 MB 1.01
linalg/dagger/N=256 (block 128)/matmul (A*A) 7.74 k allocs: 0.786 MB 7.89 k allocs: 0.791 MB 0.994
linalg/dagger/N=256 (block 128)/matvec (A*x) 6.51 k allocs: 0.253 MB 6.52 k allocs: 0.252 MB 1
linalg/dagger/N=256 (block 128)/qr 11.3 k allocs: 1.23 MB 12.1 k allocs: 1.26 MB 0.979
linalg/dagger/N=256 (block 128)/solve (A\b via lu) 29.9 k allocs: 2.07 MB 30.7 k allocs: 2.1 MB 0.986
linalg/dagger/N=256 (block 128)/svd 0.049 M allocs: 14.6 MB 0.0505 M allocs: 14.7 MB 0.997
linalg/dagger/N=256 (block 128)/syrk (A'*A) 9.19 k allocs: 1.61 MB 9.38 k allocs: 1.62 MB 0.996
linalg/dagger/N=256 (block 256)/cholesky 3.04 k allocs: 0.634 MB 3.17 k allocs: 0.639 MB 0.992
linalg/dagger/N=256 (block 256)/lu 5.42 k allocs: 1.24 MB 5.61 k allocs: 1.25 MB 0.994
linalg/dagger/N=256 (block 256)/matmul (A*A) 1.95 k allocs: 0.582 MB 2.01 k allocs: 0.585 MB 0.996
linalg/dagger/N=256 (block 256)/matvec (A*x) 2.45 k allocs: 0.104 MB 2.44 k allocs: 0.103 MB 1.01
linalg/dagger/N=256 (block 256)/qr 3.47 k allocs: 0.78 MB 3.58 k allocs: 0.785 MB 0.994
linalg/dagger/N=256 (block 256)/solve (A\b via lu) 12 k allocs: 1.53 MB 12.4 k allocs: 1.55 MB 0.989
linalg/dagger/N=256 (block 256)/svd 15.6 k allocs: 6.72 MB 16.2 k allocs: 6.74 MB 0.997
linalg/dagger/N=256 (block 256)/syrk (A'*A) 3.08 k allocs: 2.14 MB 3.19 k allocs: 2.14 MB 0.998
sparse/dagger/N=1024 (block 64)/cg solve (laplacian) 2.95 M allocs: 0.109 GB 3.13 M allocs: 0.115 GB 0.947
sparse/dagger/N=1024 (block 64)/spgemm (S*S) 3.91 M allocs: 0.175 GB 3.9 M allocs: 0.174 GB 1
sparse/dagger/N=1024 (block 64)/spmv (S*x) 0.181 M allocs: 6.86 MB 0.193 M allocs: 7.29 MB 0.941
sparse/dagger/N=256 (block 16)/cg solve (laplacian) 3 M allocs: 0.111 GB 3.19 M allocs: 0.117 GB 0.944
sparse/dagger/N=256 (block 16)/spgemm (S*S) 4 M allocs: 0.141 GB 3.86 M allocs: 0.137 GB 1.03
sparse/dagger/N=256 (block 16)/spmv (S*x) 0.191 M allocs: 7.24 MB 0.211 M allocs: 7.92 MB 0.914
stencil/dagger/N=1024 (block 128)/alloc (neighbors Wrap) 0.0659 M allocs: 10.8 MB 0.0671 M allocs: 10.8 MB 0.997
stencil/dagger/N=1024 (block 128)/assign (const) 24.9 k allocs: 1.02 MB 26.1 k allocs: 1.07 MB 0.958
stencil/dagger/N=1024 (block 128)/multi-expr 0.0579 M allocs: 2.59 MB 0.0608 M allocs: 2.55 MB 1.01
stencil/dagger/N=1024 (block 128)/neighbors (Clamp) 0.0487 M allocs: 2.39 MB 0.0503 M allocs: 2.56 MB 0.932
stencil/dagger/N=1024 (block 128)/neighbors (Pad) 0.0482 M allocs: 2.38 MB 0.0498 M allocs: 2.43 MB 0.979
stencil/dagger/N=1024 (block 128)/neighbors (Reflect) 0.0485 M allocs: 2.54 MB 0.0501 M allocs: 2.48 MB 1.03
stencil/dagger/N=1024 (block 128)/neighbors (Wrap) 0.0477 M allocs: 2.19 MB 0.0494 M allocs: 2.23 MB 0.982
stencil/dagger/N=1024 (block 128)/update (+) 0.0328 M allocs: 1.42 MB 0.0344 M allocs: 1.48 MB 0.96
stencil/dagger/N=1024 (block 512)/alloc (neighbors Wrap) 4.87 k allocs: 8.21 MB 5.01 k allocs: 8.21 MB 0.999
stencil/dagger/N=1024 (block 512)/assign (const) 2.19 k allocs: 0.0956 MB 2.25 k allocs: 0.0979 MB 0.977
stencil/dagger/N=1024 (block 512)/multi-expr 4.8 k allocs: 0.211 MB 5 k allocs: 0.218 MB 0.968
stencil/dagger/N=1024 (block 512)/neighbors (Clamp) 3.85 k allocs: 0.234 MB 3.99 k allocs: 0.238 MB 0.982
stencil/dagger/N=1024 (block 512)/neighbors (Pad) 3.69 k allocs: 0.228 MB 3.87 k allocs: 0.234 MB 0.973
stencil/dagger/N=1024 (block 512)/neighbors (Reflect) 3.85 k allocs: 0.265 MB 3.99 k allocs: 0.27 MB 0.981
stencil/dagger/N=1024 (block 512)/neighbors (Wrap) 3.81 k allocs: 2.18 MB 3.84 k allocs: 0.176 MB 12.3
stencil/dagger/N=1024 (block 512)/update (+) 2.58 k allocs: 0.115 MB 2.77 k allocs: 0.121 MB 0.948
stencil/dagger/N=256 (block 128)/alloc (neighbors Wrap) 4.92 k allocs: 0.711 MB 5.04 k allocs: 0.714 MB 0.995
stencil/dagger/N=256 (block 128)/assign (const) 2.18 k allocs: 0.0951 MB 2.25 k allocs: 0.0978 MB 0.973
stencil/dagger/N=256 (block 128)/multi-expr 4.81 k allocs: 0.212 MB 5.03 k allocs: 0.219 MB 0.97
stencil/dagger/N=256 (block 128)/neighbors (Clamp) 3.87 k allocs: 0.188 MB 4 k allocs: 0.192 MB 0.981
stencil/dagger/N=256 (block 128)/neighbors (Pad) 3.7 k allocs: 0.182 MB 3.84 k allocs: 0.188 MB 0.973
stencil/dagger/N=256 (block 128)/neighbors (Reflect) 3.88 k allocs: 0.322 MB 3.95 k allocs: 0.199 MB 1.61
stencil/dagger/N=256 (block 128)/neighbors (Wrap) 3.77 k allocs: 0.299 MB 3.86 k allocs: 0.177 MB 1.69
stencil/dagger/N=256 (block 128)/update (+) 2.67 k allocs: 0.242 MB 2.77 k allocs: 0.121 MB 2
stencil/dagger/N=256 (block 256)/alloc (neighbors Wrap) 1.58 k allocs: 0.576 MB 1.66 k allocs: 0.579 MB 0.994
stencil/dagger/N=256 (block 256)/assign (const) 0.818 k allocs: 0.0414 MB 0.871 k allocs: 0.0434 MB 0.954
stencil/dagger/N=256 (block 256)/multi-expr 1.75 k allocs: 0.088 MB 1.87 k allocs: 0.0929 MB 0.947
stencil/dagger/N=256 (block 256)/neighbors (Clamp) 1.28 k allocs: 0.0725 MB 1.34 k allocs: 0.075 MB 0.967
stencil/dagger/N=256 (block 256)/neighbors (Pad) 1.22 k allocs: 0.0708 MB 1.29 k allocs: 0.0735 MB 0.963
stencil/dagger/N=256 (block 256)/neighbors (Reflect) 1.28 k allocs: 0.0804 MB 1.34 k allocs: 0.0832 MB 0.967
stencil/dagger/N=256 (block 256)/neighbors (Wrap) 1.22 k allocs: 0.0642 MB 1.29 k allocs: 0.067 MB 0.959
stencil/dagger/N=256 (block 256)/update (+) 0.944 k allocs: 0.047 MB 0.985 k allocs: 0.0488 MB 0.964
time_to_load 0.147 k allocs: 10.8 kB 0.147 k allocs: 10.8 kB 1

Plots

⚠️ Regressions (time > 25.0% and outside the reported ±spread; allocs/memory > 25.0%)

  • stencil/dagger/N=256 (block 256)/multi-expr (time): +336.2%
  • linalg/dagger/N=256 (block 128)/matmul (A*A) (time): +85.2%

Improvements

  • stencil/dagger/N=1024 (block 512)/neighbors (Wrap) (memory): -91.9%
  • stencil/dagger/N=256 (block 128)/update (+) (memory): -50.0%
  • linalg/dagger/N=256 (block 128)/svd (time): -49.3%
  • stencil/dagger/N=256 (block 128)/neighbors (Wrap) (memory): -41.0%
  • linalg/dagger/N=256 (block 256)/svd (time): -40.9%
  • stencil/dagger/N=256 (block 128)/neighbors (Reflect) (memory): -38.0%
  • linalg/dagger/N=256 (block 128)/matvec (A*x) (time): -33.8%
Within noise (23 metric(s) past threshold but inside the ±spread; not counted)
  • stencil/dagger/N=256 (block 128)/neighbors (Reflect) (time): 126.9%
  • linalg/dagger/N=256 (block 256)/matvec (A*x) (time): 108.9%
  • stencil/dagger/N=256 (block 128)/update (+) (time): 99.9%
  • stencil/dagger/N=256 (block 128)/neighbors (Wrap) (time): 95.5%
  • stencil/dagger/N=1024 (block 512)/assign (const) (time): 84.5%
  • array/dagger/N=256 (block 256)/broadcast (X .+ 1) (time): 49.3%
  • linalg/dagger/N=256 (block 256)/syrk (A'*A) (time): 48.5%
  • linalg/dagger/N=256 (block 256)/cholesky (time): 44.6%
  • linalg/dagger/N=1024 (block 512)/matvec (A*x) (time): 42.0%
  • stencil/dagger/N=256 (block 256)/update (+) (time): 40.6%
  • stencil/dagger/N=256 (block 128)/neighbors (Clamp) (time): 38.3%
  • linalg/dagger/N=256 (block 128)/cholesky (time): 37.0%
  • linalg/dagger/N=1024 (block 128)/matvec (A*x) (time): 26.5%
  • stencil/dagger/N=256 (block 128)/alloc (neighbors Wrap) (time): -25.2%
  • stencil/dagger/N=1024 (block 512)/multi-expr (time): -25.7%
  • array/dagger/N=1024 (block 512)/broadcast (X .+ 1) (time): -26.5%
  • linalg/dagger/N=256 (block 256)/qr (time): -27.8%
  • array/dagger/N=256 (block 128)/reduce (sum) (time): -34.0%
  • linalg/dagger/N=1024 (block 128)/matmul (A*A) (time): -39.9%
  • linalg/dagger/N=256 (block 128)/syrk (A'*A) (time): -49.1%
  • stencil/dagger/N=256 (block 256)/neighbors (Reflect) (time): -58.1%
  • array/dagger/N=256 (block 128)/norm (time): -67.1%
  • array/dagger/N=256 (block 128)/map (sin.(X)) (time): -67.9%
Distributed benchmarks (4 processes)

Dagger benchmarks: dirty vs master

Summary by job

Job Regressions Improvements Within noise
stencil/dagger ⚠️ 6 5 0
array/dagger ⚠️ 2 4 2
linalg/dagger 0 14 1
sparse/dagger 0 11 0

Median time

master dirty master / dirty
array/dagger/N=1024 (block 128)/add (X + X) 0.855 ± 0.69 s 0.134 ± 0.015 s 6.39 ± 5.2
array/dagger/N=1024 (block 128)/alloc (rand) 24.5 ± 1.3 ms 23.2 ± 1 ms 1.06 ± 0.072
array/dagger/N=1024 (block 128)/broadcast (X .+ 1) 0.0356 ± 0.0011 s 0.0344 ± 0.0017 s 1.04 ± 0.06
array/dagger/N=1024 (block 128)/map (sin.(X)) 0.042 ± 0.002 s 0.04 ± 0.0027 s 1.05 ± 0.086
array/dagger/N=1024 (block 128)/norm 27.9 ± 1.1 ms 21.7 ± 0.98 ms 1.29 ± 0.078
array/dagger/N=1024 (block 128)/reduce (sum) 0.0507 ± 0.0053 s 0.0521 ± 0.0022 s 0.974 ± 0.11
array/dagger/N=1024 (block 128)/transpose (permutedims) 0.0409 ± 0.00075 s 26.7 ± 1.3 ms 1.53 ± 0.082
array/dagger/N=1024 (block 512)/add (X + X) 18.2 ± 1.3 ms 14.1 ± 1.6 ms 1.29 ± 0.17
array/dagger/N=1024 (block 512)/alloc (rand) 3.71 ± 0.11 ms 3.54 ± 0.4 ms 1.05 ± 0.12
array/dagger/N=1024 (block 512)/broadcast (X .+ 1) 4.95 ± 0.24 ms 4.2 ± 0.32 ms 1.18 ± 0.11
array/dagger/N=1024 (block 512)/map (sin.(X)) 9.18 ± 1.1 ms 6.93 ± 0.11 ms 1.32 ± 0.16
array/dagger/N=1024 (block 512)/norm 2.42 ± 0.3 ms 2.66 ± 0.29 ms 0.908 ± 0.15
array/dagger/N=1024 (block 512)/reduce (sum) 0.0356 ± 0.042 s 3.57 ± 0.29 ms 9.98 ± 12
array/dagger/N=1024 (block 512)/transpose (permutedims) 7.32 ± 58 ms 9.97 ± 53 ms 0.735 ± 7
array/dagger/N=256 (block 128)/add (X + X) 2.01 ± 0.24 ms 1.71 ± 0.17 ms 1.17 ± 0.18
array/dagger/N=256 (block 128)/alloc (rand) 1.62 ± 0.045 ms 1.57 ± 0.052 ms 1.03 ± 0.044
array/dagger/N=256 (block 128)/broadcast (X .+ 1) 3.17 ± 0.48 ms 2.7 ± 0.28 ms 1.18 ± 0.22
array/dagger/N=256 (block 128)/map (sin.(X)) 1.66 ± 0.64 ms 1.79 ± 0.41 ms 0.928 ± 0.41
array/dagger/N=256 (block 128)/norm 0.946 ± 1 ms 0.831 ± 0.81 ms 1.14 ± 1.6
array/dagger/N=256 (block 128)/reduce (sum) 5.44 ± 39 ms 5.5 ± 39 ms 0.989 ± 9.9
array/dagger/N=256 (block 128)/transpose (permutedims) 1.22 ± 0.06 ms 1.25 ± 0.029 ms 0.981 ± 0.053
array/dagger/N=256 (block 256)/add (X + X) 0.968 ± 0.043 ms 0.954 ± 0.085 ms 1.01 ± 0.1
array/dagger/N=256 (block 256)/alloc (rand) 0.958 ± 0.048 ms 0.92 ± 0.016 ms 1.04 ± 0.055
array/dagger/N=256 (block 256)/broadcast (X .+ 1) 0.575 ± 0.089 ms 0.418 ± 0.04 ms 1.38 ± 0.25
array/dagger/N=256 (block 256)/map (sin.(X)) 0.999 ± 0.075 ms 0.948 ± 0.018 ms 1.05 ± 0.082
array/dagger/N=256 (block 256)/norm 0.42 ± 0.058 ms 0.44 ± 0.013 ms 0.956 ± 0.13
array/dagger/N=256 (block 256)/reduce (sum) 0.646 ± 0.028 ms 0.597 ± 0.062 ms 1.08 ± 0.12
array/dagger/N=256 (block 256)/transpose (permutedims) 0.767 ± 0.038 ms 0.794 ± 0.036 ms 0.966 ± 0.065
linalg/dagger/N=1024 (block 128)/cholesky 0.458 ± 0.028 s 0.364 ± 0.012 s 1.26 ± 0.086
linalg/dagger/N=1024 (block 128)/lu 0.905 ± 0.11 s 0.246 ± 0.089 s 3.68 ± 1.4
linalg/dagger/N=1024 (block 128)/matmul (A*A) 0.524 ± 0.036 s 0.259 ± 0.0058 s 2.02 ± 0.15
linalg/dagger/N=1024 (block 128)/matvec (A*x) 0.106 ± 0.0084 s 0.0934 ± 0.0034 s 1.14 ± 0.099
linalg/dagger/N=1024 (block 128)/qr 21 s 0.28 ± 0.014 s 74.9
linalg/dagger/N=1024 (block 128)/solve (A\b via lu) 0.654 ± 0.37 s 0.26 ± 0.0059 s 2.52 ± 1.4
linalg/dagger/N=1024 (block 128)/svd 0.017 h 58.3 s 1.05
linalg/dagger/N=1024 (block 128)/syrk (A'*A) 0.607 ± 0.15 s 0.501 ± 0.038 s 1.21 ± 0.32
linalg/dagger/N=1024 (block 512)/cholesky 0.232 ± 0.21 s 0.226 ± 0.21 s 1.03 ± 1.3
linalg/dagger/N=1024 (block 512)/lu 0.0375 ± 0.00072 s 0.0382 ± 0.001 s 0.983 ± 0.033
linalg/dagger/N=1024 (block 512)/matmul (A*A) 0.0399 ± 0.0027 s 0.0383 ± 0.0017 s 1.04 ± 0.085
linalg/dagger/N=1024 (block 512)/matvec (A*x) 8.11 ± 1.8 ms 6.9 ± 0.19 ms 1.18 ± 0.26
linalg/dagger/N=1024 (block 512)/qr 0.106 ± 0.002 s 0.11 ± 0.0013 s 0.97 ± 0.022
linalg/dagger/N=1024 (block 512)/solve (A\b via lu) 0.0521 ± 0.0028 s 0.0477 ± 0.00075 s 1.09 ± 0.061
linalg/dagger/N=1024 (block 512)/svd 0.0361 h 0.0366 h 0.985
linalg/dagger/N=1024 (block 512)/syrk (A'*A) 0.041 ± 0.0052 s 31.5 ± 0.51 ms 1.3 ± 0.17
linalg/dagger/N=256 (block 128)/cholesky 0.262 ± 0.23 s 31.2 ± 2e+02 ms 8.4 ± 53
linalg/dagger/N=256 (block 128)/lu 0.723 ± 0.0047 s 0.324 ± 0.31 s 2.23 ± 2.1
linalg/dagger/N=256 (block 128)/matmul (A*A) 5.89 ± 0.3 ms 5.26 ± 0.19 ms 1.12 ± 0.07
linalg/dagger/N=256 (block 128)/matvec (A*x) 1.99 ± 0.052 ms 1.91 ± 1.6 ms 1.04 ± 0.9
linalg/dagger/N=256 (block 128)/qr 8.32 ± 0.33 ms 7.4 ± 0.19 ms 1.12 ± 0.053
linalg/dagger/N=256 (block 128)/solve (A\b via lu) 0.53 ± 0.15 s 0.258 ± 0.096 s 2.05 ± 0.96
linalg/dagger/N=256 (block 128)/svd 0.683 ± 0.028 s 0.738 ± 0.048 s 0.926 ± 0.071
linalg/dagger/N=256 (block 128)/syrk (A'*A) 5.38 ± 0.2 ms 5.96 ± 0.57 ms 0.904 ± 0.093
linalg/dagger/N=256 (block 256)/cholesky 2.1 ± 0.11 ms 2.51 ± 0.27 ms 0.838 ± 0.1
linalg/dagger/N=256 (block 256)/lu 3.32 ± 0.072 ms 3.58 ± 0.19 ms 0.928 ± 0.053
linalg/dagger/N=256 (block 256)/matmul (A*A) 2.07 ± 0.079 ms 2.11 ± 0.2 ms 0.982 ± 0.098
linalg/dagger/N=256 (block 256)/matvec (A*x) 0.979 ± 0.053 ms 1.1 ± 0.022 ms 0.891 ± 0.051
linalg/dagger/N=256 (block 256)/qr 4.85 ± 0.25 ms 4.38 ± 0.05 ms 1.11 ± 0.058
linalg/dagger/N=256 (block 256)/solve (A\b via lu) 5.15 ± 0.21 ms 5.51 ± 0.21 ms 0.934 ± 0.053
linalg/dagger/N=256 (block 256)/svd 0.522 ± 0.007 s 0.486 ± 0.0053 s 1.07 ± 0.019
linalg/dagger/N=256 (block 256)/syrk (A'*A) 2.76 ± 0.13 ms 3.26 ± 0.12 ms 0.847 ± 0.052
sparse/dagger/N=1024 (block 64)/cg solve (laplacian) 10.8 s 3.92 ± 1.8 s 2.75
sparse/dagger/N=1024 (block 64)/spgemm (S*S) 6.5 s 5.41 s 1.2
sparse/dagger/N=1024 (block 64)/spmv (S*x) 0.552 ± 0.012 s 0.384 ± 0.0071 s 1.44 ± 0.041
sparse/dagger/N=256 (block 16)/cg solve (laplacian) 13.2 s 4.1 ± 2 s 3.22
sparse/dagger/N=256 (block 16)/spgemm (S*S) 7.16 s 4.99 s 1.44
sparse/dagger/N=256 (block 16)/spmv (S*x) 0.54 ± 0.011 s 0.393 ± 0.01 s 1.38 ± 0.046
stencil/dagger/N=1024 (block 128)/assign (const) 0.0337 ± 0.0073 s 0.035 ± 0.0036 s 0.965 ± 0.23
stencil/dagger/N=1024 (block 128)/multi-expr 0.206 ± 0.022 s 0.147 ± 0.0065 s 1.41 ± 0.16
stencil/dagger/N=1024 (block 128)/update (+) 0.181 ± 0.0049 s 0.103 ± 0.0037 s 1.75 ± 0.078
stencil/dagger/N=1024 (block 512)/assign (const) 1.55 ± 0.32 ms 4.34 ± 0.52 ms 0.357 ± 0.084
stencil/dagger/N=1024 (block 512)/multi-expr 0.0779 ± 0.048 s 0.0724 ± 0.021 s 1.08 ± 0.73
stencil/dagger/N=1024 (block 512)/update (+) 12.7 ± 0.41 ms 14.5 ± 0.55 ms 0.876 ± 0.044
stencil/dagger/N=256 (block 128)/assign (const) 1.08 ± 0.08 ms 0.97 ± 0.027 ms 1.12 ± 0.089
stencil/dagger/N=256 (block 128)/multi-expr 2.26 ± 0.042 ms 2.28 ± 0.17 ms 0.991 ± 0.078
stencil/dagger/N=256 (block 128)/neighbors (Clamp) 2.63 ± 0.14 ms 2.6 ± 0.18 ms 1.01 ± 0.087
stencil/dagger/N=256 (block 128)/neighbors (Reflect) 2.03 ± 0.011 ms 2.17 ± 0.059 ms 0.939 ± 0.026
stencil/dagger/N=256 (block 128)/update (+) 1.95 ± 0.19 ms 1.81 ± 0.072 ms 1.08 ± 0.11
stencil/dagger/N=256 (block 256)/assign (const) 0.641 ± 0.0094 ms 0.724 ± 0.037 ms 0.885 ± 0.047
stencil/dagger/N=256 (block 256)/multi-expr 1.46 ± 0.011 ms 1.42 ± 0.022 ms 1.03 ± 0.018
stencil/dagger/N=256 (block 256)/neighbors (Clamp) 1.86 ± 0.077 ms 1.57 ± 0.12 ms 1.19 ± 0.11
stencil/dagger/N=256 (block 256)/neighbors (Reflect) 1.9 ± 0.17 ms 1.83 ± 0.27 ms 1.04 ± 0.18
stencil/dagger/N=256 (block 256)/update (+) 1.05 ± 0.083 ms 1.13 ± 0.06 ms 0.932 ± 0.089
time_to_load 1.19 ± 0.013 s 1.22 ± 0.002 s 0.974 ± 0.011

Allocations / memory

master dirty master / dirty
array/dagger/N=1024 (block 128)/add (X + X) 0.273 M allocs: 23 MB 0.235 M allocs: 16.9 MB 1.36
array/dagger/N=1024 (block 128)/alloc (rand) 0.0529 M allocs: 6.73 MB 0.053 M allocs: 6.73 MB 1
array/dagger/N=1024 (block 128)/broadcast (X .+ 1) 0.0826 M allocs: 7.82 MB 0.0838 M allocs: 7.84 MB 0.997
array/dagger/N=1024 (block 128)/map (sin.(X)) 0.0831 M allocs: 7.2 MB 0.0826 M allocs: 7.06 MB 1.02
array/dagger/N=1024 (block 128)/norm 0.0608 M allocs: 2.42 MB 0.0557 M allocs: 2.09 MB 1.15
array/dagger/N=1024 (block 128)/reduce (sum) 0.0871 M allocs: 3.41 MB 0.0987 M allocs: 3.99 MB 0.854
array/dagger/N=1024 (block 128)/transpose (permutedims) 0.0771 M allocs: 7.83 MB 0.0695 M allocs: 8.16 MB 0.959
array/dagger/N=1024 (block 512)/add (X + X) 14.9 k allocs: 14.6 MB 11.1 k allocs: 12.5 MB 1.17
array/dagger/N=1024 (block 512)/alloc (rand) 3.94 k allocs: 2.18 MB 4 k allocs: 2.18 MB 1
array/dagger/N=1024 (block 512)/broadcast (X .+ 1) 4.03 k allocs: 2.22 MB 3.97 k allocs: 2.21 MB 1
array/dagger/N=1024 (block 512)/map (sin.(X)) 4.74 k allocs: 2.21 MB 4.85 k allocs: 2.23 MB 0.993
array/dagger/N=1024 (block 512)/norm 3.53 k allocs: 0.131 MB 4.15 k allocs: 0.166 MB 0.793
array/dagger/N=1024 (block 512)/reduce (sum) 6.61 k allocs: 0.276 MB 5.01 k allocs: 0.196 MB 1.41
array/dagger/N=1024 (block 512)/transpose (permutedims) 5.25 k allocs: 2.36 MB 6.32 k allocs: 4.28 MB 0.55
array/dagger/N=256 (block 128)/add (X + X) 6.13 k allocs: 0.74 MB 6.44 k allocs: 0.75 MB 0.986
array/dagger/N=256 (block 128)/alloc (rand) 2.83 k allocs: 0.595 MB 2.83 k allocs: 0.595 MB 1
array/dagger/N=256 (block 128)/broadcast (X .+ 1) 4.12 k allocs: 0.349 MB 4.57 k allocs: 0.341 MB 1.02
array/dagger/N=256 (block 128)/map (sin.(X)) 2.33 k allocs: 0.519 MB 2.39 k allocs: 0.559 MB 0.928
array/dagger/N=256 (block 128)/norm 2.69 k allocs: 0.0883 MB 2.69 k allocs: 0.0883 MB 1
array/dagger/N=256 (block 128)/reduce (sum) 5.07 k allocs: 0.192 MB 5.08 k allocs: 0.193 MB 0.999
array/dagger/N=256 (block 128)/transpose (permutedims) 3.52 k allocs: 0.646 MB 3.73 k allocs: 0.654 MB 0.987
array/dagger/N=256 (block 256)/add (X + X) 2.04 k allocs: 0.591 MB 2.17 k allocs: 0.596 MB 0.991
array/dagger/N=256 (block 256)/alloc (rand) 0.853 k allocs: 0.53 MB 0.853 k allocs: 0.53 MB 1
array/dagger/N=256 (block 256)/broadcast (X .+ 1) 0.647 k allocs: 0.522 MB 0.633 k allocs: 0.522 MB 1
array/dagger/N=256 (block 256)/map (sin.(X)) 0.57 k allocs: 0.519 MB 0.559 k allocs: 0.519 MB 1
array/dagger/N=256 (block 256)/norm 0.71 k allocs: 24.1 kB 0.71 k allocs: 24.1 kB 1
array/dagger/N=256 (block 256)/reduce (sum) 0.812 k allocs: 30.1 kB 0.784 k allocs: 29.1 kB 1.04
array/dagger/N=256 (block 256)/transpose (permutedims) 1.31 k allocs: 0.563 MB 1.43 k allocs: 0.568 MB 0.991
linalg/dagger/N=1024 (block 128)/cholesky 0.659 M allocs: 0.04 GB 0.56 M allocs: 0.0358 GB 1.12
linalg/dagger/N=1024 (block 128)/lu 1.38 M allocs: 0.0931 GB 0.46 M allocs: 0.0324 GB 2.87
linalg/dagger/N=1024 (block 128)/matmul (A*A) 0.861 M allocs: 0.049 GB 0.638 M allocs: 0.0335 GB 1.46
linalg/dagger/N=1024 (block 128)/matvec (A*x) 0.183 M allocs: 10.1 MB 0.181 M allocs: 10.9 MB 0.925
linalg/dagger/N=1024 (block 128)/qr 0.82 M allocs: 0.0604 GB 0.4 M allocs: 0.0336 GB 1.8
linalg/dagger/N=1024 (block 128)/solve (A\b via lu) 0.698 M allocs: 0.0414 GB 0.639 M allocs: 0.0401 GB 1.03
linalg/dagger/N=1024 (block 128)/svd 19.4 M allocs: 2.64 GB 19 M allocs: 2.78 GB 0.949
linalg/dagger/N=1024 (block 128)/syrk (A'*A) 0.751 M allocs: 0.0501 GB 0.797 M allocs: 0.0519 GB 0.965
linalg/dagger/N=1024 (block 512)/cholesky 9.78 k allocs: 9.26 MB 9.67 k allocs: 9.18 MB 1.01
linalg/dagger/N=1024 (block 512)/lu 18.6 k allocs: 14.8 MB 18.3 k allocs: 14.8 MB 1
linalg/dagger/N=1024 (block 512)/matmul (A*A) 14.4 k allocs: 10.5 MB 14 k allocs: 10.5 MB 1
linalg/dagger/N=1024 (block 512)/matvec (A*x) 14.4 k allocs: 0.595 MB 13.4 k allocs: 0.555 MB 1.07
linalg/dagger/N=1024 (block 512)/qr 14.1 k allocs: 9.7 MB 14.5 k allocs: 9.71 MB 0.999
linalg/dagger/N=1024 (block 512)/solve (A\b via lu) 0.0423 M allocs: 15.7 MB 0.0412 M allocs: 15.7 MB 1
linalg/dagger/N=1024 (block 512)/svd 0.18 M allocs: 0.31 GB 0.167 M allocs: 0.312 GB 0.995
linalg/dagger/N=1024 (block 512)/syrk (A'*A) 11.9 k allocs: 20.5 MB 12.3 k allocs: 20.5 MB 0.999
linalg/dagger/N=256 (block 128)/cholesky 0.0341 M allocs: 2.2 MB 9.67 k allocs: 1.01 MB 2.18
linalg/dagger/N=256 (block 128)/lu 27 k allocs: 1.98 MB 25 k allocs: 1.9 MB 1.04
linalg/dagger/N=256 (block 128)/matmul (A*A) 11.5 k allocs: 0.923 MB 11.7 k allocs: 0.931 MB 0.991
linalg/dagger/N=256 (block 128)/matvec (A*x) 7.07 k allocs: 0.275 MB 7.25 k allocs: 0.282 MB 0.976
linalg/dagger/N=256 (block 128)/qr 13.9 k allocs: 1.33 MB 14.4 k allocs: 1.35 MB 0.987
linalg/dagger/N=256 (block 128)/solve (A\b via lu) 0.074 M allocs: 4.04 MB 0.0624 M allocs: 3.57 MB 1.13
linalg/dagger/N=256 (block 128)/svd 0.173 M allocs: 27 MB 0.162 M allocs: 26.7 MB 1.01
linalg/dagger/N=256 (block 128)/syrk (A'*A) 11.9 k allocs: 1.71 MB 12.3 k allocs: 1.73 MB 0.991
linalg/dagger/N=256 (block 256)/cholesky 3.54 k allocs: 0.662 MB 3.79 k allocs: 0.672 MB 0.984
linalg/dagger/N=256 (block 256)/lu 6.42 k allocs: 1.29 MB 6.82 k allocs: 1.31 MB 0.987
linalg/dagger/N=256 (block 256)/matmul (A*A) 2.25 k allocs: 0.598 MB 2.4 k allocs: 0.604 MB 0.99
linalg/dagger/N=256 (block 256)/matvec (A*x) 2.8 k allocs: 0.123 MB 2.94 k allocs: 0.128 MB 0.956
linalg/dagger/N=256 (block 256)/qr 4.03 k allocs: 0.811 MB 4.3 k allocs: 0.822 MB 0.986
linalg/dagger/N=256 (block 256)/solve (A\b via lu) 14.2 k allocs: 1.65 MB 15.1 k allocs: 1.69 MB 0.976
linalg/dagger/N=256 (block 256)/svd 17.8 k allocs: 6.84 MB 19.5 k allocs: 6.91 MB 0.99
linalg/dagger/N=256 (block 256)/syrk (A'*A) 3.58 k allocs: 2.16 MB 3.84 k allocs: 2.18 MB 0.995
sparse/dagger/N=1024 (block 64)/cg solve (laplacian) 17.5 M allocs: 0.762 GB 5.6 M allocs: 0.219 GB 3.48
sparse/dagger/N=1024 (block 64)/spgemm (S*S) 11.6 M allocs: 0.517 GB 9.68 M allocs: 0.442 GB 1.17
sparse/dagger/N=1024 (block 64)/spmv (S*x) 1 M allocs: 0.0405 GB 0.696 M allocs: 29.8 MB 1.39
sparse/dagger/N=256 (block 16)/cg solve (laplacian) 20.4 M allocs: 0.881 GB 5.52 M allocs: 0.22 GB 4
sparse/dagger/N=256 (block 16)/spgemm (S*S) 12.2 M allocs: 0.522 GB 9.06 M allocs: 0.397 GB 1.32
sparse/dagger/N=256 (block 16)/spmv (S*x) 1.02 M allocs: 0.0404 GB 0.707 M allocs: 29.8 MB 1.39
stencil/dagger/N=1024 (block 128)/assign (const) 0.0526 M allocs: 2.46 MB 0.0623 M allocs: 2.93 MB 0.841
stencil/dagger/N=1024 (block 128)/multi-expr 0.303 M allocs: 13.7 MB 0.255 M allocs: 11.7 MB 1.18
stencil/dagger/N=1024 (block 128)/update (+) 0.239 M allocs: 11 MB 0.173 M allocs: 7.98 MB 1.38
stencil/dagger/N=1024 (block 512)/assign (const) 2.42 k allocs: 0.107 MB 6.24 k allocs: 0.294 MB 0.366
stencil/dagger/N=1024 (block 512)/multi-expr 31.3 k allocs: 1.42 MB 20.7 k allocs: 0.951 MB 1.49
stencil/dagger/N=1024 (block 512)/update (+) 12.3 k allocs: 0.561 MB 15.2 k allocs: 0.844 MB 0.664
stencil/dagger/N=256 (block 128)/assign (const) 2.47 k allocs: 0.11 MB 2.63 k allocs: 0.117 MB 0.946
stencil/dagger/N=256 (block 128)/multi-expr 7.49 k allocs: 0.319 MB 7.39 k allocs: 0.316 MB 1.01
stencil/dagger/N=256 (block 128)/neighbors (Clamp) 5.64 k allocs: 0.266 MB 5.91 k allocs: 0.276 MB 0.964
stencil/dagger/N=256 (block 128)/neighbors (Reflect) 5.11 k allocs: 0.249 MB 5.3 k allocs: 0.256 MB 0.973
stencil/dagger/N=256 (block 128)/update (+) 3.49 k allocs: 0.156 MB 4.65 k allocs: 0.199 MB 0.784
stencil/dagger/N=256 (block 256)/assign (const) 1.08 k allocs: 0.0563 MB 1.18 k allocs: 0.0602 MB 0.935
stencil/dagger/N=256 (block 256)/multi-expr 2.86 k allocs: 0.639 MB 2.95 k allocs: 0.643 MB 0.994
stencil/dagger/N=256 (block 256)/neighbors (Clamp) 1.9 k allocs: 0.601 MB 1.95 k allocs: 0.603 MB 0.998
stencil/dagger/N=256 (block 256)/neighbors (Reflect) 1.84 k allocs: 0.606 MB 1.95 k allocs: 0.611 MB 0.993
stencil/dagger/N=256 (block 256)/update (+) 1.38 k allocs: 0.569 MB 1.64 k allocs: 0.578 MB 0.985
time_to_load 0.147 k allocs: 10.8 kB 0.147 k allocs: 10.8 kB 1

Plots

⚠️ Regressions (time > 35.0% and outside the reported ±spread; allocs/memory > 25.0%)

  • stencil/dagger/N=1024 (block 512)/assign (const) (time): +180.0%
  • stencil/dagger/N=1024 (block 512)/assign (const) (memory): +173.2%
  • stencil/dagger/N=1024 (block 512)/assign (const) (allocs): +158.3%
  • array/dagger/N=1024 (block 512)/transpose (permutedims) (memory): +81.7%
  • stencil/dagger/N=1024 (block 512)/update (+) (memory): +50.6%
  • stencil/dagger/N=256 (block 128)/update (+) (allocs): +33.1%
  • stencil/dagger/N=256 (block 128)/update (+) (memory): +27.6%
  • array/dagger/N=1024 (block 512)/norm (memory): +26.1%

Improvements

  • linalg/dagger/N=1024 (block 128)/qr (time): -98.7%
  • array/dagger/N=1024 (block 128)/add (X + X) (time): -84.3%
  • sparse/dagger/N=256 (block 16)/cg solve (laplacian) (memory): -75.0%
  • sparse/dagger/N=256 (block 16)/cg solve (laplacian) (allocs): -73.0%
  • linalg/dagger/N=1024 (block 128)/lu (time): -72.8%
  • linalg/dagger/N=256 (block 128)/cholesky (allocs): -71.7%
  • sparse/dagger/N=1024 (block 64)/cg solve (laplacian) (memory): -71.3%
  • sparse/dagger/N=256 (block 16)/cg solve (laplacian) (time): -68.9%
  • sparse/dagger/N=1024 (block 64)/cg solve (laplacian) (allocs): -68.0%
  • linalg/dagger/N=1024 (block 128)/lu (allocs): -66.7%
  • linalg/dagger/N=1024 (block 128)/lu (memory): -65.2%
  • sparse/dagger/N=1024 (block 64)/cg solve (laplacian) (time): -63.6%
  • linalg/dagger/N=1024 (block 128)/solve (A\b via lu) (time): -60.3%
  • linalg/dagger/N=256 (block 128)/lu (time): -55.2%
  • linalg/dagger/N=256 (block 128)/cholesky (memory): -54.2%
  • linalg/dagger/N=256 (block 128)/solve (A\b via lu) (time): -51.3%
  • linalg/dagger/N=1024 (block 128)/qr (allocs): -51.2%
  • linalg/dagger/N=1024 (block 128)/matmul (A*A) (time): -50.5%
  • linalg/dagger/N=1024 (block 128)/qr (memory): -44.4%
  • stencil/dagger/N=1024 (block 128)/update (+) (time): -42.9%
  • stencil/dagger/N=1024 (block 512)/multi-expr (allocs): -33.8%
  • stencil/dagger/N=1024 (block 512)/multi-expr (memory): -33.0%
  • linalg/dagger/N=1024 (block 128)/matmul (A*A) (memory): -31.6%
  • sparse/dagger/N=256 (block 16)/spmv (S*x) (allocs): -30.8%
  • sparse/dagger/N=1024 (block 64)/spmv (S*x) (allocs): -30.4%
  • array/dagger/N=1024 (block 512)/reduce (sum) (memory): -29.1%
  • sparse/dagger/N=1024 (block 64)/spmv (S*x) (memory): -28.1%
  • sparse/dagger/N=256 (block 16)/spmv (S*x) (memory): -28.1%
  • stencil/dagger/N=1024 (block 128)/update (+) (memory): -27.6%
  • stencil/dagger/N=1024 (block 128)/update (+) (allocs): -27.3%
  • array/dagger/N=1024 (block 128)/add (X + X) (memory): -26.7%
  • linalg/dagger/N=1024 (block 128)/matmul (A*A) (allocs): -25.9%
  • sparse/dagger/N=256 (block 16)/spgemm (S*S) (allocs): -25.7%
  • array/dagger/N=1024 (block 512)/add (X + X) (allocs): -25.6%
Within noise (3 metric(s) past threshold but inside the ±spread; not counted)
  • array/dagger/N=1024 (block 512)/transpose (permutedims) (time): 36.1%
  • linalg/dagger/N=256 (block 128)/cholesky (time): -88.1%
  • array/dagger/N=1024 (block 512)/reduce (sum) (time): -90.0%
MPI benchmarks (4 ranks)

Dagger benchmarks: dirty vs master

Summary by job

Job Regressions Improvements Within noise

Median time

master dirty master / dirty
array/dagger/N=1024 (block 128)/add (X + X) 0.158 ± 0.0012 s
array/dagger/N=1024 (block 128)/alloc (rand) 0.0484 ± 0.0056 s
array/dagger/N=1024 (block 128)/broadcast (X .+ 1) 18.2 ± 0.15 ms
array/dagger/N=1024 (block 128)/map (sin.(X)) 19.2 ± 0.035 ms
array/dagger/N=1024 (block 128)/norm 20.6 ± 0.12 ms
array/dagger/N=1024 (block 128)/reduce (sum) 0.0354 ± 0.00079 s
array/dagger/N=1024 (block 128)/transpose (permutedims) 0.0836 ± 0.00039 s
array/dagger/N=1024 (block 512)/add (X + X) 15.9 ± 0.056 ms
array/dagger/N=1024 (block 512)/alloc (rand) 0.0595 ± 0.008 s
array/dagger/N=1024 (block 512)/broadcast (X .+ 1) 2.36 ± 0.29 ms
array/dagger/N=1024 (block 512)/map (sin.(X)) 4.89 ± 0.31 ms
array/dagger/N=1024 (block 512)/norm 5.08 ± 0.0046 ms
array/dagger/N=1024 (block 512)/reduce (sum) 3.09 ± 0.026 ms
array/dagger/N=1024 (block 512)/transpose (permutedims) 13.2 ± 0.043 ms
array/dagger/N=256 (block 128)/add (X + X) 11.4 ± 0.0014 ms
array/dagger/N=256 (block 128)/alloc (rand) 17 ± 0.28 ms
array/dagger/N=256 (block 128)/broadcast (X .+ 1) 1.47 ± 0.011 ms
array/dagger/N=256 (block 128)/map (sin.(X)) 1.58 ± 0.015 ms
array/dagger/N=256 (block 128)/norm 1.92 ± 0.013 ms
array/dagger/N=256 (block 128)/reduce (sum) 2.77 ± 0.026 ms
array/dagger/N=256 (block 128)/transpose (permutedims) 6.15 ± 0.0057 ms
array/dagger/N=256 (block 256)/add (X + X) 3.96 ± 0.041 ms
array/dagger/N=256 (block 256)/alloc (rand) 24.2 ± 4.4 ms
array/dagger/N=256 (block 256)/broadcast (X .+ 1) 0.858 ± 0.11 ms
array/dagger/N=256 (block 256)/map (sin.(X)) 1.65 ± 0.2 ms
array/dagger/N=256 (block 256)/norm 1.33 ± 0.015 ms
array/dagger/N=256 (block 256)/reduce (sum) 0.938 ± 0.0079 ms
array/dagger/N=256 (block 256)/transpose (permutedims) 2.35 ± 0.068 ms
linalg/dagger/N=1024 (block 128)/cholesky 4.01 s
linalg/dagger/N=1024 (block 128)/lu 28.2 s
linalg/dagger/N=1024 (block 128)/matmul (A*A) 6.47 s
linalg/dagger/N=1024 (block 128)/matvec (A*x) 0.182 ± 0.0005 s
linalg/dagger/N=1024 (block 128)/qr 2.69 s
linalg/dagger/N=1024 (block 128)/solve (A\b via lu) 27.4 s
linalg/dagger/N=1024 (block 128)/syrk (A'*A) 4.71 s
linalg/dagger/N=1024 (block 512)/cholesky 0.264 ± 0.097 s
linalg/dagger/N=1024 (block 512)/lu 9.69 s
linalg/dagger/N=1024 (block 512)/matmul (A*A) 0.275 ± 0.015 s
linalg/dagger/N=1024 (block 512)/matvec (A*x) 20.1 ± 0.00093 ms
linalg/dagger/N=1024 (block 512)/qr 0.69 ± 0.17 s
linalg/dagger/N=1024 (block 512)/solve (A\b via lu) 9.78 s
linalg/dagger/N=1024 (block 512)/syrk (A'*A) 0.201 ± 0.023 s
linalg/dagger/N=256 (block 128)/cholesky 0.224 ± 0.059 s
linalg/dagger/N=256 (block 128)/lu 1.72 ± 0.0041 s
linalg/dagger/N=256 (block 128)/matmul (A*A) 0.26 ± 0.065 s
linalg/dagger/N=256 (block 128)/matvec (A*x) 17.9 ± 0.072 ms
linalg/dagger/N=256 (block 128)/qr 0.167 ± 0.0094 s
linalg/dagger/N=256 (block 128)/solve (A\b via lu) 1.77 ± 0.0051 s
linalg/dagger/N=256 (block 128)/syrk (A'*A) 0.106 ± 0.01 s
linalg/dagger/N=256 (block 256)/cholesky 30.3 ± 17 ms
linalg/dagger/N=256 (block 256)/lu 0.653 ± 0.0043 s
linalg/dagger/N=256 (block 256)/matmul (A*A) 5.95 ± 1.1 ms
linalg/dagger/N=256 (block 256)/matvec (A*x) 4.78 ± 0.09 ms
linalg/dagger/N=256 (block 256)/qr 10.1 ± 0.44 ms
linalg/dagger/N=256 (block 256)/solve (A\b via lu) 0.662 ± 0.0043 s
linalg/dagger/N=256 (block 256)/syrk (A'*A) 9.99 ± 0.96 ms
sparse/dagger/N=1024 (block 64)/cg solve (laplacian) 11.6 s
sparse/dagger/N=1024 (block 64)/spgemm (S*S) 7.02 s
sparse/dagger/N=1024 (block 64)/spmv (S*x) 0.632 ± 0.00048 s
sparse/dagger/N=256 (block 16)/cg solve (laplacian) 11.5 s
sparse/dagger/N=256 (block 16)/spgemm (S*S) 6.96 s
sparse/dagger/N=256 (block 16)/spmv (S*x) 0.631 s
stencil/dagger/N=1024 (block 128)/alloc (neighbors Wrap) 1.05 ± 0.0075 s
stencil/dagger/N=1024 (block 128)/assign (const) 0.0729 ± 0.00019 s
stencil/dagger/N=1024 (block 128)/multi-expr 0.201 ± 0.00059 s
stencil/dagger/N=1024 (block 128)/neighbors (Clamp) 1.01 ± 0.022 s
stencil/dagger/N=1024 (block 128)/neighbors (Pad) 0.923 ± 0.0048 s
stencil/dagger/N=1024 (block 128)/neighbors (Reflect) 0.982 ± 0.011 s
stencil/dagger/N=1024 (block 128)/neighbors (Wrap) 1.12 ± 0.0054 s
stencil/dagger/N=1024 (block 128)/update (+) 0.124 ± 0.0051 s
stencil/dagger/N=1024 (block 512)/alloc (neighbors Wrap) 0.0979 ± 0.0013 s
stencil/dagger/N=1024 (block 512)/assign (const) 6.66 ± 0.0087 ms
stencil/dagger/N=1024 (block 512)/multi-expr 16.4 ± 0.17 ms
stencil/dagger/N=1024 (block 512)/neighbors (Clamp) 0.0711 ± 0.0021 s
stencil/dagger/N=1024 (block 512)/neighbors (Pad) 0.053 ± 0.00024 s
stencil/dagger/N=1024 (block 512)/neighbors (Reflect) 0.0689 ± 0.00074 s
stencil/dagger/N=1024 (block 512)/neighbors (Wrap) 0.0947 ± 0.00034 s
stencil/dagger/N=1024 (block 512)/update (+) 10.3 ± 0.009 ms
stencil/dagger/N=256 (block 128)/alloc (neighbors Wrap) 0.0791 ± 9.2e-05 s
stencil/dagger/N=256 (block 128)/assign (const) 5.6 ± 0.01 ms
stencil/dagger/N=256 (block 128)/multi-expr 14 ± 0.16 ms
stencil/dagger/N=256 (block 128)/neighbors (Clamp) 0.0551 ± 0.00092 s
stencil/dagger/N=256 (block 128)/neighbors (Pad) 0.037 ± 0.00087 s
stencil/dagger/N=256 (block 128)/neighbors (Reflect) 0.0524 ± 0.00019 s
stencil/dagger/N=256 (block 128)/neighbors (Wrap) 0.077 ± 0.00099 s
stencil/dagger/N=256 (block 128)/update (+) 8.37 ± 0.029 ms
stencil/dagger/N=256 (block 256)/alloc (neighbors Wrap) 5.65 ± 0.14 ms
stencil/dagger/N=256 (block 256)/assign (const) 2.2 ± 0.081 ms
stencil/dagger/N=256 (block 256)/multi-expr 4.54 ± 0.0088 ms
stencil/dagger/N=256 (block 256)/neighbors (Clamp) 4.69 ± 0.087 ms
stencil/dagger/N=256 (block 256)/neighbors (Pad) 4.8 ± 0.21 ms
stencil/dagger/N=256 (block 256)/neighbors (Reflect) 4.27 ± 0.013 ms
stencil/dagger/N=256 (block 256)/neighbors (Wrap) 4.45 ± 0.037 ms
stencil/dagger/N=256 (block 256)/update (+) 2.72 ± 0.0092 ms
time_to_load 1.22 ± 0.0093 s 1.21 ± 0.0024 s 1.01 ± 0.0079

Allocations / memory

master dirty master / dirty
array/dagger/N=1024 (block 128)/add (X + X) 0.698 M allocs: 0.0362 GB
array/dagger/N=1024 (block 128)/alloc (rand) 0.117 M allocs: 7.36 MB
array/dagger/N=1024 (block 128)/broadcast (X .+ 1) 0.06 M allocs: 4.28 MB
array/dagger/N=1024 (block 128)/map (sin.(X)) 0.0543 M allocs: 4.05 MB
array/dagger/N=1024 (block 128)/norm 0.0733 M allocs: 2.82 MB
array/dagger/N=1024 (block 128)/reduce (sum) 0.112 M allocs: 4.27 MB
array/dagger/N=1024 (block 128)/transpose (permutedims) 0.33 M allocs: 18.6 MB
array/dagger/N=1024 (block 512)/add (X + X) 0.0479 M allocs: 4.41 MB
array/dagger/N=1024 (block 512)/alloc (rand) 9.36 k allocs: 2.44 MB
array/dagger/N=1024 (block 512)/broadcast (X .+ 1) 3.72 k allocs: 2.14 MB
array/dagger/N=1024 (block 512)/map (sin.(X)) 3.39 k allocs: 2.13 MB
array/dagger/N=1024 (block 512)/norm 4.76 k allocs: 0.183 MB
array/dagger/N=1024 (block 512)/reduce (sum) 6.26 k allocs: 0.234 MB
array/dagger/N=1024 (block 512)/transpose (permutedims) 22.9 k allocs: 3.15 MB
array/dagger/N=256 (block 128)/add (X + X) 0.0479 M allocs: 2.53 MB
array/dagger/N=256 (block 128)/alloc (rand) 9.35 k allocs: 0.563 MB
array/dagger/N=256 (block 128)/broadcast (X .+ 1) 3.78 k allocs: 0.265 MB
array/dagger/N=256 (block 128)/map (sin.(X)) 3.43 k allocs: 0.253 MB
array/dagger/N=256 (block 128)/norm 4.71 k allocs: 0.18 MB
array/dagger/N=256 (block 128)/reduce (sum) 6.47 k allocs: 0.242 MB
array/dagger/N=256 (block 128)/transpose (permutedims) 22.9 k allocs: 1.28 MB
array/dagger/N=256 (block 256)/add (X + X) 15.2 k allocs: 1.27 MB
array/dagger/N=256 (block 256)/alloc (rand) 3.95 k allocs: 0.69 MB
array/dagger/N=256 (block 256)/broadcast (X .+ 1) 1.02 k allocs: 0.538 MB
array/dagger/N=256 (block 256)/map (sin.(X)) 0.935 k allocs: 0.535 MB
array/dagger/N=256 (block 256)/norm 1.38 k allocs: 0.0542 MB
array/dagger/N=256 (block 256)/reduce (sum) 1.39 k allocs: 0.0541 MB
array/dagger/N=256 (block 256)/transpose (permutedims) 7.27 k allocs: 0.872 MB
linalg/dagger/N=1024 (block 128)/cholesky 1.66 M allocs: 0.0834 GB
linalg/dagger/N=1024 (block 128)/lu 0.0572 G allocs: 2.59 GB
linalg/dagger/N=1024 (block 128)/matmul (A*A) 3.63 M allocs: 0.174 GB
linalg/dagger/N=1024 (block 128)/matvec (A*x) 0.7 M allocs: 0.0333 GB
linalg/dagger/N=1024 (block 128)/qr 2.54 M allocs: 0.125 GB
linalg/dagger/N=1024 (block 128)/solve (A\b via lu) 0.0584 G allocs: 2.64 GB
linalg/dagger/N=1024 (block 128)/syrk (A'*A) 2.7 M allocs: 0.132 GB
linalg/dagger/N=1024 (block 512)/cholesky 0.0937 M allocs: 6.67 MB
linalg/dagger/N=1024 (block 512)/lu 21 M allocs: 0.952 GB
linalg/dagger/N=1024 (block 512)/matmul (A*A) 0.106 M allocs: 7.23 MB
linalg/dagger/N=1024 (block 512)/matvec (A*x) 0.0678 M allocs: 3.36 MB
linalg/dagger/N=1024 (block 512)/qr 0.131 M allocs: 8.76 MB
linalg/dagger/N=1024 (block 512)/solve (A\b via lu) 21.2 M allocs: 0.962 GB
linalg/dagger/N=1024 (block 512)/syrk (A'*A) 0.103 M allocs: 13.2 MB
linalg/dagger/N=256 (block 128)/cholesky 0.0937 M allocs: 4.8 MB
linalg/dagger/N=256 (block 128)/lu 5.37 M allocs: 0.242 GB
linalg/dagger/N=256 (block 128)/matmul (A*A) 0.106 M allocs: 5.36 MB
linalg/dagger/N=256 (block 128)/matvec (A*x) 0.0678 M allocs: 3.35 MB
linalg/dagger/N=256 (block 128)/qr 0.131 M allocs: 6.69 MB
linalg/dagger/N=256 (block 128)/solve (A\b via lu) 5.51 M allocs: 0.249 GB
linalg/dagger/N=256 (block 128)/syrk (A'*A) 0.104 M allocs: 5.68 MB
linalg/dagger/N=256 (block 256)/cholesky 25.7 k allocs: 1.82 MB
linalg/dagger/N=256 (block 256)/lu 2.36 M allocs: 0.108 GB
linalg/dagger/N=256 (block 256)/matmul (A*A) 15.7 k allocs: 1.3 MB
linalg/dagger/N=256 (block 256)/matvec (A*x) 19.2 k allocs: 0.971 MB
linalg/dagger/N=256 (block 256)/qr 29.5 k allocs: 2.13 MB
linalg/dagger/N=256 (block 256)/solve (A\b via lu) 2.41 M allocs: 0.111 GB
linalg/dagger/N=256 (block 256)/syrk (A'*A) 23 k allocs: 3.17 MB
sparse/dagger/N=1024 (block 64)/cg solve (laplacian) 0.0321 G allocs: 1.54 GB
sparse/dagger/N=1024 (block 64)/spgemm (S*S) 21.8 M allocs: 1.01 GB
sparse/dagger/N=1024 (block 64)/spmv (S*x) 2.42 M allocs: 0.116 GB
sparse/dagger/N=256 (block 16)/cg solve (laplacian) 0.0321 G allocs: 1.54 GB
sparse/dagger/N=256 (block 16)/spgemm (S*S) 21.8 M allocs: 0.989 GB
sparse/dagger/N=256 (block 16)/spmv (S*x) 2.42 M allocs: 0.116 GB
stencil/dagger/N=1024 (block 128)/alloc (neighbors Wrap) 3.97 M allocs: 0.197 GB
stencil/dagger/N=1024 (block 128)/assign (const) 0.304 M allocs: 15.6 MB
stencil/dagger/N=1024 (block 128)/multi-expr 0.864 M allocs: 0.043 GB
stencil/dagger/N=1024 (block 128)/neighbors (Clamp) 3.49 M allocs: 0.172 GB
stencil/dagger/N=1024 (block 128)/neighbors (Pad) 3.26 M allocs: 0.161 GB
stencil/dagger/N=1024 (block 128)/neighbors (Reflect) 3.49 M allocs: 0.172 GB
stencil/dagger/N=1024 (block 128)/neighbors (Wrap) 3.88 M allocs: 0.191 GB
stencil/dagger/N=1024 (block 128)/update (+) 0.542 M allocs: 27.8 MB
stencil/dagger/N=1024 (block 512)/alloc (neighbors Wrap) 0.316 M allocs: 17.8 MB
stencil/dagger/N=1024 (block 512)/assign (const) 21.3 k allocs: 1.09 MB
stencil/dagger/N=1024 (block 512)/multi-expr 0.0586 M allocs: 2.98 MB
stencil/dagger/N=1024 (block 512)/neighbors (Clamp) 0.211 M allocs: 10.6 MB
stencil/dagger/N=1024 (block 512)/neighbors (Pad) 0.147 M allocs: 7.43 MB
stencil/dagger/N=1024 (block 512)/neighbors (Reflect) 0.211 M allocs: 10.7 MB
stencil/dagger/N=1024 (block 512)/neighbors (Wrap) 0.308 M allocs: 15.4 MB
stencil/dagger/N=1024 (block 512)/update (+) 0.0361 M allocs: 1.85 MB
stencil/dagger/N=256 (block 128)/alloc (neighbors Wrap) 0.316 M allocs: 15.9 MB
stencil/dagger/N=256 (block 128)/assign (const) 21.3 k allocs: 1.09 MB
stencil/dagger/N=256 (block 128)/multi-expr 0.0586 M allocs: 2.98 MB
stencil/dagger/N=256 (block 128)/neighbors (Clamp) 0.211 M allocs: 10.6 MB
stencil/dagger/N=256 (block 128)/neighbors (Pad) 0.147 M allocs: 7.41 MB
stencil/dagger/N=256 (block 128)/neighbors (Reflect) 0.211 M allocs: 10.6 MB
stencil/dagger/N=256 (block 128)/neighbors (Wrap) 0.308 M allocs: 15.4 MB
stencil/dagger/N=256 (block 128)/update (+) 0.0361 M allocs: 1.85 MB
stencil/dagger/N=256 (block 256)/alloc (neighbors Wrap) 18.7 k allocs: 1.45 MB
stencil/dagger/N=256 (block 256)/assign (const) 6.86 k allocs: 0.356 MB
stencil/dagger/N=256 (block 256)/multi-expr 17.7 k allocs: 0.916 MB
stencil/dagger/N=256 (block 256)/neighbors (Clamp) 15.1 k allocs: 0.777 MB
stencil/dagger/N=256 (block 256)/neighbors (Pad) 15.1 k allocs: 0.775 MB
stencil/dagger/N=256 (block 256)/neighbors (Reflect) 14.4 k allocs: 0.76 MB
stencil/dagger/N=256 (block 256)/neighbors (Wrap) 15.1 k allocs: 0.769 MB
stencil/dagger/N=256 (block 256)/update (+) 10.6 k allocs: 0.55 MB
time_to_load 0.147 k allocs: 10.8 kB 0.147 k allocs: 10.8 kB 1

No time regressions beyond 35.0% or allocation regressions beyond 25.0% (timing changes inside the reported ±spread don't count) 🎉

Full results and plots (download the benchmark-results-* artifacts).

@jpsamaroo
jpsamaroo force-pushed the jps/hierarchical-mp-mr branch from 4a2eeeb to 58a7165 Compare August 20, 2026 23:34
@jpsamaroo
jpsamaroo changed the base branch from jps/mpi-bad-scale-stencil to master August 20, 2026 23:38
@jpsamaroo
jpsamaroo marked this pull request as draft September 4, 2026 23:50
jpsamaroo and others added 5 commits September 7, 2026 12:12
…anning

Turning a prepared spec into scheduler thunks needs nothing from the
planner, but it was running inline and accounted for ~40% of per-task
planning cost in a multi-worker region. `AsyncEnqueueQueue` hands each
batch to a submitter task instead, preserving FIFO order (the syncdeps
recorded during planning rely on it) and keeping a synchronous drain for
the two points that need a task to really exist: a value dependency's
`fetch`, and the end of the region. It is used only when there is a
spare thread to submit on, and never under uniform execution, where a
rank's submission runs collectives that must stay ordered against
planning's own.

`DATADEPS_BATCH_LIMIT` goes from 4 to 16, which is where the scheduler
round-trip stops amortizing (256 independent `InOut` tasks over 4
workers: 69 us/task unbatched, 55 at 16, 53.5 unbounded) while still
bounding how far planning runs ahead of execution. Together these take
that region from 31.2 ms to 16.9 ms.

Attributing planning cost is hard from a profile, because the expensive
parts are blocking waits inside communication rather than hot loops, so
this also adds per-phase timing behind `JULIA_DAGGER_HIER_TIMING=1`
(off by default, one `Ref` read per phase) and records what it found in
the module header. The MPI hang warning now carries a backtrace, since
which call site is waiting is the whole diagnosis for a wait cycle.

Co-authored-by: Cursor <cursoragent@cursor.com>
A chunk's aliasing info cannot be computed locally: under Distributed it
is a `remotecall_fetch` to the owner, and under MPI a broadcast from the
owner that every rank must join. Planning asks the same questions
repeatedly -- once per unique argument to build the DAG, again for every
slot, again for the write-back epilogue -- so a region spent hundreds of
round-trips re-deriving a handful of distinct answers. Under MPI each is
a global synchronization point, which is what made replicated planning
scale so poorly with rank count.

Three changes, all invisible to the user:

* `ChunkAinfoMemo`, a per-region memo keyed on argument identity, the
  dependency modifier and the acceleration. Per-region because aliasing
  info describes where a value's memory currently is: stable while one
  region plans, but a later region's chunk may reuse a freed address.
  Keys are rank-uniform, so every rank hits and misses on exactly the
  same calls and the remaining broadcasts are still collective.
* `batch_aliasing` / `batch_ainfos`, which resolve a whole uniform list
  of arguments in one exchange per owning rank rather than one broadcast
  each, and seed the memo with the results. Phase 1 now goes through
  these, so the rest of planning finds its answers already computed.
* Copies made by Datadeps recorded their own destination-side ainfo
  eagerly, costing a second rendezvous per slot on top of the transfer.
  That ainfo only matters when the copy is itself the source of a later
  move, which most regions never do, so copies are now recorded
  unresolved and resolved lazily on the first `derived` miss, as one
  batch. Safe under SPMD because the trigger is uniform.

Slot generation halved for a 4-rank stencil sweep (1.97 -> 0.96
ms/sweep), and the 2-rank MPI test suite went from 12m20s to 10m07s.

Co-authored-by: Cursor <cursoragent@cursor.com>
A slot is the per-memory-space buffer Datadeps allocates to stand in for
an argument a task will touch from somewhere other than where the
argument lives. Slots were thrown away at the end of every region, so an
iterative workload -- a stencil loop, an iterative solver -- rebuilt the
same buffers every sweep, paying an allocation, a whole-buffer transfer,
an aliasing exchange and a free task per buffer. Under MPI the transfer
is worse than its bytes suggest: it is a rendezvous every rank has to
reach, in the middle of planning.

Slots are now kept in a bounded cache keyed on (origin chunk identity
hash, destination space) and handed to the next region that wants the
same pair.

The transfer this removes is the part that looks unsafe, so: a fresh
slot's populating transfer is already known to be redundant for the data
the region writes, because `generate_slot!` deliberately does not
synchronize with the owner (a slot is only ever "some version" of the
data) and the region's own copy-to brings it current before any task
reads it. What the transfer does provide is coverage of the parts the
region's copies never refresh. So reuse is restricted to arguments used
only under `dep_mod === identity`, whose first copy is a whole-buffer
copy; an argument touched under any partial modifier is excluded
outright, including its `identity` uses, since they all share one slot.
Establishing that needs the region's whole argument list before any slot
is built, which is why this rides on the hierarchical path's Phase 1 --
the flat path discovers arguments task by task and stays as it was.

Retention is keyed on `Chunk.handle`, not on the `Chunk`: a slot is
retained as the object in `state.remote_args` and freed as the object in
the aliased-object cache, and those are not always the same wrapper over
the one buffer.

Every input to a reuse decision is rank-uniform -- the identity hash,
the chunk type, the eligibility set, and the cache contents, which
evolve identically because every rank replays the same regions in the
same order -- so all ranks hit and miss together, which they must, since
a hit skips a rendezvous. Eviction is FIFO rather than LRU so a hit does
not reorder the eviction sequence.

For a 4-worker, 4x4-block sweep of 256^2 blocks, steady-state planning
goes 110 -> 14 ms and the whole sweep 86 -> 32 ms; the same benchmark on
2 MPI ranks goes 15.4 -> 13.3 ms. `Dagger.DATADEPS_SLOT_REUSE[]` (or
`JULIA_DAGGER_SLOT_REUSE=0`) disables it.

Co-authored-by: Cursor <cursoragent@cursor.com>
…t samples

The regressions/improvements lists in the CI report require opening the
report to see, and the "within noise" breakdown was buried behind a
<details> section entirely -- there was no way to tell at a glance which
suite/method jobs actually moved. Add a summary table (job, regression
count, improvement count, within-noise count) at the top of both the
Markdown report and the stdout summary, grouped by the `suite/method`
prefix that the `BENCHMARK` spec already uses to identify one job.

Also bump the default BENCHMARK_SAMPLES from 5 to 7 for less noisy CI
comparisons.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NHPKqRaGTGLt7CPKyZGuPe
@jpsamaroo
jpsamaroo force-pushed the jps/hierarchical-mp-mr branch from 58a7165 to e844dc3 Compare September 7, 2026 21:10
`mpi_deadlock_detect` timed each wait on its own and threw once one
exceeded 120s. That reads a long wait as a deadlock, but how long a rank
waits for a peer is bounded by the peer's *backlog*, not by anything
about the wait itself -- and `DATADEPS_UNIFORM_DEFER` deliberately lets
that backlog grow, submitting a region's whole task set in one burst so
planning is not interleaved with execution. A non-owner then reaches a
task's `execute!` metadata wait long before the owner starts it, and if
the owner still has to JIT the task body first, one legitimate wait runs
past any fixed timeout.

That is the MPI CPU CI failure: the `@stencil` 4D case (81 blocks x 80
`Wrap()` neighbors, 82 inputs) takes minutes to compile on first use, so
rank 1 aborted the run on a wait that was making perfectly good progress.
The suite passed with the detector disabled, and every stall warning fell
in the first repetition -- the compiling one -- with later repetitions of
the same region clean at ~3s.

Count the cross-rank operations each rank completes (finished requests,
delivered broadcast payloads) and restart a wait's clock whenever that
counter moves. The thresholds then measure a stall rather than a wait. A
real cycle still trips them, once the work that does not depend on it has
drained; verified by a rank waiting on a message that never comes, which
still errors at exactly the timeout.

Wait-loop state moves into an isbits `DeadlockTimer` so the loops keep
allocating nothing, and the two periods pick up env-var overrides, which
is what made the false positive falsifiable in the first place.

2 ranks x 2 threads, test/mpi.jl: 420/446 pass, 10m04s, no warnings
(master: 18m03s; this branch before the fix: exit 1 at 14m42s).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01NHPKqRaGTGLt7CPKyZGuPe
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