From 34db70a1919e4effaf2aef7f27f823dcd53a0cff Mon Sep 17 00:00:00 2001 From: LalehB Date: Tue, 26 Aug 2014 18:01:54 -0700 Subject: [PATCH] power --- src/test/power/PowerMeasure.py | 171 +++++++++++++++++++++++++++++++++ src/test/power/README.md | 24 +++++ 2 files changed, 195 insertions(+) create mode 100644 src/test/power/PowerMeasure.py create mode 100644 src/test/power/README.md diff --git a/src/test/power/PowerMeasure.py b/src/test/power/PowerMeasure.py new file mode 100644 index 000000000000..3a8f3977052d --- /dev/null +++ b/src/test/power/PowerMeasure.py @@ -0,0 +1,171 @@ +# This Source Code Form is subject to the terms of the Mozilla Public +# License, v. 2.0. If a copy of the MPL was not distributed with this +# file, You can obtain one at http://mozilla.org/MPL/2.0/. + +# !/usr/bin/env python + +# ---------Power measurement ------------------------------# +# This script will run the servo with the given benchmark and +# get the power usage using Powermetrics. Results will be put +# in sperate files with that name. +# Do not forget to run the script in servo/src/test/power folder +# --------------------------------------------------------# + +import os +import time +import argparse + +# ------------------------PowerCollector----------------------------# +# Collecting all the power data and put them into files + + +def PowerCollector(OutputDir, Benchmarks, LayoutThreads, Renderer): + print " Running the power collector" + os.mkdir(os.path.join(OutputDir+"power"), 0777) + os.mkdir(os.path.join(OutputDir+"time"), 0777) + os.mkdir(os.path.join(OutputDir+"Addtional"), 0777) + SleepTime = 20 + GuardTime = 0.5 + powerTiming = 1 + ExperimentNum = 21 + for ExpNum in range(1, ExperimentNum): + for layoutT in range(1, LayoutThreads+1): + PowerFiles = OutputDir + 'power/' + 'power-Layout' + \ + str(layoutT) + "-set" + str(ExpNum) + ".csv" + TimeFiles = OutputDir + 'time/' + "time-Layout" + \ + str(layoutT) + "-set" + str(ExpNum) + ".csv" + # ServoCmd ="(time ./servo -x -y " + str(layoutT) \ + # +" "+ Renderer + " " + Benchmarks + " ) 2> " + TimeFiles + ServoCmd = "(time ../../../build/servo -x -y " + \ + str(layoutT) + " " + Renderer + " " + \ + Benchmarks + " ) 2> " + TimeFiles + Metrics = OutputDir + 'Addtional/' + "metrics-Layout" + \ + str(layoutT) + "-set" + str(ExpNum) + "-css.csv" + cmd = '(sudo powermetrics -i ' + str(powerTiming) + \ + ' | grep \"energy\\|elapsed\\|servo\" > ' + \ + PowerFiles + '& ) 2> ' + Metrics + time.sleep(SleepTime) + os.system(cmd) + time.sleep(GuardTime) + os.system(ServoCmd) + time.sleep(GuardTime) + os.system('sudo pkill -9 powermetrics') + time.sleep(SleepTime) + +# -------------------PowerParser ---------------------------------# +# Parsing collected power by PowerCollector fucntion + + +def PowerParser(OutputDir, LayoutThreads): + print "Running the PowerParser" + ExperimentNum = 21 + ResultTable = OutputDir + "ResultTable.csv" + ResultFile = open(ResultTable, "w") + ResultFile.write("LayoutThreads, MeanPower, MeanTime , MaxTime, " + "MinTime , MaxPower , MinPower \n") + + for layoutT in range(1, LayoutThreads+1): + MaxTime = 0 + MinTime = 1000000 + MaxPower = 0 + MinPower = 1000000 + TotalPower = 0 + TotalTime = 0 + for ExpNum in range(1, ExperimentNum): + Files = OutputDir + 'power/' + 'power-Layout' + str(layoutT) + \ + "-set" + str(ExpNum) + ".csv" + NewFile = OutputDir + 'power/Servo-L' + str(layoutT) + \ + "set" + str(ExpNum) + ".csv" + File = open(Files, 'r') + PowerFile = open(NewFile, 'w') + TimeFiles = OutputDir + 'time/' + "time-Layout" + \ + str(layoutT) + "-set" + str(ExpNum) + ".csv" + # ----Putting the power the power and its time into a table---- # + + for line in File: + words = line.split() + if words[0] == "***": + insertingWord = words[10][1:-2] + " " + elif words[0] == "Intel": + insertingWord += words[7][:-1] + insertingWord += "\n" + PowerFile.write(insertingWord) + File.close() + PowerFile.close() + + # ---------------geting the total power of experiments-------- # + + TempFile = open(NewFile, 'r') + Power = 0 + for line in TempFile: + words2 = line.split() + Power += float(words2[0]) * float(words2[1]) + TotalPower = float(Power / 1000.0) + if TotalPower > MaxPower: + MaxPower = TotalPower + if TotalPower < MinPower: + MinPower = TotalPower + + # -------------getting the total time of execution---------- # + + TempFile2 = open(TimeFiles, "r") + for line in TempFile2: + words3 = line.split() + if line != "\n" and words3[0] == "real": + TotalTime = (float(words3[1][0]) * 60) + \ + float(words3[1][2:-1]) + if TotalTime > MaxTime: + MaxTime = TotalTime + if TotalTime < MinTime: + MinTime = TotalTime + + TotalPower = TotalPower / float(ExperimentNum-1) + TotalTime = TotalTime / float(ExperimentNum-1) + ResultFile.write(str(layoutT) + " , " + str(TotalPower) + " , " + + str(TotalTime) + " , " + str(MaxTime) + " , " + + str(MinTime) + " , " + str(MaxPower) + " , " + + str(MinPower) + "\n") + ResultFile.close() + Opener = ResultFile = open(ResultTable, "r") + for line in Opener: + print line + + print "Also you can find all the numbers for Power " \ + "and Performance in : ", ResultTable + + +# ----------------------------------------------------# +def main(): + LayoutThreads = 8 # Maximum number of threads considered for Layout + Benchmarks = "../../test/html/perf-rainbow.html" + OutputDir = "Experiments/" + os.mkdir(os.path.join(OutputDir), 0777) + Renderer = " " + + # Parsing the input of the script + parser = argparse.ArgumentParser(description="Mesuring \ + power and performance of your servo runs") + parser.add_argument("-b", "--benchmark", help="Gets the \ + benchmark, for example \"-B perf-rainbow.html\"") + parser.add_argument("-c", "--CPU", help="Rendering with \ + CPU instead of GPU, for example -C") + parser.add_argument("-l", "--LayoutThreads", help="Specifyes \ + the maximum number of threads for layout, for example \" -L 5\"") + parser.add_argument("-o", "--Output", help=" Specifyes \ + the output directory") + + args = parser.parse_args() + if args.benchmark: + Benchmarks = args.benchmark + if args.CPU: + Renderer = "-c" + if args.LayoutThreads: + LayoutThreads = int(args.LayoutThreads) + if args.Output: + OutputDir = args.Output + + PowerCollector(OutputDir, Benchmarks, LayoutThreads, Renderer) + PowerParser(OutputDir, LayoutThreads) + +if __name__ == "__main__": + main() diff --git a/src/test/power/README.md b/src/test/power/README.md new file mode 100644 index 000000000000..b649a92a60a7 --- /dev/null +++ b/src/test/power/README.md @@ -0,0 +1,24 @@ +The power and performance measurement for Servo parallel browser + +This script uses PowerMetrics to measure power usage of Servo on OS X + +## Running + +``` sh +cd servo/test/power +sudo python PowerMeasure.py +``` +You can define the maximum number of threads in layout level, rendering by cpu, benchmarks and output directory with these command line arguments: + +- `-b BENCHMARK, --benchmark BENCHMARK` sets the benchmark, for example "-B perf-rainbow.html" +- `-c CPU, --CPU CPU` renders with CPU instead of GPU +- `-l LAYOUTTHREADS, --LayoutThreads LAYOUTTHREADS` sets the maximum number of threads for layout, for example " -L 5" +- `-o OUTPUT, --Output OUTPUT` specifyes the output directory + +## Example + +This command will measure power and performance for 1 to 5 threads in layout with CPU rendering when we are running the about-mozilla.html benchmark + +``` sh +sudo python PowerMeasure.py -L 5 -c cpu -b /Desktop/servo/src/test/html/about-mozilla.html -o /Desktop/Results/ +```