---
# System prepended metadata

title: 2024-04-11 GT4Py to DaCe coordination meeting
tags: [minutes, dace]

---

# 2024-04-11 GT4Py to DaCe coordination meeting

~~The target is to get the gt4py icon dycore running and validating within the next 2 cylces (6 weeks) with DaCe.~~
For getting the icon4py dycore running and validating there are currently 3 options:

1.	GT4Py -> ITIR -> SDFG
2.	GT4Py -> Combined IR -> SDFG
3.	GT4Py -> ??? -> SDFG

Note : current workflow GT4py -> ITIR -> GTfn  ,  performance issues


## Points to discuss:
- Currently from the GT4Py team, option 2 is considered the best.
- Do we all agree that 2. is the best option?
- Why is 1. not possible ? Is it because ITIR before inlining is not representable in SDFG ?
    - it is not possible in a reasonable time to optimize fully inlined stencils - it is not possible to easily do fission.
    - this was already discussed in november
- If 2. is there any work or coordination needed between GT4Py developers and DaCe developers, is the current coordination working or do we need to change anything?
- Would the CombinedIR allow to have all needed information for future optimizations, will there be a need for a future IR refactoring in a few month?
    - there will be still some modification in the future
    - how to coordinate them with the transformation in SDFG
- Is there some work that can be started now, to prepare CombinedIR -> SDFG lowering ?
- 3. could include JAX? GT4Py -> JAX -> SDFG or direct Gt4py -> SDFG
    - 3. could not work because you can not represent domain information , and limit the DSL frontend syntax


- Where are the temporaries set : gt4py


## desired outcome 
* If possible, a realistic timeline indicating projects for the current and the subsequent cycles 


## Related Document
- current DaCe backend : https://github.com/GridTools/gt4py/blob/main/docs/development/ADRs/0014-DaCe_backend.md 
- original design of iterator view:  https://github.com/GridTools/concepts/blob/master/Iterator-View.md
- [DaCe workshop 2023-11-08](https://hackmd.io/jMdsVJmxRi-h6suXit8eEg)
-  combined IR: https://hackmd.io/fCXnShnFR96kFau7lw36ew


## Hannes sketching a time-line on CombinedIR
(AD)*This is helpful. Would be good to extend this timeline to a performance goal.* 

1. Cycle 21: new ITIR (-> CombinedIR) typesystem, reason see https://hackmd.io/lrjA8ZavQiCMvDD_8hIxwg
2. Cycle 21: (partial) CombinedIR lowering to SDFG (tests starting from CombinedIR to SDFG, all maps annotated with domain), no execution
3. Cycle 21: prepare ITIR (see https://hackmd.io/h_lELsaZSEmtJ6zQvsakaA), specifically Fencil->Program aspect
4. Cycle 21: upgrade domain(shape)-inference pass to annotate maps with domains
5. Cycle 22?: Lowering from frontend (PAST/FOAST) to CombinedIR (field view extreme of CombinedIR)
6. Cycle 22/23?: Program -> SDFG
7. Cycle 22/23?: Temporary placement in CombinedIR
8. Cycle 23/24?: Tests on ICON4Py, optimizations

```graphviz
digraph {
  rankdir="RL"
  1 [label="typesystem"]
  2 [label="CIR2SDFG lowering from tests"]
  3 [label="Prepare ITIR for CIR"]
  4 [label="map domain inference"]
  5 [label="frontend2CIR"]
  6 [label="Program2SDFG"]
  7 [label="Temporary placement CIR", style="dashed"]
  8 [label="ICON4Py testing"]
  
  5 -> 1
  5 -> 3
  6 -> 5
  6 -> 4
  6 -> 2
  7 -> 5
  7 -> 4
  8 -> 7 [style=dashed]
  8 -> 6
}
```


## Next steps

- Start today unittest for combined IR to SDFG - allow to start writting the translator using hand written combined IR.
- How to translate special cases : scan, dynamic offset ? -> Start with whatever, this is not relevant for performance - not clear
- Wait until we can generate automatically SDFG to start working on optimization
- Is it possible to bring domain information / hint to DaCe : not for the sort term : this will be decided once we have the dycore running.
- Todos for DaCe should be discuss at the DaCe / gt4py weekly meeting
- What is the path to make a product on the DaCe side? Still to be discuss later. On step is to add test.


## Scratchpad


### Performance risk - Horizontal boundary conditions

```python
b_vertex_tmp = a+b
i_vertex_tmp = a*b

start, stop = compute_inverse_image(E2V[0], starting_domain)

boundary_only = b_vertex_tmp[start:stop](E2V[0])
interior = i_vertex_tmp(E2V[0])

concat_where(vertex_idx == lateral_boundary, boundary_only, interior)
```