Skip to content

Influence of Unused Transient on the Signature #2382

Description

@philip-paul-mueller

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions