Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
195 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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/ | ||
``` |