Skip to content

Commit 824e4e9

Browse files
feat(DetectionResult): add patterns field
1 parent 45f309c commit 824e4e9

File tree

12 files changed

+47
-27
lines changed

12 files changed

+47
-27
lines changed

discopop_explorer/json_serializer.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from discopop_library.discopop_optimizer.classes.types.DataAccessType import WriteDataAccess
1414

1515
from discopop_library.result_classes.DetectionResult import DetectionResult
16+
from discopop_library.result_classes.PatternStorage import PatternStorage
1617
from .PEGraphX import Node
1718
from .pattern_detectors.PatternInfo import PatternInfo
1819
from .pattern_detectors.pipeline_detector import PipelineStage
@@ -52,6 +53,8 @@ def default(self, o):
5253
return filter_members(o.__dict__)
5354
if isinstance(o, DetectionResult):
5455
return filter_members(o.__dict__)
56+
if isinstance(o, PatternStorage):
57+
return filter_members(o.__dict__)
5558
if isinstance(o, PipelineStage):
5659
return filter_members(o.__dict__)
5760
if isinstance(o, Update):

discopop_explorer/pattern_detection.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,24 +82,24 @@ def detect_patterns(
8282

8383
if "*" in enable_patterns or "reduction" in enable_patterns:
8484
print("REDUCTIONS...")
85-
res.reduction = detect_reduction(self.pet)
85+
res.patterns.reduction = detect_reduction(self.pet)
8686
print("\tDONE.")
8787
if "*" in enable_patterns or "doall" in enable_patterns:
8888
print("DOALL...")
89-
res.do_all = detect_do_all(self.pet)
89+
res.patterns.do_all = detect_do_all(self.pet)
9090
print("\tDONE.")
9191
if "*" in enable_patterns or "pipeline" in enable_patterns:
9292
print("PIPELINE...")
93-
res.pipeline = detect_pipeline(self.pet)
93+
res.patterns.pipeline = detect_pipeline(self.pet)
9494
print("\tDONE.")
9595
if "*" in enable_patterns or "geodec" in enable_patterns:
9696
print("GEO. DEC...")
97-
res.geometric_decomposition = detect_gd(self.pet)
97+
res.patterns.geometric_decomposition = detect_gd(self.pet)
9898
print("\tDONE.")
9999

100100
# check if task pattern should be enabled
101101
if enable_task_pattern:
102-
res.task = detect_tp(
102+
res.patterns.task = detect_tp(
103103
cu_dict,
104104
dependencies,
105105
reduction_vars,
@@ -112,7 +112,7 @@ def detect_patterns(
112112
# detect GPU patterns based on previously identified patterns
113113
if "*" in enable_patterns or "simplegpu" in enable_patterns:
114114
print("SIMPLE GPU...")
115-
res.simple_gpu = detect_gpu(self.pet, res, project_path)
115+
res.patterns.simple_gpu = detect_gpu(self.pet, res, project_path)
116116
print("\tDONE.")
117117

118118
# detect combined GPU patterns

discopop_explorer/pattern_detectors/simple_gpu_patterns/GPULoop.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,7 @@ def setCollapseClause(self, pet: PEGraphX, node_id: NodeID, res):
642642
# calculate the number of iterations of this loop relative to the top loop
643643
n: LoopNode = cast(LoopNode, map_node(pet, node_id))
644644

645-
do_all_loops = [node.node_id for node in res.do_all]
645+
do_all_loops = [node.node_id for node in res.patterns.do_all]
646646

647647
loop_entry_node = cast(LoopNode, pet.node_at(node_id)).get_entry_node(pet)
648648
if loop_entry_node is None:

discopop_explorer/pattern_detectors/simple_gpu_patterns/gpu_pattern_detector.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,12 @@ def run_detection(pet: PEGraphX, res, project_folder_path: str) -> List[PatternI
3636
# check for lastprivates, since they are not supported by the suggested pragma:
3737
# pragma omp target teams distribute
3838
# todo: instead of omitting, suggest #pragma omp target parallel for instead
39-
if any(node.id == d.node_id for d in res.do_all if len(d.last_private) == 0) or any(
40-
node.id == r.node_id for r in res.reduction if len(r.last_private) == 0
39+
if any(node.id == d.node_id for d in res.patterns.do_all if len(d.last_private) == 0) or any(
40+
node.id == r.node_id for r in res.patterns.reduction if len(r.last_private) == 0
4141
):
4242
reduction_vars: List[Variable] = []
43-
if node.id in [r.node_id for r in res.reduction]:
44-
parent_reduction = [r for r in res.reduction if r.node_id == node.id][0]
43+
if node.id in [r.node_id for r in res.patterns.reduction]:
44+
parent_reduction = [r for r in res.patterns.reduction if r.node_id == node.id][0]
4545
reduction_vars = parent_reduction.reduction
4646
gpulp = GPULoopPattern(
4747
pet,

discopop_library/discopop_optimizer/optimizer.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ def run(arguments: OptimizerArguments):
209209
if best_configuration is not None:
210210
best_configuration = optimize_updates(experiment, best_configuration, arguments)
211211
# append the configuration to the list of patterns
212-
experiment.detection_result.optimizer_output.append(best_configuration)
212+
experiment.detection_result.patterns.optimizer_output.append(best_configuration)
213213

214214
# save full experiment to disk
215215
export_to_json(experiment, optimizer_dir)

discopop_library/discopop_optimizer/suggestions/importers/main.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ def import_suggestions(experiment: Experiment) -> nx.DiGraph:
2020
"""Imports the suggestions specified in res into the graph stored in the given experiment and returns the modified graph"""
2121

2222
# import do-all
23-
for do_all_suggestion in experiment.detection_result.do_all:
23+
for do_all_suggestion in experiment.detection_result.patterns.do_all:
2424
experiment.optimization_graph = import_doall(
2525
experiment.optimization_graph, do_all_suggestion, experiment.get_next_free_node_id, experiment
2626
)
2727

2828
# import reduction
29-
for reduction_suggestion in experiment.detection_result.reduction:
29+
for reduction_suggestion in experiment.detection_result.patterns.reduction:
3030
experiment.optimization_graph = import_reduction(
3131
experiment.optimization_graph, reduction_suggestion, experiment.get_next_free_node_id, experiment
3232
)

discopop_library/discopop_optimizer/suggestions/optimizers/loop_collapse.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,7 +239,7 @@ def __collapse_loops_in_function(function_node_id):
239239

240240
# register pattern for output
241241
# todo: find a nicer solution to duplicating the patterns for each device mapping
242-
global_experiment.detection_result.do_all.append(pattern_info)
242+
global_experiment.detection_result.patterns.do_all.append(pattern_info)
243243
print("REGISTERED PATTERN INFO: ", pattern_id, " for Device: ", data_at(global_graph, csrc).device_id)
244244
print(pattern_info)
245245
print()

discopop_library/result_classes/DetectionResult.py

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
# This software may be modified and distributed under the terms of
66
# the 3-Clause BSD License. See the LICENSE file in the package base
77
# directory for details.
8+
from ast import Dict
89
from typing import List
910

1011
import jsonpickle # type: ignore
@@ -17,24 +18,18 @@
1718
from discopop_explorer.pattern_detectors.pipeline_detector import PipelineInfo
1819
from discopop_explorer.pattern_detectors.reduction_detector import ReductionInfo
1920
from discopop_library.global_data.version.utils import get_version
21+
from discopop_library.result_classes.PatternStorage import PatternStorage
2022

2123

2224
class DetectionResult(object):
2325
version: str
2426
pet: PEGraphX
25-
reduction: List[ReductionInfo]
26-
do_all: List[DoAllInfo]
27-
pipeline: List[PipelineInfo]
28-
geometric_decomposition: List[GDInfo]
29-
task: List[PatternInfo]
30-
simple_gpu: List[PatternInfo]
31-
combined_gpu: List[PatternInfo]
32-
optimizer_output: List[PatternBase]
27+
patterns: PatternStorage
3328

3429
def __init__(self, pet: PEGraphX):
3530
self.version = get_version() # discopop version
3631
self.pet = pet
37-
self.optimizer_output = []
32+
self.patterns = PatternStorage()
3833
pass
3934

4035
def __str__(self):
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from typing import List
2+
3+
from discopop_explorer.pattern_detectors.PatternBase import PatternBase
4+
from discopop_explorer.pattern_detectors.PatternInfo import PatternInfo
5+
from discopop_explorer.pattern_detectors.do_all_detector import DoAllInfo
6+
from discopop_explorer.pattern_detectors.geometric_decomposition_detector import GDInfo
7+
from discopop_explorer.pattern_detectors.pipeline_detector import PipelineInfo
8+
from discopop_explorer.pattern_detectors.reduction_detector import ReductionInfo
9+
10+
11+
class PatternStorage(object):
12+
reduction: List[ReductionInfo]
13+
do_all: List[DoAllInfo]
14+
pipeline: List[PipelineInfo]
15+
geometric_decomposition: List[GDInfo]
16+
task: List[PatternInfo]
17+
simple_gpu: List[PatternInfo]
18+
combined_gpu: List[PatternInfo]
19+
optimizer_output: List[PatternBase]
20+
21+
def __init__(self):
22+
self.optimizer_output = []

test/do_all/daxpy/test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def validate_results(self, test_dir, src_dir):
5454

5555
# convert DoAllInfo objects to DoAllInfoForValidation objects to make use of custom __eq__
5656
converted_gold_standard = [DoAllInfoForValidation(elem) for elem in gold_standard.do_all]
57-
converted_test_output = [DoAllInfoForValidation(elem) for elem in test_output.do_all]
57+
converted_test_output = [DoAllInfoForValidation(elem) for elem in test_output.patterns.do_all]
5858

5959
# sort the lists
6060
converted_gold_standard = sorted(

0 commit comments

Comments
 (0)