Development Errors and Gotchas
This section describes common errors and gotchas that you may encounter when extending DaCe.
The default traversal order of DaCe is not guaranteed to be deterministic. This means that if you
write a transformation that depends on the order of nodes in the SDFG, it may not work as expected.
To fix this, you can use the
dfs_topological_sort() function to sort the nodes in a state.
For SDFG state machines, you can also use
stateorder_topological_sort(), which will
traverse the states in the approximate order of execution (i.e., preserving order and entering if/for scopes before
The error manifests as an AttributeError exception and occurs due to trying to access an object’s attribute named data that doesn’t exist. For example:
MoveLoopIntoMap::can_be_applied triggered the AttributeError exception: 'NestedSDFG' object has no attribute 'data'
Often, the error is caused by not accounting for certain graph structures. In the example above, the
code assumes an
AccessNode would always appear in the context of that graph, but a
NestedSDFG node can also appear instead, and it does not have an attribute named
Bad or empty memlet shapes
Memlets in edges have source and destination subsets that can be accessed through
dst_subset(), respectively. These subsets are represented as
but could also be
None if the memlet is empty.
One must take care to check for these cases, as they can happen when map scopes have internal nodes without inputs or
outputs (e.g., when zeroing out an array).
Another source of error is when the memlet source and destination are not consistent with the direction of the edge.
dst_subset refer to actual information stored in
other_subset. The boolean attribute
_is_data_src governs whether the
src_subset points to
subset, and it might not be initialized. If the properties
do not return the correct subsets, code trying to find data sources and destinations fails to follow the memlet paths in
the correct direction, ending up in code nodes instead of access nodes. A potential solution is to
try to reconfigure the memlet subsets by calling
dace.memlet.Memlet.try_initialize() with the edge in the state.