提交 102fb5e1 authored 作者: Frederic's avatar Frederic

Make EquilibriumOptimizer profiling of the number of node created by an opt.

上级 58a0f97b
...@@ -1676,8 +1676,10 @@ class OpKeyOptimizer(NavigatorOptimizer): ...@@ -1676,8 +1676,10 @@ class OpKeyOptimizer(NavigatorOptimizer):
class ChangeTracker: class ChangeTracker:
def __init__(self): def __init__(self):
self.changed = False self.changed = False
self.nb_imported = 0
def on_import(self, fgraph, node, reason): def on_import(self, fgraph, node, reason):
self.nb_imported += 1
self.changed = True self.changed = True
def on_change_input(self, fgraph, node, i, r, new_r, reason): def on_change_input(self, fgraph, node, i, r, new_r, reason):
...@@ -1770,9 +1772,11 @@ class EquilibriumOptimizer(NavigatorOptimizer): ...@@ -1770,9 +1772,11 @@ class EquilibriumOptimizer(NavigatorOptimizer):
time_opts = {} time_opts = {}
io_toposort_timing = [] io_toposort_timing = []
nb_nodes = [] nb_nodes = []
node_created = {}
for opt in self.global_optimizers + list(self.get_local_optimizers()): for opt in self.global_optimizers + list(self.get_local_optimizers()):
global_process_count.setdefault(opt, 0) global_process_count.setdefault(opt, 0)
time_opts.setdefault(opt, 0) time_opts.setdefault(opt, 0)
node_created.setdefault(opt, 0)
while changed and not max_use_abort: while changed and not max_use_abort:
process_count = {} process_count = {}
...@@ -1781,15 +1785,17 @@ class EquilibriumOptimizer(NavigatorOptimizer): ...@@ -1781,15 +1785,17 @@ class EquilibriumOptimizer(NavigatorOptimizer):
#apply global optimizers #apply global optimizers
for gopt in self.global_optimizers: for gopt in self.global_optimizers:
fgraph.change_tracker.reset() change_tracker.reset()
nb = change_tracker.nb_imported
t_opt = time.time() t_opt = time.time()
gopt.apply(fgraph) gopt.apply(fgraph)
time_opts[gopt] += time.time() - t_opt time_opts[gopt] += time.time() - t_opt
if fgraph.change_tracker.changed: if change_tracker.changed:
process_count.setdefault(gopt, 0) process_count.setdefault(gopt, 0)
process_count[gopt] += 1 process_count[gopt] += 1
global_process_count[gopt] += 1 global_process_count[gopt] += 1
changed = True changed = True
node_created[gopt] += change_tracker.nb_imported - nb
if global_process_count[gopt] > max_use: if global_process_count[gopt] > max_use:
max_use_abort = True max_use_abort = True
opt_name = (getattr(gopt, "name", None) opt_name = (getattr(gopt, "name", None)
...@@ -1826,6 +1832,7 @@ class EquilibriumOptimizer(NavigatorOptimizer): ...@@ -1826,6 +1832,7 @@ class EquilibriumOptimizer(NavigatorOptimizer):
for lopt in (self.local_optimizers_all + for lopt in (self.local_optimizers_all +
self.local_optimizers_map.get(type(node.op), []) + self.local_optimizers_map.get(type(node.op), []) +
self.local_optimizers_map.get(node.op, [])): self.local_optimizers_map.get(node.op, [])):
nb = change_tracker.nb_imported
t_opt = time.time() t_opt = time.time()
lopt_change = self.process_node(fgraph, node, lopt) lopt_change = self.process_node(fgraph, node, lopt)
time_opts[lopt] += time.time() - t_opt time_opts[lopt] += time.time() - t_opt
...@@ -1834,6 +1841,7 @@ class EquilibriumOptimizer(NavigatorOptimizer): ...@@ -1834,6 +1841,7 @@ class EquilibriumOptimizer(NavigatorOptimizer):
process_count[lopt] += 1 process_count[lopt] += 1
global_process_count[lopt] += 1 global_process_count[lopt] += 1
changed = True changed = True
node_created[lopt] += change_tracker.nb_imported - nb
if global_process_count[lopt] > max_use: if global_process_count[lopt] > max_use:
max_use_abort = True max_use_abort = True
opt_name = (getattr(lopt, "name", None) opt_name = (getattr(lopt, "name", None)
...@@ -1857,7 +1865,8 @@ class EquilibriumOptimizer(NavigatorOptimizer): ...@@ -1857,7 +1865,8 @@ class EquilibriumOptimizer(NavigatorOptimizer):
fgraph.remove_feature(change_tracker) fgraph.remove_feature(change_tracker)
return (self, loop_timing, loop_process_count, return (self, loop_timing, loop_process_count,
(start_nb_nodes, end_nb_nodes, max_nb_nodes), (start_nb_nodes, end_nb_nodes, max_nb_nodes),
global_opt_timing, nb_nodes, time_opts, io_toposort_timing) global_opt_timing, nb_nodes, time_opts, io_toposort_timing,
node_created)
def print_summary(self, stream=sys.stdout, level=0, depth=-1): def print_summary(self, stream=sys.stdout, level=0, depth=-1):
name = getattr(self, 'name', None) name = getattr(self, 'name', None)
...@@ -1872,7 +1881,8 @@ class EquilibriumOptimizer(NavigatorOptimizer): ...@@ -1872,7 +1881,8 @@ class EquilibriumOptimizer(NavigatorOptimizer):
def print_profile(stream, prof, level=0): def print_profile(stream, prof, level=0):
(opt, loop_timing, loop_process_count, (opt, loop_timing, loop_process_count,
(start_nb_nodes, end_nb_nodes, max_nb_nodes), (start_nb_nodes, end_nb_nodes, max_nb_nodes),
global_opt_timing, nb_nodes, time_opts, io_toposort_timing) = prof global_opt_timing, nb_nodes, time_opts, io_toposort_timing,
node_created) = prof
blanc = (' ' * level) blanc = (' ' * level)
print >> stream, blanc, "EquilibriumOptimizer", print >> stream, blanc, "EquilibriumOptimizer",
...@@ -1916,18 +1926,19 @@ class EquilibriumOptimizer(NavigatorOptimizer): ...@@ -1916,18 +1926,19 @@ class EquilibriumOptimizer(NavigatorOptimizer):
process_count[o] += v process_count[o] += v
for opt, count in process_count.iteritems(): for opt, count in process_count.iteritems():
if count > 0: if count > 0:
count_opt.append((time_opts[opt], count, opt)) count_opt.append((time_opts[opt], count,
node_created[opt], opt))
else: else:
not_used.append((time_opts[opt], opt)) not_used.append((time_opts[opt], opt))
not_used_time += time_opts[opt] not_used_time += time_opts[opt]
if count_opt: if count_opt:
print >> stream, blanc, \ print >> stream, blanc, \
' times - times applied - name:' ' times - times applied - nb node created - name:'
count_opt.sort() count_opt.sort()
for (t, count, opt) in count_opt[::-1]: for (t, count, n_created, opt) in count_opt[::-1]:
print >> stream, blanc, ' %.3fs - %d - %s' % ( print >> stream, blanc, ' %.3fs - %d - %d - %s' % (
t, count, opt) t, count, n_created, opt)
print >> stream, blanc, ' %.3fs - in %d optimization that where not used (display only those with a runtime > 0)' % ( print >> stream, blanc, ' %.3fs - in %d optimization that where not used (display only those with a runtime > 0)' % (
not_used_time, len(not_used)) not_used_time, len(not_used))
not_used.sort() not_used.sort()
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论