Skip to content

Commit

Permalink
Merge pull request #1326 from spcl/validation-relaxation
Browse files Browse the repository at this point in the history
Relax test for inter-state edges in default schedules
  • Loading branch information
alexnick83 authored Jul 21, 2023
2 parents 4991776 + cbe344c commit aba8de8
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 8 deletions.
33 changes: 25 additions & 8 deletions dace/sdfg/validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ def validate_sdfg(sdfg: 'dace.sdfg.SDFG', references: Set[int] = None, **context
"""
# Avoid import loop
from dace.codegen.targets import fpga
from dace.sdfg.scope import is_devicelevel_gpu, is_devicelevel_fpga
from dace.sdfg.scope import is_devicelevel_gpu, is_devicelevel_fpga, is_in_scope

references = references or set()

Expand Down Expand Up @@ -111,6 +111,7 @@ def validate_sdfg(sdfg: 'dace.sdfg.SDFG', references: Set[int] = None, **context
# Check if SDFG is located within a GPU kernel
context['in_gpu'] = is_devicelevel_gpu(sdfg, None, None)
context['in_fpga'] = is_devicelevel_fpga(sdfg, None, None)
in_default_scope = None

# Check every state separately
start_state = sdfg.start_state
Expand Down Expand Up @@ -171,10 +172,18 @@ def validate_sdfg(sdfg: 'dace.sdfg.SDFG', references: Set[int] = None, **context
for memlet in ise_memlets:
container = memlet.data
if not _accessible(sdfg, container, context):
eid = sdfg.edge_id(edge)
raise InvalidSDFGInterstateEdgeError(
f'Trying to read an inaccessible data container "{container}" '
f'(Storage: {sdfg.arrays[container].storage}) in host code interstate edge', sdfg, eid)
# Check context w.r.t. maps
if in_default_scope is None: # Lazy-evaluate in_default_scope
in_default_scope = False
if sdfg.parent_nsdfg_node is not None:
if is_in_scope(sdfg.parent_sdfg, sdfg.parent, sdfg.parent_nsdfg_node,
[dtypes.ScheduleType.Default]):
in_default_scope = True
if in_default_scope is False:
eid = sdfg.edge_id(edge)
raise InvalidSDFGInterstateEdgeError(
f'Trying to read an inaccessible data container "{container}" '
f'(Storage: {sdfg.arrays[container].storage}) in host code interstate edge', sdfg, eid)

# Add edge symbols into defined symbols
symbols.update(issyms)
Expand Down Expand Up @@ -219,9 +228,17 @@ def validate_sdfg(sdfg: 'dace.sdfg.SDFG', references: Set[int] = None, **context
for memlet in ise_memlets:
container = memlet.data
if not _accessible(sdfg, container, context):
raise InvalidSDFGInterstateEdgeError(
f'Trying to read an inaccessible data container "{container}" '
f'(Storage: {sdfg.arrays[container].storage}) in host code interstate edge', sdfg, eid)
# Check context w.r.t. maps
if in_default_scope is None: # Lazy-evaluate in_default_scope
in_default_scope = False
if sdfg.parent_nsdfg_node is not None:
if is_in_scope(sdfg.parent_sdfg, sdfg.parent, sdfg.parent_nsdfg_node,
[dtypes.ScheduleType.Default]):
in_default_scope = True
if in_default_scope is False:
raise InvalidSDFGInterstateEdgeError(
f'Trying to read an inaccessible data container "{container}" '
f'(Storage: {sdfg.arrays[container].storage}) in host code interstate edge', sdfg, eid)

except InvalidSDFGError as ex:
# If the SDFG is invalid, save it
Expand Down
23 changes: 23 additions & 0 deletions tests/sdfg/disallowed_access_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ def test_gpu_access_on_host_interstate_invalid():

@pytest.mark.gpu
def test_gpu_access_on_host_tasklet():

@dace.program
def tester(a: dace.float64[20] @ dace.StorageType.GPU_Global):
for i in dace.map[0:20] @ dace.ScheduleType.CPU_Multicore:
Expand All @@ -49,7 +50,29 @@ def tester(a: dace.float64[20] @ dace.StorageType.GPU_Global):
tester.to_sdfg(validate=True)


@pytest.mark.gpu
def test_gpu_access_on_device_interstate_edge_default():
sdfg = dace.SDFG('tester')
sdfg.add_array('A', [20], dace.float64, storage=dace.StorageType.GPU_Global)
state = sdfg.add_state()

me, mx = state.add_map('test', dict(i='0:20'))

nsdfg = dace.SDFG('nester')
nsdfg.add_array('A', [20], dace.float64, storage=dace.StorageType.GPU_Global)
state1 = nsdfg.add_state()
state2 = nsdfg.add_state()
nsdfg.add_edge(state1, state2, dace.InterstateEdge(assignments=dict(s='A[4]')))

nsdfg_node = state.add_nested_sdfg(nsdfg, None, {'A'}, {})
state.add_memlet_path(state.add_read('A'), me, nsdfg_node, dst_conn='A', memlet=dace.Memlet('A[0:20]'))
state.add_nedge(nsdfg_node, mx, dace.Memlet())

sdfg.validate()


if __name__ == '__main__':
test_gpu_access_on_host_interstate_ok()
test_gpu_access_on_host_interstate_invalid()
test_gpu_access_on_host_tasklet()
test_gpu_access_on_device_interstate_edge_default()

0 comments on commit aba8de8

Please sign in to comment.