Skip to content

Commit d859098

Browse files
committed
#586: finally fixed bug in bounds
1 parent fe6161c commit d859098

File tree

6 files changed

+60
-11
lines changed

6 files changed

+60
-11
lines changed

config/synthetic-blocks.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ work_model:
1414
gamma: 0.0
1515
delta: 0.0
1616
upper_bounds:
17-
max_memory_usage: 27.0
17+
max_memory_usage: 36.0
1818

1919
# Specify algorithm
2020
algorithm:

src/lbaf/Execution/lbsClusteringTransferStrategy.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,10 @@ def __swap_clusters(self, phase: Phase, r_src: Rank, clusters_src:dict, targets:
182182
for k_src, o_src in clusters_src.items():
183183
# Iterate over target clusters
184184
for k_try, o_try in clusters_try.items():
185+
# Skip trivial case
186+
if not o_src and not o_try:
187+
continue
188+
185189
# Decide whether swap is beneficial
186190
c_try = self._criterion.compute(r_src, o_src, r_try, o_try)
187191
self.__n_swap_tries += 1

src/lbaf/Execution/lbsTemperedCriterion.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ 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_new = max(
71-
self._work_model.update(r_src, o_src, o_dst),
72-
self._work_model.update(r_dst, o_dst, o_src))
71+
self._work_model.update(r_src, r_dst, o_src, o_dst),
72+
self._work_model.update(r_dst, r_src, o_dst, o_src))
7373

7474
# Report computed values in debug mode
7575
self._logger.debug(f"Arrangement work; original: {w_max_0}; updated: {w_max_new}")

src/lbaf/Model/lbsAffineCombinationWorkModel.py

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,39 @@ def compute(self, rank: Rank):
111111
rank.get_sent_volume(),
112112
rank.get_homing())
113113

114+
def __update_bounds(self, r_snd: Rank, r_rcv: Rank, o_snd: list, o_rcv: list):
115+
"""Update verification of bounds if objects are to be sent and received."""
116+
# Distinguish between upper bound QOIs
117+
for k, v in self.__upper_bounds.items():
118+
if k == "max_memory_usage":
119+
# Initialize post-transfer set of objects
120+
o_new = set()
121+
122+
# Node-level upper bound
123+
if self.__node_bounds:
124+
n_snd = r_snd.get_node()
125+
o_new = n_snd.get_objects()
126+
# Updated objects only if transfer is not node-local
127+
if n_snd != r_rcv.get_node():
128+
o_new = (o_new.difference(o_snd)).union(o_rcv)
129+
130+
# Rank-level upper bound
131+
else:
132+
o_new = (r_snd.get_objects().difference(o_snd)).union(o_rcv)
133+
134+
# Compute new set of blocks and check upper bound
135+
b_new = set(o.get_shared_block() for o in o_new if o.get_shared_block())
136+
return b_new and (sum(b.get_size() for b in b_new) > v)
137+
138+
else:
139+
# Ignore unsupported upper bound types
140+
self.__logger.warning(
141+
f"Upper bound update formula not supported for {k}, ignoring it.")
142+
return False
143+
144+
# Bounds are satisfied by default
145+
return False
146+
114147
def __update_load(self, rank: Rank, o_snd: list, o_rcv: list):
115148
"""Update total load if objects are to be sent and received."""
116149
return rank.get_load() - sum(
@@ -271,12 +304,16 @@ def __update_homing(self, rank: Rank, o_snd: list, o_rcv: list):
271304
# Return updated homing cost
272305
return homing
273306

274-
def update(self, rank: Rank, o_snd: list, o_rcv: list):
307+
def update(self, r_snd: Rank, r_rcv: Rank, o_snd: list, o_rcv: list):
275308
"""Update work if objects are to be sent and received."""
309+
# Check whether strict bounds are satisfied
310+
if self.__update_bounds(r_snd, r_rcv, o_snd, o_rcv):
311+
return math.inf
312+
276313
# Return combination of load and volumes
277314
return self.affine_combination(
278-
rank.get_alpha(),
279-
self.__update_load(rank, o_snd, o_rcv),
280-
self.__update_received(rank, o_snd, o_rcv),
281-
self.__update_sent(rank, o_snd, o_rcv),
282-
self.__update_homing(rank, o_snd, o_rcv))
315+
r_snd.get_alpha(),
316+
self.__update_load(r_snd, o_snd, o_rcv),
317+
self.__update_received(r_snd, o_snd, o_rcv),
318+
self.__update_sent(r_snd, o_snd, o_rcv),
319+
self.__update_homing(r_snd, o_snd, o_rcv))

src/lbaf/Model/lbsNode.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,14 @@ def add_rank(self, rank):
7878
def get_number_of_ranks(self) -> int:
7979
return len(self.__ranks)
8080

81+
def get_objects(self) -> set:
82+
"""Return set of all objects across all ranks in node."""
83+
return set().union(*(r.get_objects() for r in self.get_ranks()))
84+
85+
def get_shared_blocks(self) -> set:
86+
"""Return set of all shared blocks across all ranks in node."""
87+
return set().union(*(r.get_shared_blocks() for r in self.get_ranks()))
88+
8189
def get_max_memory_usage(self) -> float:
8290
"""Sum all memory usages for each rank to get the node memory usage."""
8391
return 0.0 + sum(

src/lbaf/Model/lbsWorkModelBase.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,6 @@ def compute(self, rank):
8383
# Must be implemented by concrete subclass
8484

8585
@abc.abstractmethod
86-
def update(self, rank, o_snd, o_rcv):
87-
"""Compute updated work on given rank if sending and receiving objects."""
86+
def update(self, r_snd, r_rcv, o_snd, o_rcv):
87+
"""Compute updated work on sender rank if sending and receiving objects."""
8888
# Must be implemented by concrete subclass

0 commit comments

Comments
 (0)