Skip to content

DArray/stencil: Add AntiReflect boundary condition - #741

Open
jpsamaroo wants to merge 1 commit into
jps/mpi-bad-scale-stencilfrom
jps/stencil-antireflect
Open

DArray/stencil: Add AntiReflect boundary condition#741
jpsamaroo wants to merge 1 commit into
jps/mpi-bad-scale-stencilfrom
jps/stencil-antireflect

Conversation

@jpsamaroo

Copy link
Copy Markdown
Member

Reflects indices like Reflect, but negates the reflected values, for quantities that must vanish at the domain edge - most commonly the velocity or momentum component normal to a solid wall, which Reflect turns into an outflow.

Written by Claude

Reflects indices like Reflect, but negates the reflected values, for
quantities that must vanish at the domain edge - most commonly the
velocity or momentum component normal to a solid wall, which Reflect
turns into an outflow. Usually combined with other BCs via a tuple,
since only the wall-normal component flips sign.

Co-authored-by: Cursor <cursoragent@cursor.com>
@github-actions

Copy link
Copy Markdown
Contributor

Dagger benchmarks: dirty vs master

Multi-threaded benchmarks (4 threads)

Dagger benchmarks: dirty vs master

master dirty master / dirty
array/dagger/N=1024 (block 512)/add (X + X) 3.59 ± 0.47 ms 3.47 ± 0.066 ms 1.03 ± 0.14
array/dagger/N=1024 (block 512)/alloc (rand) 3.65 ± 0.7 ms 3.41 ± 0.061 ms 1.07 ± 0.21
array/dagger/N=1024 (block 512)/broadcast (X .+ 1) 2.62 ± 0.59 ms 2.63 ± 0.21 ms 0.997 ± 0.24
array/dagger/N=1024 (block 512)/map (sin.(X)) 7.92 ± 0.44 ms 8.61 ± 0.47 ms 0.919 ± 0.071
array/dagger/N=1024 (block 512)/norm 1.16 ± 0.3 ms 1.17 ± 0.11 ms 0.993 ± 0.27
array/dagger/N=1024 (block 512)/reduce (sum) 2.32 ± 0.2 ms 3.33 ± 1.5 ms 0.695 ± 0.32
array/dagger/N=1024 (block 512)/transpose (permutedims) 7.5 ± 0.88 ms 7.14 ± 0.72 ms 1.05 ± 0.16
array/dagger/N=256 (block 256)/add (X + X) 1.03 ± 0.2 ms 1.01 ± 0.027 ms 1.02 ± 0.2
array/dagger/N=256 (block 256)/alloc (rand) 0.915 ± 0.35 ms 0.921 ± 0.052 ms 0.994 ± 0.38
array/dagger/N=256 (block 256)/broadcast (X .+ 1) 0.765 ± 3.1 ms 0.572 ± 0.11 ms 1.34 ± 5.4
array/dagger/N=256 (block 256)/map (sin.(X)) 1.42 ± 0.17 ms 1.16 ± 0.027 ms 1.22 ± 0.15
array/dagger/N=256 (block 256)/norm 0.517 ± 0.043 ms 0.547 ± 0.11 ms 0.945 ± 0.21
array/dagger/N=256 (block 256)/reduce (sum) 1.22 ± 2.9 ms 1.11 ± 2.5 ms 1.1 ± 3.6
array/dagger/N=256 (block 256)/transpose (permutedims) 1.11 ± 0.19 ms 1.16 ± 0.056 ms 0.952 ± 0.17
linalg/dagger/N=1024 (block 512)/cholesky 23.5 ± 2.9 ms 27.9 ± 5.2 ms 0.843 ± 0.19
linalg/dagger/N=1024 (block 512)/lu 0.0472 ± 0.0047 s 0.0493 ± 0.0033 s 0.959 ± 0.11
linalg/dagger/N=1024 (block 512)/matmul (A*A) 0.0529 ± 0.0037 s 0.052 ± 0.0041 s 1.02 ± 0.11
linalg/dagger/N=1024 (block 512)/matvec (A*x) 3.46 ± 1.1 ms 3.09 ± 0.96 ms 1.12 ± 0.49
linalg/dagger/N=1024 (block 512)/qr 0.111 ± 0.0037 s 0.112 ± 0.0051 s 0.988 ± 0.056
linalg/dagger/N=1024 (block 512)/solve (A\b via lu) 0.0561 ± 0.0053 s 0.0568 ± 0.0073 s 0.988 ± 0.16
linalg/dagger/N=1024 (block 512)/svd 0.0407 h 0.0394 h 1.03
linalg/dagger/N=1024 (block 512)/syrk (A'*A) 0.0355 ± 0.0089 s 0.0368 ± 0.0046 s 0.967 ± 0.27
linalg/dagger/N=256 (block 256)/cholesky 2.77 ± 0.082 ms 2.81 ± 0.2 ms 0.986 ± 0.076
linalg/dagger/N=256 (block 256)/lu 5.02 ± 1.1 ms 4.16 ± 0.33 ms 1.21 ± 0.29
linalg/dagger/N=256 (block 256)/matmul (A*A) 2.36 ± 0.47 ms 2.5 ± 0.19 ms 0.947 ± 0.2
linalg/dagger/N=256 (block 256)/matvec (A*x) 1.34 ± 0.47 ms 1.26 ± 0.55 ms 1.07 ± 0.6
linalg/dagger/N=256 (block 256)/qr 5.16 ± 0.68 ms 5.11 ± 0.22 ms 1.01 ± 0.14
linalg/dagger/N=256 (block 256)/solve (A\b via lu) 9.52 ± 0.94 ms 10.9 ± 4.2 ms 0.877 ± 0.35
linalg/dagger/N=256 (block 256)/svd 0.611 ± 0.13 s 0.541 ± 0.053 s 1.13 ± 0.27
linalg/dagger/N=256 (block 256)/syrk (A'*A) 2.95 ± 0.12 ms 3.49 ± 0.68 ms 0.844 ± 0.17
stencil/dagger/N=1024 (block 512)/alloc (neighbors Wrap) 8.81 ± 0.61 ms 8.7 ± 0.31 ms 1.01 ± 0.079
stencil/dagger/N=1024 (block 512)/assign (const) 1.33 ± 0.17 ms 1.42 ± 0.052 ms 0.934 ± 0.12
stencil/dagger/N=1024 (block 512)/multi-expr 4.27 ± 0.82 ms 4.09 ± 0.44 ms 1.04 ± 0.23
stencil/dagger/N=1024 (block 512)/neighbors (Clamp) 7.2 ± 0.84 ms 7.14 ± 0.31 ms 1.01 ± 0.12
stencil/dagger/N=1024 (block 512)/neighbors (Pad) 7.57 ± 1.1 ms 8.16 ± 0.49 ms 0.927 ± 0.15
stencil/dagger/N=1024 (block 512)/neighbors (Reflect) 7.61 ± 0.69 ms 8.15 ± 0.23 ms 0.934 ± 0.089
stencil/dagger/N=1024 (block 512)/neighbors (Wrap) 7.75 ± 0.36 ms 7.24 ± 1.1 ms 1.07 ± 0.17
stencil/dagger/N=1024 (block 512)/update (+) 2.82 ± 0.34 ms 2.93 ± 0.42 ms 0.963 ± 0.18
stencil/dagger/N=256 (block 256)/alloc (neighbors Wrap) 1.92 ± 0.017 ms 1.99 ± 0.26 ms 0.961 ± 0.12
stencil/dagger/N=256 (block 256)/assign (const) 0.685 ± 0.023 ms 0.795 ± 0.15 ms 0.862 ± 0.17
stencil/dagger/N=256 (block 256)/multi-expr 1.36 ± 0.13 ms 1.34 ± 0.032 ms 1.02 ± 0.097
stencil/dagger/N=256 (block 256)/neighbors (Clamp) 1.61 ± 0.26 ms 1.55 ± 0.019 ms 1.04 ± 0.17
stencil/dagger/N=256 (block 256)/neighbors (Pad) 1.43 ± 0.054 ms 1.89 ± 0.2 ms 0.76 ± 0.084
stencil/dagger/N=256 (block 256)/neighbors (Reflect) 1.53 ± 0.16 ms 1.7 ± 0.099 ms 0.903 ± 0.11
stencil/dagger/N=256 (block 256)/neighbors (Wrap) 1.58 ± 0.095 ms 1.64 ± 0.11 ms 0.964 ± 0.086
stencil/dagger/N=256 (block 256)/update (+) 0.901 ± 0.49 ms 0.92 ± 0.035 ms 0.979 ± 0.53
time_to_load 1.06 ± 0.031 s 1.06 ± 0.018 s 0.997 ± 0.033

Plots

⚠️ Regressions (> 25.0%)

  • array/dagger/N=1024 (block 512)/reduce (sum): +43.9%
  • stencil/dagger/N=256 (block 256)/neighbors (Pad): +31.6%

Improvements (> 25.0% faster)

  • array/dagger/N=256 (block 256)/broadcast (X .+ 1): -25.2%
Distributed benchmarks (4 processes)

Dagger benchmarks: dirty vs master

master dirty master / dirty
array/dagger/N=1024 (block 512)/add (X + X) 6.27 ± 0.054 ms 6.1 ± 0.046 ms 1.03 ± 0.012
array/dagger/N=1024 (block 512)/alloc (rand) 5.81 ± 0.027 ms 5.81 ± 0.057 ms 0.999 ± 0.011
array/dagger/N=1024 (block 512)/broadcast (X .+ 1) 4.71 ± 0.1 ms 4.75 ± 0.15 ms 0.992 ± 0.037
array/dagger/N=1024 (block 512)/map (sin.(X)) 13.1 ± 0.054 ms 13.1 ± 0.052 ms 1 ± 0.0057
array/dagger/N=1024 (block 512)/norm 1.34 ± 0.065 ms 1.23 ± 0.03 ms 1.09 ± 0.06
array/dagger/N=1024 (block 512)/reduce (sum) 2.27 ± 0.061 ms 2.31 ± 0.026 ms 0.983 ± 0.029
array/dagger/N=1024 (block 512)/transpose (permutedims) 12.5 ± 0.034 ms 12.4 ± 0.13 ms 1 ± 0.011
array/dagger/N=256 (block 256)/add (X + X) 0.997 ± 0.014 ms 0.993 ± 0.047 ms 1 ± 0.05
array/dagger/N=256 (block 256)/alloc (rand) 1.28 ± 0.018 ms 1.28 ± 0.012 ms 1 ± 0.017
array/dagger/N=256 (block 256)/broadcast (X .+ 1) 0.568 ± 0.08 ms 0.553 ± 0.039 ms 1.03 ± 0.16
array/dagger/N=256 (block 256)/map (sin.(X)) 1.13 ± 0.017 ms 1.09 ± 0.021 ms 1.03 ± 0.025
array/dagger/N=256 (block 256)/norm 0.403 ± 0.021 ms 0.457 ± 0.021 ms 0.881 ± 0.061
array/dagger/N=256 (block 256)/reduce (sum) 0.763 ± 0.028 ms 0.8 ± 0.053 ms 0.953 ± 0.072
array/dagger/N=256 (block 256)/transpose (permutedims) 1.05 ± 0.023 ms 1.16 ± 0.016 ms 0.905 ± 0.023
linalg/dagger/N=1024 (block 512)/cholesky 18.8 ± 0.11 ms 18.2 ± 0.15 ms 1.03 ± 0.011
linalg/dagger/N=1024 (block 512)/lu 0.0448 ± 0.0015 s 0.042 ± 0.0046 s 1.07 ± 0.12
linalg/dagger/N=1024 (block 512)/matmul (A*A) 0.0348 ± 0.00021 s 0.0335 ± 3e-05 s 1.04 ± 0.0063
linalg/dagger/N=1024 (block 512)/matvec (A*x) 3.14 ± 0.09 ms 3.17 ± 0.14 ms 0.989 ± 0.053
linalg/dagger/N=1024 (block 512)/qr 0.105 ± 0.0013 s 0.109 ± 0.00011 s 0.962 ± 0.012
linalg/dagger/N=1024 (block 512)/solve (A\b via lu) 0.0452 ± 0.00045 s 0.0478 ± 0.00017 s 0.945 ± 0.0099
linalg/dagger/N=1024 (block 512)/svd 0.0369 h 0.037 h 0.997
linalg/dagger/N=1024 (block 512)/syrk (A'*A) 0.0321 ± 0.0034 s 0.035 ± 0.0036 s 0.916 ± 0.13
linalg/dagger/N=256 (block 256)/cholesky 2.52 ± 0.045 ms 2.44 ± 0.14 ms 1.03 ± 0.063
linalg/dagger/N=256 (block 256)/lu 4.11 ± 0.099 ms 4.28 ± 0.069 ms 0.961 ± 0.028
linalg/dagger/N=256 (block 256)/matmul (A*A) 1.95 ± 0.066 ms 2.09 ± 0.056 ms 0.933 ± 0.04
linalg/dagger/N=256 (block 256)/matvec (A*x) 1.3 ± 0.054 ms 1.38 ± 0.061 ms 0.943 ± 0.057
linalg/dagger/N=256 (block 256)/qr 3.91 ± 0.041 ms 4.07 ± 0.14 ms 0.962 ± 0.034
linalg/dagger/N=256 (block 256)/solve (A\b via lu) 6.41 ± 0.057 ms 6.84 ± 0.03 ms 0.938 ± 0.0093
linalg/dagger/N=256 (block 256)/svd 0.578 ± 0.027 s 0.531 ± 0.0044 s 1.09 ± 0.051
linalg/dagger/N=256 (block 256)/syrk (A'*A) 2.64 ± 0.012 ms 2.86 ± 0.11 ms 0.921 ± 0.036
stencil/dagger/N=1024 (block 512)/alloc (neighbors Wrap) 14.9 ± 0.057 ms 15.4 ± 0.18 ms 0.971 ± 0.012
stencil/dagger/N=1024 (block 512)/assign (const) 1.51 ± 0.066 ms 1.49 ± 0.063 ms 1.01 ± 0.062
stencil/dagger/N=1024 (block 512)/multi-expr 3.25 ± 0.059 ms 3.94 ± 0.23 ms 0.825 ± 0.051
stencil/dagger/N=1024 (block 512)/neighbors (Clamp) 9.81 ± 0.056 ms 11.1 ± 0.091 ms 0.887 ± 0.0089
stencil/dagger/N=1024 (block 512)/neighbors (Pad) 10.6 ± 0.062 ms 11.2 ± 0.072 ms 0.949 ± 0.0082
stencil/dagger/N=1024 (block 512)/neighbors (Reflect) 11.2 ± 0.15 ms 9.99 ± 0.13 ms 1.12 ± 0.021
stencil/dagger/N=1024 (block 512)/neighbors (Wrap) 11.1 ± 0.036 ms 11.6 ± 0.34 ms 0.956 ± 0.028
stencil/dagger/N=1024 (block 512)/update (+) 2.26 ± 0.07 ms 2.56 ± 0.022 ms 0.885 ± 0.029
stencil/dagger/N=256 (block 256)/alloc (neighbors Wrap) 1.92 ± 0.053 ms 1.93 ± 0.11 ms 0.996 ± 0.061
stencil/dagger/N=256 (block 256)/assign (const) 0.608 ± 0.057 ms 0.698 ± 0.043 ms 0.871 ± 0.098
stencil/dagger/N=256 (block 256)/multi-expr 1.37 ± 0.024 ms 1.42 ± 0.17 ms 0.964 ± 0.11
stencil/dagger/N=256 (block 256)/neighbors (Clamp) 1.69 ± 0.064 ms 1.68 ± 0.08 ms 1.01 ± 0.061
stencil/dagger/N=256 (block 256)/neighbors (Pad) 1.7 ± 0.031 ms 1.74 ± 0.029 ms 0.979 ± 0.024
stencil/dagger/N=256 (block 256)/neighbors (Reflect) 1.72 ± 0.014 ms 1.63 ± 0.064 ms 1.05 ± 0.042
stencil/dagger/N=256 (block 256)/neighbors (Wrap) 1.54 ± 0.026 ms 1.6 ± 0.064 ms 0.965 ± 0.042
stencil/dagger/N=256 (block 256)/update (+) 0.825 ± 0.11 ms 0.875 ± 0.024 ms 0.943 ± 0.13
time_to_load 1.11 ± 0.0096 s 1.13 ± 0.028 s 0.983 ± 0.026

Plots

No regressions beyond 35.0% 🎉

MPI benchmarks (4 ranks)

Dagger benchmarks: dirty vs master

master dirty master / dirty
array/dagger/N=1024 (block 512)/add (X + X) 0.0398 ± 0.0018 s 0.0388 ± 0.0017 s 1.03 ± 0.063
array/dagger/N=1024 (block 512)/alloc (rand) 11.1 ± 9.3 ms 0.0408 ± 0.0035 s 0.271 ± 0.23
array/dagger/N=1024 (block 512)/broadcast (X .+ 1) 4.33 ± 0.49 ms 3.83 ± 0.42 ms 1.13 ± 0.18
array/dagger/N=1024 (block 512)/map (sin.(X)) 6.59 ± 0.49 ms 6.69 ± 0.11 ms 0.984 ± 0.075
array/dagger/N=1024 (block 512)/norm 4.9 ± 0.024 ms 5.04 ± 0.096 ms 0.971 ± 0.019
array/dagger/N=1024 (block 512)/reduce (sum) 7.51 ± 0.006 ms 7.77 ± 0.25 ms 0.966 ± 0.031
array/dagger/N=1024 (block 512)/transpose (permutedims) 27.4 ± 0.26 ms 29.1 ± 0.062 ms 0.94 ± 0.0092
array/dagger/N=256 (block 256)/add (X + X) 11.2 ± 0.14 ms 11 ± 0.11 ms 1.01 ± 0.016
array/dagger/N=256 (block 256)/alloc (rand) 21.5 ± 19 ms 2.62 ± 0.02 ms 8.21 ± 7.2
array/dagger/N=256 (block 256)/broadcast (X .+ 1) 1.29 ± 0.079 ms 1.32 ± 0.012 ms 0.981 ± 0.06
array/dagger/N=256 (block 256)/map (sin.(X)) 1.95 ± 0.0077 ms 2.03 ± 0.0035 ms 0.96 ± 0.0041
array/dagger/N=256 (block 256)/norm 1.87 ± 0.019 ms 1.89 ± 0.069 ms 0.992 ± 0.037
array/dagger/N=256 (block 256)/reduce (sum) 2 ± 0.0065 ms 2.13 ± 0.064 ms 0.939 ± 0.028
array/dagger/N=256 (block 256)/transpose (permutedims) 6.14 ± 0.69 ms 5.56 ± 0.1 ms 1.1 ± 0.13
linalg/dagger/N=1024 (block 512)/cholesky 0.516 ± 0.026 s 0.52 ± 0.021 s 0.992 ± 0.064
linalg/dagger/N=1024 (block 512)/lu 0.0403 h 0.0487 h 0.828
linalg/dagger/N=1024 (block 512)/matmul (A*A) 1.01 ± 0.0025 s 0.986 ± 0.0018 s 1.02 ± 0.0031
linalg/dagger/N=1024 (block 512)/matvec (A*x) 0.0713 ± 0.0035 s 0.0742 ± 0.0067 s 0.961 ± 0.099
linalg/dagger/N=1024 (block 512)/qr 1.12 ± 0.035 s 1.04 ± 0.027 s 1.07 ± 0.043
linalg/dagger/N=1024 (block 512)/solve (A\b via lu) 0.042 h 0.0481 h 0.874
linalg/dagger/N=1024 (block 512)/syrk (A'*A) 0.83 ± 0.01 s 0.833 ± 0.0026 s 0.997 ± 0.012
linalg/dagger/N=256 (block 256)/cholesky 19.2 ± 0.36 ms 17.5 ± 0.72 ms 1.1 ± 0.05
linalg/dagger/N=256 (block 256)/lu 25.8 s 22.7 s 1.14
linalg/dagger/N=256 (block 256)/matmul (A*A) 13.8 ± 0.078 ms 24.8 ± 1.3 ms 0.558 ± 0.03
linalg/dagger/N=256 (block 256)/matvec (A*x) 19.4 ± 3.4 ms 19.4 ± 3 ms 1 ± 0.24
linalg/dagger/N=256 (block 256)/qr 0.05 ± 0.0021 s 0.189 ± 0.077 s 0.265 ± 0.11
linalg/dagger/N=256 (block 256)/solve (A\b via lu) 29.7 s 28.1 s 1.06
linalg/dagger/N=256 (block 256)/syrk (A'*A) 0.136 ± 0.0015 s 0.138 ± 0.0014 s 0.987 ± 0.015
stencil/dagger/N=1024 (block 512)/alloc (neighbors Wrap) 0.179 ± 0.0015 s 0.26 ± 0.0016 s 0.687 ± 0.0072
stencil/dagger/N=1024 (block 512)/assign (const) 12 ± 0.15 ms 11.7 ± 0.26 ms 1.03 ± 0.026
stencil/dagger/N=1024 (block 512)/multi-expr 29.9 ± 0.26 ms 30.6 ± 0.56 ms 0.976 ± 0.02
stencil/dagger/N=1024 (block 512)/neighbors (Clamp) 0.167 ± 0.00034 s 0.201 ± 0.0045 s 0.83 ± 0.019
stencil/dagger/N=1024 (block 512)/neighbors (Pad) 0.162 ± 0.0018 s 0.143 ± 0.0031 s 1.13 ± 0.028
stencil/dagger/N=1024 (block 512)/neighbors (Reflect) 0.166 ± 0.01 s 0.196 ± 3.5e-05 s 0.848 ± 0.051
stencil/dagger/N=1024 (block 512)/neighbors (Wrap) 0.177 ± 0.0026 s 0.245 ± 0.0094 s 0.722 ± 0.03
stencil/dagger/N=1024 (block 512)/update (+) 19.5 ± 0.7 ms 20.4 ± 0.16 ms 0.956 ± 0.035
stencil/dagger/N=256 (block 256)/alloc (neighbors Wrap) 26.2 ± 5.4 ms 26 ± 5.2 ms 1.01 ± 0.29
stencil/dagger/N=256 (block 256)/assign (const) 3.52 ± 0.081 ms 3.67 ± 0.11 ms 0.96 ± 0.035
stencil/dagger/N=256 (block 256)/multi-expr 8.81 ± 0.11 ms 8.62 ± 0.049 ms 1.02 ± 0.014
stencil/dagger/N=256 (block 256)/neighbors (Clamp) 28.3 ± 0.6 ms 23.4 ± 5.4 ms 1.21 ± 0.28
stencil/dagger/N=256 (block 256)/neighbors (Pad) 28.8 ± 0.018 ms 19 ± 0.2 ms 1.51 ± 0.016
stencil/dagger/N=256 (block 256)/neighbors (Reflect) 23.7 ± 5.5 ms 27 ± 0.79 ms 0.878 ± 0.2
stencil/dagger/N=256 (block 256)/neighbors (Wrap) 28.6 ± 0.51 ms 28.5 ± 0.36 ms 1 ± 0.022
stencil/dagger/N=256 (block 256)/update (+) 5.27 ± 0.34 ms 5.6 ± 0.31 ms 0.941 ± 0.081
time_to_load 1.1 ± 0.0093 s 1.11 ± 0.0092 s 0.995 ± 0.012

Plots

⚠️ Regressions (> 35.0%)

  • linalg/dagger/N=256 (block 256)/qr: +277.4%
  • array/dagger/N=1024 (block 512)/alloc (rand): +268.6%
  • linalg/dagger/N=256 (block 256)/matmul (A*A): +79.3%
  • stencil/dagger/N=1024 (block 512)/alloc (neighbors Wrap): +45.6%
  • stencil/dagger/N=1024 (block 512)/neighbors (Wrap): +38.5%

Improvements (> 35.0% faster)

  • array/dagger/N=256 (block 256)/alloc (rand): -87.8%

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant