Optimizations to multi-process and multi-rank Datadeps - #739
Draft
jpsamaroo wants to merge 6 commits into
Draft
Conversation
Contributor
Dagger benchmarks:
|
| 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
force-pushed
the
jps/hierarchical-mp-mr
branch
from
August 20, 2026 23:34
4a2eeeb to
58a7165
Compare
jpsamaroo
marked this pull request as draft
September 4, 2026 23:50
…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
force-pushed
the
jps/hierarchical-mp-mr
branch
from
September 7, 2026 21:10
58a7165 to
e844dc3
Compare
`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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Written by Claude Opus