diff --git a/pystencils/simp/assignment_collection.py b/pystencils/simp/assignment_collection.py index c5a1837915602db695f0bd46a7297f7f26cf4771..3274476e4744bdfed9c3eec561a99466be2a97ca 100644 --- a/pystencils/simp/assignment_collection.py +++ b/pystencils/simp/assignment_collection.py @@ -3,6 +3,7 @@ from typing import Any, Dict, Iterable, Iterator, List, Optional, Sequence, Set, import sympy as sp +import pystencils from pystencils.assignment import Assignment from pystencils.sympyextensions import count_operations, fast_subs, sort_assignments_topologically @@ -346,6 +347,25 @@ class AssignmentCollection: def __iter__(self): return self.main_assignments.__iter__() + def has_exclusive_writes(self): + """ + Simple check for exclusive (non-overlapping) writes. + I.e. AssignmentCollection can be executed safely in parallel without caring about race conditions. + """ + + assignments = self.main_assignments + write_field_accesses = [a.lhs for a in assignments if isinstance(a.lhs, pystencils.Field.Access)] + + exclusive_writes = set() + for a in write_field_accesses: + + if (a.field, a.index) in exclusive_writes: + return False + else: + exclusive_writes.add((a.field, a.index)) + + return True + @property def main_assignments_dict(self): return {a.lhs: a.rhs for a in self.main_assignments}