Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
f6e16a5
Unify DataLayouts and simplify API
dennisYatunin Jun 3, 2026
3f5dc1c
Propagate unified DataLayouts API and refine it after review
dennisYatunin Jul 14, 2026
5687c82
Fix GPU incompatibilities and remaining unmigrated code
dennisYatunin Jul 14, 2026
caabfdd
Fix GPU reductions, kernel-side slice lengths, and mask device placement
dennisYatunin Jul 14, 2026
0813afe
Refine DataLayouts views, scopes, and property access
dennisYatunin Jul 15, 2026
d95cc41
Make DataLayouts device kernels GPU-compilable
dennisYatunin Jul 15, 2026
67bbb1b
Fix GPU kernel compilation for reductions, broadcasts, and slice views
dennisYatunin Jul 15, 2026
5120e48
Allocate DSS internal/perimeter element indices on the device
dennisYatunin Jul 16, 2026
b210b5e
Fix GPU limiter slab indexing by reusing apply_limit_slab! in the kernel
dennisYatunin Jul 16, 2026
d165042
Route foreach_slice and reduce_points launches through auto_launch!
dennisYatunin Jul 16, 2026
ed1b699
Apply JuliaFormatter
dennisYatunin Jul 16, 2026
c5e6e2e
Add temporary NVPTX segfault probe job
dennisYatunin Jul 16, 2026
8cb2138
Construct type-stable SubArray views of GPU arrays
dennisYatunin Jul 16, 2026
e498344
Add deprecated.jl with old DataLayouts type aliases
dennisYatunin Jul 16, 2026
c6ed80b
Update docs debugging examples to the new VIJFH constructor
dennisYatunin Jul 16, 2026
5684289
Export the deprecated DataLayouts aliases
dennisYatunin Jul 16, 2026
a7081e2
Fix docbuild errors
dennisYatunin Jul 16, 2026
6ca2c71
Add TestCompilation, a device-free CPU/GPU compilation checker
dennisYatunin Jul 16, 2026
6ade3a9
Replace nested_view with stable_view and drop automatic reshaping
dennisYatunin Jul 16, 2026
686cf36
Shorten code comments and tighten reduction utilities
dennisYatunin Jul 16, 2026
47952d4
Fix 4-D indexing of 5-D vertex arrays in ClimaCoreMakie
dennisYatunin Jul 16, 2026
efb541a
Make field_byte_offset optionally generated to fix FD broadcast alloc…
dennisYatunin Jul 16, 2026
c616555
Pass fill values to GPU kernels as base type entries
dennisYatunin Jul 16, 2026
023a923
Use full-rank indices in the mass borrowing limiter kernel
dennisYatunin Jul 16, 2026
4de65a8
Update GPU test expectations after the launch and view fixes
dennisYatunin Jul 16, 2026
1ff4cd6
Avoid capturing the element type in the fill! kernel closure
dennisYatunin Jul 16, 2026
07877bd
Allocate columnwise local memory with canonical parent shapes
dennisYatunin Jul 16, 2026
03ee458
Adapt the pairs inside FusedMultiBroadcast
dennisYatunin Jul 16, 2026
6f7540b
Skip GPU allocation checks that straddle their tolerance
dennisYatunin Jul 16, 2026
82b7d86
Remove the temporary NVPTX segfault probe
dennisYatunin Jul 16, 2026
6d6fe52
Fix stale docs binding and bound the unit test heap size
dennisYatunin Jul 16, 2026
ff9f05a
Revert the julia-args input for julia-runtest
dennisYatunin Jul 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .buildkite/Manifest.toml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions .buildkite/Project.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ ClimaCore = "d414da3d-4745-48bb-8d80-42e94e092884"
ClimaCorePlots = "cf7c7e5a-b407-4c48-9047-11a94a308626"
ClimaCoreTempestRemap = "d934ef94-cdd4-4710-83d6-720549644b70"
ClimaCoreVTK = "c8b6d40d-e815-466f-95ae-c48aefa668fa"
ClimaInterpolations = "dd0f122e-fa3b-47f3-bcf0-93bbc60d885e"
ClimaParams = "5c42b081-d73a-476f-9059-fd94b934656c"
ClimaTimeSteppers = "595c0a79-7f3d-439a-bc5a-b232dc3bde79"
Colors = "5ae59095-9a9b-59fe-a467-6f913c188581"
Expand Down
115 changes: 29 additions & 86 deletions .buildkite/pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -101,79 +101,49 @@ steps:
retry: *retry_policy
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/Utilities/unit_auto_broadcaster.jl"

- label: "Unit: test compilation checker"
key: unit_test_compilation
retry: *retry_policy
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/Utilities/unit_test_compilation.jl"

- group: "Unit: DataLayouts"
steps:

- label: "Unit: data0d"
key: unit_data0d
- label: "Unit: data fill and copyto (1 thread)"
key: unit_data_fill_and_copyto
retry: *retry_policy
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/data0d.jl"
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/unit_fill_and_copyto.jl"

- label: "Unit: data_fill"
key: unit_data_fill
- label: "Unit: data fill and copyto (4 threads)"
key: threaded_unit_data_fill_and_copyto
retry: *retry_policy
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/unit_fill.jl"
command: "julia --threads=4 --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/unit_fill_and_copyto.jl"

- label: "Unit: data_copyto"
key: unit_data_copyto
- label: "Unit: data loops (1 thread)"
key: unit_data_loops
retry: *retry_policy
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/unit_copyto.jl"
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/unit_loops.jl"

- label: "Unit: cartesian_field_index"
key: unit_data_cartesian_field_index
- label: "Unit: data loops (4 threads)"
key: threaded_unit_data_loops
retry: *retry_policy
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/unit_cartesian_field_index.jl"
command: "julia --threads=4 --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/unit_loops.jl"

- label: "Unit: non_extruded_broadcast"
key: unit_non_extruded_broadcast
retry: *retry_policy
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/unit_non_extruded_broadcast.jl"

- label: "Unit: mapreduce"
- label: "Unit: mapreduce (1 thread)"
key: unit_data_mapreduce
retry: *retry_policy
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/unit_mapreduce.jl"

- label: "Unit: mapreduce (4 threads)"
key: threaded_unit_data_mapreduce
retry: *retry_policy
command: "julia --threads=4 --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/unit_mapreduce.jl"

- label: "Unit: data_opt_similar"
key: data_opt_similar
retry: *retry_policy
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/opt_similar.jl"

- label: "Unit: opt_universal_size"
key: opt_universal_size
retry: *retry_policy
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/opt_universal_size.jl"

- label: "Unit: data_ndims"
key: unit_data_ndims
retry: *retry_policy
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/unit_ndims.jl"

- label: "Unit: unit_data2array"
key: unit_data2array
retry: *retry_policy
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/unit_data2array.jl"

- label: "Unit: data1d"
key: unit_data1d
retry: *retry_policy
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/data1d.jl"

- label: "Unit: data2d"
key: unit_data2d
retry: *retry_policy
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/data2d.jl"

- label: "Unit: data1dx"
key: unit_data1dx
retry: *retry_policy
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/data1dx.jl"

- label: "Unit: data2dx"
key: unit_data2dx
retry: *retry_policy
command: "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/data2dx.jl"

- label: "Unit: data cuda"
key: unit_data_cuda
retry: *retry_policy
Expand All @@ -196,18 +166,18 @@ steps:
agents:
slurm_gpus: 1

- label: "Unit: data fill"
key: gpu_unit_data_fill
- label: "Unit: data fill and copyto (1 gpu)"
key: gpu_unit_data_fill_and_copyto
retry: *retry_policy
command:
- "julia --project=.buildkite -e 'using CUDA; CUDA.versioninfo()'"
- "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/unit_fill.jl"
- "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/unit_fill_and_copyto.jl"
env:
CLIMACOMMS_DEVICE: "CUDA"
agents:
slurm_gpus: 1

- label: "Unit: data mapreduce"
- label: "Unit: data mapreduce (1 gpu)"
key: gpu_unit_data_mapreduce
retry: *retry_policy
command:
Expand All @@ -233,17 +203,6 @@ steps:
modules: mpiwrapper/2024_05_27 climacommon/2026_02_18
soft_fail: true # remove this after library issues are fixed

- label: "Unit: data copyto"
key: gpu_unit_data_copyto
retry: *retry_policy
command:
- "julia --project=.buildkite -e 'using CUDA; CUDA.versioninfo()'"
- "julia --color=yes --check-bounds=yes --project=.buildkite test/DataLayouts/unit_copyto.jl"
env:
CLIMACOMMS_DEVICE: "CUDA"
agents:
slurm_gpus: 1

- group: "Unit: Geometry"
steps:

Expand Down Expand Up @@ -1624,27 +1583,11 @@ steps:
- group: "Perf: DataLayouts"
steps:

- label: "Perf: DataLayouts fill"
key: "cpu_datalayouts_fill"
retry: *retry_policy
command: "julia --color=yes --project=.buildkite test/DataLayouts/benchmark_fill.jl"

- label: "Perf: DataLayouts copyto!"
key: "cpu_datalayouts_copyto"
retry: *retry_policy
command: "julia --color=yes --project=.buildkite test/DataLayouts/benchmark_copyto.jl"

- label: "Perf: DataLayouts fill"
key: "gpu_datalayouts_fill"
retry: *retry_policy
command:
- "julia --project=.buildkite -e 'using CUDA; CUDA.versioninfo()'"
- "julia --color=yes --project=.buildkite test/DataLayouts/benchmark_fill.jl"
env:
CLIMACOMMS_DEVICE: "CUDA"
agents:
slurm_gpus: 1

- label: "Perf: DataLayouts copyto"
key: "gpu_datalayouts_copyto"
retry: *retry_policy
Expand Down Expand Up @@ -2093,7 +2036,7 @@ steps:
env:
TEST_NAME: "sphere/baroclinic_wave_rhoe_hf"
FLOAT_TYPE: "Float32"
horizontal_layout_type: "IJHF"
horizontal_layout_type: "VIJHF"
CLIMACOMMS_DEVICE: "CUDA"
agents:
slurm_gpus: 1
Expand Down Expand Up @@ -2414,7 +2357,7 @@ steps:
env:
TEST_NAME: "sphere/baroclinic_wave_rhoe_hf"
FLOAT_TYPE: "Float64"
horizontal_layout_type: "IJHF"
horizontal_layout_type: "VIJHF"

- label: ":computer: 3D sphere baroclinic wave (ρe)"
key: "cpu_baroclinic_wave_rho_e"
Expand Down
6 changes: 5 additions & 1 deletion .github/workflows/docs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,11 @@ jobs:
- name: Install dependencies
run: >
julia --project=docs -e 'using Pkg; Pkg.develop(path=".");
Pkg.develop(path="lib/ClimaCoreVTK");
Pkg.develop(path="lib/ClimaCoreVTK");
Pkg.develop(path="lib/ClimaCoreTempestRemap");
Pkg.develop(path="lib/ClimaCoreMakie");
Pkg.develop(path="lib/ClimaCorePlots");
Pkg.develop(path="lib/ClimaCoreSpectra");
Pkg.instantiate(;verbose=true)'
- name: Build and deploy
env:
Expand Down
4 changes: 2 additions & 2 deletions benchmarks/scripts/index_swapping.jl
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ function custom_kernel_knl_bc_1swap!(y1, bc, us)
if tidx ≤ get_N(us)
n = (get_Nij(us), get_Nij(us), 1, get_Nv(us), get_Nh(us))
GCI = CartesianIndices(map(x -> Base.OneTo(x), n))[tidx]
# Perform index swap (as in `getindex(::AbstractData, ::CartesianIndex)`)
# Perform index swap (as in `getindex(::DataLayout, ::CartesianIndex)`)
i, j, _, v, h = GCI.I
CI = CartesianIndex(v, i, j, 1, h)
y1[CI] = bc[CI]
Expand Down Expand Up @@ -140,7 +140,7 @@ function custom_kernel_knl_bc_2swap!(y1, bc, us)
(v, i, j, _, h) = CIK.I
GCI = CartesianIndex(i, j, 1, v, h)

# Swap again (in `getindex(::AbstractData, ::CartesianIndex)`)
# Swap again (in `getindex(::DataLayout, ::CartesianIndex)`)
(i, j, _, v, h) = GCI.I
CI = CartesianIndex(v, i, j, 1, h)
y1[CI] = bc[CI]
Expand Down
2 changes: 1 addition & 1 deletion benchmarks/scripts/thermo_bench.jl
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ using Test
)
x = fill((; ts = nt_ts, nt_core...), cspace)
xv = fill((; ts = nt_ts, nt_core...), cspace)
(_, Nij, _, Nv, Nh) = size(Fields.field_values(x.ts))
(Nv, Nij, _, Nh) = size(Fields.field_values(x.ts))
us = TB.UniversalSizesStatic(Nv, Nij, Nh)
function to_vec(ξ)
pns = propertynames(ξ)
Expand Down
2 changes: 1 addition & 1 deletion benchmarks/scripts/thermo_bench_bw.jl
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ using Test
)
x = fill((; ts = zero(TBB.PhaseEquil{FT}), nt_core...), cspace)
xv = fill((; ts = nt_ts, nt_core...), cspace)
(_, Nij, _, Nv, Nh) = size(Fields.field_values(x.ts))
(Nv, Nij, _, Nh) = size(Fields.field_values(x.ts))
us = TBB.UniversalSizesStatic(Nv, Nij, Nh)
function to_vec(ξ)
pns = propertynames(ξ)
Expand Down
2 changes: 1 addition & 1 deletion docs/clima_core_specific.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ ClimaCore.jl provides the dynamical core infrastructure for [CliMA](https://clim
1. **`Field`** (`src/Fields/`) — the primary data type. A field wraps data on a space and supports broadcast, reductions, and operator application.
2. **`Space`** (`src/Spaces/`) — represents a discretized function space (spectral element, finite-difference, or extruded hybrid). Constructed from a grid and a quadrature rule.
3. **Operators** (`src/Operators/`) — lazy differential operators (gradient, divergence, curl, interpolation, restriction) that compose via Julia's broadcast system.
4. **`DataLayout`** (`src/DataLayouts/`) — the storage backends (IJFH, VIJFH, VF, etc.) that determine memory layout for CPU vs GPU performance.
4. **`DataLayout`** (`src/DataLayouts/`) — the storage backends (VIJFH, VIJHF, etc.) that determine memory layout for CPU vs GPU performance.
5. **`MatrixFields`** (`src/MatrixFields/`) — banded-matrix field algebra used for implicit vertical solvers and Jacobian construction.

## Test groups
Expand Down
95 changes: 84 additions & 11 deletions docs/src/APIs/datalayouts_api.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,85 @@
CurrentModule = ClimaCore
```

## Data layouts

```@docs
DataLayouts
DataLayouts.DataLayout
DataLayouts.DataF
DataLayouts.IF
DataLayouts.IJF
DataLayouts.VF
DataLayouts.IFH
DataLayouts.IJFH
DataLayouts.VIFH
DataLayouts.VIJHWithF
DataLayouts.VIJFH
DataLayouts.IHF
DataLayouts.IJHF
DataLayouts.VIHF
DataLayouts.VIJHF
DataLayouts.VIH1
DataLayouts.IH1JH2
```

## Layout properties

```@docs
DataLayouts.layout_type
DataLayouts.parent_type
DataLayouts.f_dim
DataLayouts.shape_params
DataLayouts.inferred_size
DataLayouts.has_inferred_size
DataLayouts.vijh_params
DataLayouts.nlevels
DataLayouts.nquadpoints
DataLayouts.nelems
DataLayouts.ncomponents
DataLayouts.layout_constructor
DataLayouts.rebuild
DataLayouts.reassign
```

## Data scopes

```@docs
DataLayouts.DataScope
DataLayouts.ThisThread
DataLayouts.ThisThreadPool
DataLayouts.partition
DataLayouts.is_subscope
DataLayouts.num_threads
DataLayouts.num_partitions
DataLayouts.thread_rank
DataLayouts.partition_rank
DataLayouts.parallelize_over
DataLayouts.synchronize
DataLayouts.scoped_array
DataLayouts.scoped_static_array
DataLayouts.strided_access
DataLayouts.subscope_indices
```

## Loops and reductions

```@docs
DataLayouts.each_slice_index
DataLayouts.slice_subscope
DataLayouts.foreach_slice
DataLayouts.foreach_point
DataLayouts.foreach_level
DataLayouts.foreach_slab
DataLayouts.foreach_column
DataLayouts.reduce_points
DataLayouts.column_reduce!
```

## Masks

```@docs
DataLayouts.DataMask
DataLayouts.NoMask
DataLayouts.IJHMask
DataLayouts.set_mask_maps!
DataLayouts.should_compute
```

## Struct storage

```@docs
DataLayouts.bitcast_struct
DataLayouts.default_basetype
DataLayouts.check_basetype
Expand All @@ -26,6 +91,14 @@ DataLayouts.num_basetypes
DataLayouts.struct_field_view
DataLayouts.set_struct!
DataLayouts.get_struct
DataLayouts.parent_array_type
DataLayouts.promote_parent_array_type
DataLayouts.view_struct
```

## Broadcasting

```@docs
DataLayouts.DataStyle
DataLayouts.LazyDataLayout
DataLayouts.layout_args
DataLayouts.modify_args
```
1 change: 0 additions & 1 deletion docs/src/APIs/dss_api.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ Topologies.dss_transform
Topologies.dss_transform!
Topologies.dss_untransform!
Topologies.dss_untransform
Topologies.dss_local_vertices!
Topologies.dss_local!
Topologies.dss_local_ghost!
Topologies.dss_ghost!
Expand Down
3 changes: 3 additions & 0 deletions docs/src/APIs/utilities_api.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@ Utilities.unionall_type
Utilities.replace_type_parameter
Utilities.fieldtype_vals
Utilities.new
Utilities.is_inferred_type
Utilities.return_type
Utilities.unsafe_eltype
Utilities.safe_eltype
Utilities.stable_view
```

## Utilities.PlusHalf
Expand Down
Loading