Skip to content

Commit b0e61aa

Browse files
committed
#611: added documentation for update code that is complex
1 parent e99780d commit b0e61aa

File tree

3 files changed

+71
-11
lines changed

3 files changed

+71
-11
lines changed

config/synthetic-blocks.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ work_model:
1212
parameters:
1313
beta: 0.0
1414
gamma: 0.0
15-
delta: 0.0
15+
delta: 0.1
1616
upper_bounds:
1717
max_memory_usage: 45.0
1818

src/lbaf/Execution/lbsTemperedWithUpdatesCriterion.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,22 +68,26 @@ def compute(self, r_src: Rank, o_src: list, r_dst: Rank, o_dst: Optional[list]=N
6868

6969
# Compute update formulae
7070
w_max_up = max(
71-
self._work_model.update(r_src, o_src, o_dst),
72-
self._work_model.update(r_dst, o_dst, o_src))
71+
w1 := self._work_model.update(r_src, o_src, o_dst),
72+
w2 := self._work_model.update(r_dst, o_dst, o_src))
7373

7474
# Move objects into proposed new arrangement
7575
self._phase.transfer_objects(r_src, o_src, r_dst, o_dst)
7676

7777
# Compute maximum work of proposed new arrangement
7878
w_max_new = max(
79-
self._work_model.compute(r_src),
80-
self._work_model.compute(r_dst))
79+
w3 := self._work_model.compute(r_src),
80+
w4 := self._work_model.compute(r_dst))
8181

8282
# Move objects back into original arrangement
8383
self._phase.transfer_objects(r_dst, o_src, r_src, o_dst)
8484

85-
# Return criterion value
85+
# Sanity check
8686
if w_max_new != w_max_up:
87-
self._logger.error(f"Discrepancy in post update works: {w_max_new} <> {m_max_up}")
87+
self._logger.error(f"Discrepancy in post update works: {w_max_new} <> {w_max_up}")
88+
print(w1, w3)
89+
print(w2, w4)
90+
raise SystemExit(1)
8891

92+
# Return criterion value
8993
return w_max_0 - w_max_new

src/lbaf/Model/lbsAffineCombinationWorkModel.py

Lines changed: 60 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,16 +113,72 @@ def compute(self, rank: Rank):
113113

114114
def __update_load(self, rank: Rank, o_snd: list, o_rcv: list):
115115
"""Update total load if objects are to be sent and received."""
116-
return rank.get_load() + sum(
117-
o.get_load() for o in o_rcv) - sum(
118-
o.get_load() for o in o_snd)
116+
return rank.get_load() - sum(
117+
o.get_load() for o in o_snd) + sum(
118+
o.get_load() for o in o_rcv)
119+
120+
def __update_homing(self, rank: Rank, o_snd: list, o_rcv: list):
121+
"""Update homing costs if objects are to be sent and received."""
122+
123+
# Keep track of rank id and objects
124+
r_id = rank.get_id()
125+
r_obj = rank.get_objects().copy()
126+
127+
# Retrieve current homing cost
128+
homing = rank.get_homing()
129+
130+
# Iterate over all sent objects
131+
for o in o_snd:
132+
# Update set of blocks on rank
133+
r_obj.discard(o)
134+
135+
# Skip locally homed blocks
136+
b = o.get_shared_block()
137+
if b.get_home_id() == r_id:
138+
continue
139+
140+
# Determine set of removed non-homed blocks
141+
S = set({b})
142+
for o_oth in r_obj:
143+
if o_oth.get_shared_block() == b:
144+
S = set()
145+
break
146+
147+
# Update homing cost
148+
for b in S:
149+
homing -= b.get_size()
150+
151+
# Iterate over all received objects
152+
for o in o_rcv:
153+
# Skip locally homed blocks
154+
b = o.get_shared_block()
155+
if b.get_home_id() == r_id:
156+
continue
157+
158+
# Determine set of added non-homed blocks
159+
S = set({b})
160+
for o_oth in r_obj:
161+
if o_oth.get_shared_block() == b:
162+
S = set()
163+
break
164+
165+
# Update homing cost
166+
for b in S:
167+
homing += b.get_size()
168+
169+
# Update set of blocks on rank
170+
r_obj.add(o)
171+
172+
# Return updated value
173+
return homing
119174

120175
def update(self, rank: Rank, o_snd: list, o_rcv: list):
121176
"""Update work if objects are to be sent and received."""
177+
122178
# Return combination of load and volumes
123179
return self.affine_combination(
124180
rank.get_alpha(),
125181
self.__update_load(rank, o_snd, o_rcv),
126182
rank.get_received_volume(),
127183
rank.get_sent_volume(),
128-
rank.get_homing())
184+
self.__update_homing(rank, o_snd, o_rcv))

0 commit comments

Comments
 (0)