# DaCe workshop
## Preparation
### Topics GT4Py intro
* GT4Py overview (Hannes)
* Workflows (frontends, backends)
* Field View + ITIR => Combined IR (Enrique/Hannes)
* [Field-view](https://github.com/havogt/intro_to_gt4py)
* [ICON Python Dycore frontend overview](https://docs.google.com/presentation/d/1v3QO7NItInjbxGkJKk3jGzvRS9WcGXu1EkEWwvLACs8/edit?usp=sharing)([Office 365](https://ethz-my.sharepoint.com/:p:/r/personal/tille_ethz_ch/Documents/ICON%20Python%20dycore%20-%20Frontend%20overview.pptx?d=w0ddde6cba60f4f348534e19d98777818&csf=1&web=1&e=YctQoh))
* [Formalize Field-View concepts](https://hackmd.io/@gridtools/rJje3XbNn)
* [Combined IR sketch](https://github.com/havogt/gt4py/blob/combined_ir/src/gt4py/next/lap.py)
* Iterator IR syntax and operators (Hannes/Enrique/Till)
* [concepts/Iterator-View.md](https://github.com/GridTools/concepts/blob/master/Iterator-View.md)
* Iterator IR passes (e.g. lift inlining, reduction unrolling, temporaries) (Till)
* Eve infrastructure (Enrique)
- [`gt4py.eve`](https://github.com/GridTools/gt4py/tree/main/src/gt4py/eve)
- [`eve.datamodels`](https://github.com/GridTools/gt4py/tree/main/src/gt4py/eve/datamodels) = [dataclasses](https://docs.python.org/3/library/dataclasses.html) + [attrs](https://www.attrs.org/en/stable/examples.html) validators & converters) * [pydantic.Datamodels](https://docs.pydantic.dev/latest/#pydantic-examples)
- [`eve.extended_typing`](https://github.com/GridTools/gt4py/blob/main/src/gt4py/eve/extended_typing.py) = [standard typing](https://docs.python.org/3/library/typing.html) + [typing_extensions](https://typing-extensions.readthedocs.io/en/latest/#module-contents)
- [`eve.codegen`](https://github.com/GridTools/gt4py/blob/main/src/gt4py/eve/codegen.py) = node_visitors + string templates
- [`eve_tests`](https://github.com/GridTools/gt4py/tree/main/tests/eve_tests/unit_tests)
* icon4py → gt4py → dace execution flow (Edoardo)
* gt4py.cartesian
* [Description of the Optimization Intermediate Representation (OIR)](https://hackmd.io/LtuWbpAzSCKNVwtMFBFh9Q)
* "DaCe orchestration"
* optimizations
---
* Glossary: what do we call IR, frontend, backend, etc...
### SDFG Refresher
* Short intro to SDFG focused only on elements likely relevant for workshop (Ben)
### Questions to DaCe future:
- jax 2 DaCe
- dace-mlir
- builtin/intrinsic library nodes
### Discussion points
- can_deref implementation with select memlet
- AOT vs JIT
### Outlook
-------------------
## Minutes
### GT4Py overview (Hannes)
- Hannes presented slides from another internal EXCLAIM gt4py workshop one year ago
- Double roundtrip ITIR backend makes sure the user-written IR gets canonicalized properly to ITIR using the builtin functions:
```python!
def diff(inp):
return deref(shift(I,1)(inp)) - deref(shift(I,-1)(inp))
def diff(inp):
return minus(deref(shift(I,1)(inp)), deref(shift(I,-1)(inp)))
```
- Ideal SDFG representations should have:
- As few states as possibles
- It doesn't need to have maps, loops are also ok
- As less boilerplate and concrete implementation details as possible ?
- Action points:
- Try different flags in the current ITIR - DaCe backend
- Try some improvements in the ITIR - DaCe backend (memlets, ... ?)
- Compare the generated SDFGs from the current ITIR - DaCe backend and the NumPy Dace frontend using the validation Numpy stencils in icon4py
### Scratch
```python!
# def diff(inp):
# return deref(shift(I,1)(inp)) - deref(shift(I,-1)(inp))
@fundef
def diff(inp: iterator):
return minus(deref(shift(I,1)(inp)), deref(shift(I,-1)(inp)))
@fencil(buffer_info={"inp": ...})
def diff_program(inp, out2):
tmp = allocate_tmp()
closure(diff, domain=..., [inp], tmp)
closure(diff, domain=..., [tmp], out2)
@fundef
def diff_twice(inp):
return diff(lift(diff)(inp))
@fencil
def diff_twice_program(inp, out):
closure(diff_twice, domain=..., [inp], out)
diff_program(inp, out)
```