From b5a56ad53a58f94300b6362c9e0080ddf4bcb64e Mon Sep 17 00:00:00 2001 From: Stephan Seitz <stephan.seitz@fau.de> Date: Thu, 27 Jun 2019 12:30:51 +0200 Subject: [PATCH] Add AssignmentCollection.has_exclusive_writes This properties checks whether all writes of this AC are exclusive, i.e. can be safely parallelized. AC not fulfilling this property are malformed for pystencils since this property is implicitly assumed. --- pystencils/simp/assignment_collection.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/pystencils/simp/assignment_collection.py b/pystencils/simp/assignment_collection.py index 5d57addc..79611f67 100644 --- a/pystencils/simp/assignment_collection.py +++ b/pystencils/simp/assignment_collection.py @@ -3,6 +3,7 @@ from copy import copy from typing import List, Optional, Dict, Any, Set, Sequence, Iterator, Iterable, Union from pystencils.assignment import Assignment from pystencils.sympyextensions import fast_subs, count_operations, sort_assignments_topologically +import pystencils class AssignmentCollection: @@ -360,6 +361,25 @@ class AssignmentCollection: self.sub_expressions = [Assignment(k, v) for k, v in sub_expressions_dict.items()] + 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 + class SymbolGen: """Default symbol generator producing number symbols ζ_0, ζ_1, ...""" -- GitLab