As far as I can tell the recent fix to LoopToMap introduced a change in behaviour.
The PR also modified how SDFG::_used_symbols_internal() works and in my opinion changed it in a non desirable way.
Consider the following script:
import dace
import pytest
def _make_sdfg_with_unused_transient(create_unused_transient: bool) -> dace.SDFG:
sdfg = dace.SDFG("unused_transient")
state = sdfg.add_state()
for name in "ab":
sdfg.add_array(
name,
shape=(10,),
dtype=dace.float64,
transient=False,
)
sdfg.add_symbol("x_shape", dace.int32)
if create_unused_transient:
sdfg.add_array(
"x",
shape=("x_shape",),
dtype=dace.float32,
transient=True,
)
state.add_mapped_tasklet(
"map",
map_ranges={"__i": "0:10"},
inputs={"__in": dace.Memlet("a[__i]")},
code="__out = __in + 1.90",
outputs={"__out": dace.Memlet("b[__i]")},
external_edges=True,
)
return sdfg
if __name__ == "__main__":
create_unused_transient = True
sdfg: dace.SDFG = _make_sdfg_with_unused_transient(create_unused_transient)
print(f"Free Symbols: {sdfg.free_symbols}")
print(f"arglist(): {sdfg.arglist()}")
print(f"signature_arglist(): {sdfg.signature_arglist()}")
print(f"signature_init_arglist(): {sdfg.init_signature()}")
As you can see depending on create_unused_transient the SDFG may or may not contain data descriptor with name x, that when it is present is not used.
Furthermore, the array has a symbolic size of x_shape, that symbol, however, is always present.
If you run that script using DaCe 2.0.0a3, then x_shape will not be part of the signature.
But if you use current main (a6717b608f497190205d) then x_shape will part of the signature if create_unused_transient is True.
However, if create_unused_transient is False then it will not be present.
It is important to notice that even if x_shape is present in the signature it is not used, i.e. the array is not allocated.
My question now is what is the correct behaviour?
In my opinion x_shape should not be part of the signature and this is an unintended side effect.
As far as I can tell the recent fix to
LoopToMapintroduced a change in behaviour.The PR also modified how
SDFG::_used_symbols_internal()works and in my opinion changed it in a non desirable way.Consider the following script:
As you can see depending on
create_unused_transientthe SDFG may or may not contain data descriptor with namex, that when it is present is not used.Furthermore, the array has a symbolic size of
x_shape, that symbol, however, is always present.If you run that script using DaCe
2.0.0a3, thenx_shapewill not be part of the signature.But if you use current
main(a6717b608f497190205d) thenx_shapewill part of the signature ifcreate_unused_transientisTrue.However, if
create_unused_transientisFalsethen it will not be present.It is important to notice that even if
x_shapeis present in the signature it is not used, i.e. the array is not allocated.My question now is what is the correct behaviour?
In my opinion
x_shapeshould not be part of the signature and this is an unintended side effect.