Skip to content

Commit c03040e

Browse files
Refactor stencil kernels to show mem bandwidth
1 parent 40e6cf3 commit c03040e

File tree

3 files changed

+146
-80
lines changed

3 files changed

+146
-80
lines changed

test/Operators/finitedifference/benchmark_stencils.jl

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,22 @@ include("benchmark_stencils_utils.jl")
66

77
#! format: off
88
@testset "Benchmark operators" begin
9-
# benchmark_operators_column(Float64; z_elems = 63, helem = 30, Nq = 4, compile = true)
10-
benchmark_operators_column(Float64; z_elems = 63, helem = 30, Nq = 4)
9+
# column_benchmark_arrays(device, z_elems = 63, bm.float_type)
10+
# sphere_benchmark_arrays(device, z_elems = 63, helem = 30, Nq = 4, bm.float_type)
1111

12-
# benchmark_operators_sphere(Float64; z_elems = 63, helem = 30, Nq = 4, compile = true)
13-
benchmark_operators_sphere(Float64; z_elems = 63, helem = 30, Nq = 4)
12+
bm = Benchmark(;float_type = Float64, device_name)
13+
# benchmark_operators_column(bm; z_elems = 63, helem = 30, Nq = 4, compile = true)
14+
(;t_min) = benchmark_operators_column(bm; z_elems = 63, helem = 30, Nq = 4)
15+
test_results_column(t_min)
16+
17+
bm = Benchmark(;float_type = Float64, device_name)
18+
# benchmark_operators_sphere(bm; z_elems = 63, helem = 30, Nq = 4, compile = true)
19+
(;t_min) = benchmark_operators_sphere(bm; z_elems = 63, helem = 30, Nq = 4)
20+
test_results_sphere(t_min)
21+
22+
bm = Benchmark(;float_type = Float32, device_name)
23+
# benchmark_operators_sphere(bm; z_elems = 63, helem = 30, Nq = 4, compile = true)
24+
(;t_min) = benchmark_operators_sphere(bm; z_elems = 63, helem = 30, Nq = 4)
1425
end
1526
#! format: on
1627

test/Operators/finitedifference/benchmark_stencils_climacore_kernels.jl

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,107 +4,126 @@ function op_GradientF2C!(c, f, bcs = (;))
44
@. c.∇x = ∇f(f.y)
55
return nothing
66
end
7+
n_reads_writes(::Type{typeof(op_GradientF2C!)}) = 2 # 1 write + 1 read (0 metric terms)
78
function op_GradientC2F!(c, f, bcs)
89
∇f = Operators.GradientC2F(bcs)
910
@. f.∇x = ∇f(c.y)
1011
return nothing
1112
end
13+
n_reads_writes(::Type{typeof(op_GradientC2F!)}) = 2 # 1 write + 1 read (0 metric terms)
1214
#### Divergences
1315
function op_DivergenceF2C!(c, f, bcs = (;))
1416
div = Operators.DivergenceF2C(bcs)
1517
@. c.x = div(Geometry.WVector(f.y))
1618
return nothing
1719
end
20+
n_reads_writes(::Type{typeof(op_DivergenceF2C!)}) = 3 # 1 write + 2 reads (1 metric term)
1821
function op_DivergenceC2F!(c, f, bcs)
1922
div = Operators.DivergenceC2F(bcs)
2023
@. f.x = div(Geometry.WVector(c.y))
2124
return nothing
2225
end
26+
n_reads_writes(::Type{typeof(op_DivergenceC2F!)}) = 3 # 1 write + 2 reads (1 metric term)
2327
#### Interpolations
2428
function op_InterpolateF2C!(c, f, bcs = (;))
2529
interp = Operators.InterpolateF2C(bcs)
2630
@. c.x = interp(f.y)
2731
return nothing
2832
end
33+
n_reads_writes(::Type{typeof(op_InterpolateF2C!)}) = 2 # 1 write + 1 reads (0 metric terms)
2934
function op_InterpolateC2F!(c, f, bcs)
3035
interp = Operators.InterpolateC2F(bcs)
3136
@. f.x = interp(c.y)
3237
return nothing
3338
end
39+
n_reads_writes(::Type{typeof(op_InterpolateC2F!)}) = 2 # 1 write + 1 reads (0 metric terms)
3440
function op_LeftBiasedC2F!(c, f, bcs)
3541
interp = Operators.LeftBiasedC2F(bcs)
3642
@. f.x = interp(c.y)
3743
return nothing
3844
end
45+
n_reads_writes(::Type{typeof(op_LeftBiasedC2F!)}) = 2 # 1 write + 1 reads (0 metric terms)
3946
function op_LeftBiasedF2C!(c, f, bcs = (;))
4047
interp = Operators.LeftBiasedF2C(bcs)
4148
@. c.x = interp(f.y)
4249
return nothing
4350
end
51+
n_reads_writes(::Type{typeof(op_LeftBiasedF2C!)}) = 2 # 1 write + 1 reads (0 metric terms)
4452
function op_RightBiasedC2F!(c, f, bcs)
4553
interp = Operators.RightBiasedC2F(bcs)
4654
@. f.x = interp(c.y)
4755
return nothing
4856
end
57+
n_reads_writes(::Type{typeof(op_RightBiasedC2F!)}) = 2 # 1 write + 1 reads (0 metric terms)
4958
function op_RightBiasedF2C!(c, f, bcs = (;))
5059
interp = Operators.RightBiasedF2C(bcs)
5160
@. c.x = interp(f.y)
5261
return nothing
5362
end
63+
n_reads_writes(::Type{typeof(op_RightBiasedF2C!)}) = 2 # 1 write + 1 reads (0 metric terms)
5464
#### Curl
5565
function op_CurlC2F!(c, f, bcs = (;))
5666
curl = Operators.CurlC2F(bcs)
5767
@. f.curluₕ = curl(c.uₕ)
5868
return nothing
5969
end
70+
n_reads_writes(::Type{typeof(op_CurlC2F!)}) = -1 # todo
6071
#### Mixed/adaptive
6172
function op_UpwindBiasedProductC2F!(c, f, bcs = (;))
6273
upwind = Operators.UpwindBiasedProductC2F(bcs)
6374
@. f.contra3 = upwind(f.w, c.x)
6475
return nothing
6576
end
77+
n_reads_writes(::Type{typeof(op_UpwindBiasedProductC2F!)}) = -1 # todo
6678
function op_Upwind3rdOrderBiasedProductC2F!(c, f, bcs = (;))
6779
upwind = Operators.Upwind3rdOrderBiasedProductC2F(bcs)
6880
@. f.contra3 = upwind(f.w, c.x)
6981
return nothing
7082
end
83+
n_reads_writes(::Type{typeof(op_Upwind3rdOrderBiasedProductC2F!)}) = -1 # todo
7184
#### Simple composed (non-exhaustive due to combinatorial explosion)
7285
function op_divgrad_CC!(c, f, bcs)
7386
grad = Operators.GradientC2F(bcs.inner)
7487
div = Operators.DivergenceF2C(bcs.outer)
7588
@. c.y = div(grad(c.x))
7689
return nothing
7790
end
91+
n_reads_writes(::Type{typeof(op_divgrad_CC!)}) = 3 # 1 write, 2 reads (1 metric term)
7892
function op_divgrad_FF!(c, f, bcs)
7993
grad = Operators.GradientF2C(bcs.inner)
8094
div = Operators.DivergenceC2F(bcs.outer)
8195
@. f.y = div(grad(f.x))
8296
return nothing
8397
end
98+
n_reads_writes(::Type{typeof(op_divgrad_FF!)}) = 3 # 1 write, 2 reads (1 metric term)
8499
function op_div_interp_CC!(c, f, bcs)
85100
interp = Operators.InterpolateC2F(bcs.inner)
86101
div = Operators.DivergenceF2C(bcs.outer)
87102
@. c.y = div(interp(c.contra3))
88103
return nothing
89104
end
105+
n_reads_writes(::Type{typeof(op_div_interp_CC!)}) = -1 # todo
90106
function op_div_interp_FF!(c, f, bcs)
91107
interp = Operators.InterpolateF2C(bcs.inner)
92108
div = Operators.DivergenceC2F(bcs.outer)
93109
@. f.y = div(interp(f.contra3))
94110
return nothing
95111
end
112+
n_reads_writes(::Type{typeof(op_div_interp_FF!)}) = -1 # todo
96113
function op_divgrad_uₕ!(c, f, bcs)
97114
grad = Operators.GradientC2F(bcs.inner)
98115
div = Operators.DivergenceF2C(bcs.outer)
99116
@. c.uₕ2 = div(f.y * grad(c.uₕ))
100117
return nothing
101118
end
119+
n_reads_writes(::Type{typeof(op_divgrad_uₕ!)}) = -1 # todo
102120
function op_divUpwind3rdOrderBiasedProductC2F!(c, f, bcs)
103121
upwind = Operators.Upwind3rdOrderBiasedProductC2F(bcs.inner)
104122
divf2c = Operators.DivergenceF2C(bcs.outer)
105123
@. c.y = divf2c(upwind(f.w, c.x))
106124
return nothing
107125
end
126+
n_reads_writes(::Type{typeof(op_divUpwind3rdOrderBiasedProductC2F!)}) = -1 # todo
108127

109128
function op_broadcast_example0!(c, f, bcs)
110129
Fields.bycolumn(axes(f.ᶠu³)) do colidx
@@ -113,6 +132,7 @@ function op_broadcast_example0!(c, f, bcs)
113132
end
114133
return nothing
115134
end
135+
n_reads_writes(::Type{typeof(op_broadcast_example0!)}) = 3 # 1 write, 2 reads (0 metric term)
116136

117137
function op_broadcast_example1!(c, f, bcs)
118138
Fields.bycolumn(axes(f.ᶠu³)) do colidx
@@ -121,12 +141,14 @@ function op_broadcast_example1!(c, f, bcs)
121141
end
122142
return nothing
123143
end
144+
n_reads_writes(::Type{typeof(op_broadcast_example1!)}) = 4 # 1 write, 3 reads (1 metric term)
124145

125146
function op_broadcast_example2!(c, f, bcs)
126147
CT3 = Geometry.Contravariant3Vector
127148
@. f.ᶠu³ = f.ᶠuₕ³ + CT3(f.ᶠw)
128149
return nothing
129150
end
151+
n_reads_writes(::Type{typeof(op_broadcast_example2!)}) = 4 # 1 write, 3 reads (1 metric term)
130152

131153
#=
132154
#####

0 commit comments

Comments
 (0)