blob: 83889b0672963b22f0b8884dea48e09e98c3a954 [file] [log] [blame]
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08001#!/usr/bin/python
2
3# Copyright 2011 Google Inc. All Rights Reserved.
4
5import os
6import time
7from autotest_runner import AutotestRunner
8from benchmark_run import BenchmarkRun
9from machine_manager import MachineManager
10from perf_processor import PerfProcessor
11from results_cache import ResultsCache
12from results_report import HTMLResultsReport
13from utils import logger
14from utils.file_utils import FileUtils
15
16
17class Experiment(object):
18 """Class representing an Experiment to be run."""
19
20 def __init__(self, name, remote, rerun_if_failed, working_directory,
21 chromeos_root, cache_conditions, labels, benchmarks,
22 experiment_file):
23 self.name = name
24 self.rerun_if_failed = rerun_if_failed
25 self.working_directory = working_directory
26 self.remote = remote
27 self.chromeos_root = chromeos_root
28 self.cache_conditions = cache_conditions
29 self.experiment_file = experiment_file
30 self.results_directory = os.path.join(self.working_directory,
31 self.name + "_results")
32
33 self.labels = labels
34 self.benchmarks = benchmarks
35 self.num_complete = 0
36
37 # We need one chromeos_root to run the benchmarks in, but it doesn't
38 # matter where it is, unless the ABIs are different.
39 if not chromeos_root:
40 for label in self.labels:
41 if label.chromeos_root:
42 chromeos_root = label.chromeos_root
43 if not chromeos_root:
44 raise Exception("No chromeos_root given and could not determine one from "
45 "the image path.")
46
47 self.machine_manager = MachineManager(chromeos_root)
48 self.l = logger.GetLogger()
49
50 for machine in remote:
51 self.machine_manager.AddMachine(machine)
52
53 self.start_time = None
54 self.benchmark_runs = self._GenerateBenchmarkRuns()
55
56 def _GenerateBenchmarkRuns(self):
57 """Generate benchmark runs from labels and benchmark defintions."""
58 benchmark_runs = []
59 for label in self.labels:
60 for benchmark in self.benchmarks:
61 for iteration in range(1, benchmark.iterations + 1):
62
63 benchmark_run_name = "%s: %s (%s)" % (label.name, benchmark.name,
64 iteration)
65 full_name = "%s_%s_%s" % (label.name, benchmark.name, iteration)
66 logger_to_use = logger.Logger(os.path.dirname(__file__),
67 "run.%s" % (full_name),
68 True)
69 ar = AutotestRunner(logger_to_use=logger_to_use)
70 rc = ResultsCache()
71 pp = PerfProcessor(logger_to_use=logger_to_use)
72 benchmark_run = BenchmarkRun(benchmark_run_name,
73 benchmark.name,
74 benchmark.autotest_name,
75 benchmark.autotest_args,
76 label.name,
77 label.chromeos_root,
78 label.chromeos_image,
79 label.board,
80 iteration,
81 self.cache_conditions,
82 benchmark.outlier_range,
83 benchmark.profile_counters,
84 benchmark.profile_type,
85 self.machine_manager,
86 rc,
87 ar,
88 pp,
89 logger_to_use)
90
91 benchmark_runs.append(benchmark_run)
92 return benchmark_runs
93
94 def Build(self):
95 pass
96
97 def Terminate(self):
98 for t in self.benchmark_runs:
99 if t.isAlive():
100 self.l.LogError("Terminating run: '%s'." % t.name)
101 t.Terminate()
102
103 def IsComplete(self):
104 if self.active_threads:
105 for t in self.active_threads:
106 if t.isAlive():
107 t.join(0)
108 if not t.isAlive():
109 self.num_complete += 1
110 self.active_threads.remove(t)
111 return False
112 return True
113
114 def Run(self):
115 self.start_time = time.time()
116 self.active_threads = []
117 for benchmark_run in self.benchmark_runs:
118 # Set threads to daemon so program exits when ctrl-c is pressed.
119 benchmark_run.daemon = True
120 benchmark_run.start()
121 self.active_threads.append(benchmark_run)
122
123 def SetCacheConditions(self, cache_conditions):
124 for benchmark_run in self.benchmark_runs:
125 benchmark_run.SetCacheConditions(cache_conditions)
126
127 def Cleanup(self):
128 self.machine_manager.Cleanup()