Skip to content

Commit

Permalink
power
Browse files Browse the repository at this point in the history
  • Loading branch information
LalehB committed Aug 27, 2014
1 parent 16ea60c commit 34db70a
Show file tree
Hide file tree
Showing 2 changed files with 195 additions and 0 deletions.
171 changes: 171 additions & 0 deletions 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()
24 changes: 24 additions & 0 deletions 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/
```

0 comments on commit 34db70a

Please sign in to comment.