Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions loopy/check.py
Original file line number Diff line number Diff line change
Expand Up @@ -607,6 +607,14 @@ def check_for_write_races(kernel: LoopKernel) -> None:
"""
from loopy.kernel.data import ConcurrentTag

def iname_has_single_iteration(iname: str) -> bool:
try:
if kernel.get_constant_iname_length(iname) == 1:
return True
except isl.Error:
pass
return False

for insn in kernel.instructions:
for assignee_name, assignee_indices in zip(
insn.assignee_var_names(),
Expand All @@ -624,14 +632,16 @@ def check_for_write_races(kernel: LoopKernel) -> None:

raceable_parallel_insn_inames = {
iname for iname in insn.within_inames
if kernel.iname_tags_of_type(iname, ConcurrentTag)}
if kernel.iname_tags_of_type(iname, ConcurrentTag)
and not iname_has_single_iteration(iname)}

elif assignee_name in kernel.temporary_variables:
temp_var = kernel.temporary_variables[assignee_name]
raceable_parallel_insn_inames = {
iname for iname in insn.within_inames
if any(_is_racing_iname_tag(temp_var, tag)
for tag in kernel.iname_tags(iname))}
for tag in kernel.iname_tags(iname))
and not iname_has_single_iteration(iname)}

else:
raise LoopyError("invalid assignee name in instruction '%s'"
Expand Down
2 changes: 1 addition & 1 deletion loopy/kernel/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -850,7 +850,7 @@ def get_iname_bounds(self,
size=size)

@memoize_method
def get_constant_iname_length(self, iname):
def get_constant_iname_length(self, iname: str) -> int:
from loopy.isl_helpers import static_max_of_pw_aff
from loopy.symbolic import aff_to_expr
return int(aff_to_expr(static_max_of_pw_aff(
Expand Down
Loading