183 lines
5.5 KiB
Python
Executable File
183 lines
5.5 KiB
Python
Executable File
#!/usr/bin/python
|
|
|
|
## ======================================================================== ##
|
|
## Copyright 2009-2012 Intel Corporation ##
|
|
## ##
|
|
## Licensed under the Apache License, Version 2.0 (the "License"); ##
|
|
## you may not use this file except in compliance with the License. ##
|
|
## You may obtain a copy of the License at ##
|
|
## ##
|
|
## http://www.apache.org/licenses/LICENSE-2.0 ##
|
|
## ##
|
|
## Unless required by applicable law or agreed to in writing, software ##
|
|
## distributed under the License is distributed on an "AS IS" BASIS, ##
|
|
## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ##
|
|
## See the License for the specific language governing permissions and ##
|
|
## limitations under the License. ##
|
|
## ======================================================================== ##
|
|
|
|
import sys
|
|
import os
|
|
import re
|
|
|
|
########################## configuration ##########################
|
|
|
|
dash = '/'
|
|
#models = [ 'conference' ]
|
|
#models = [ 'conference', 'sponza', 'headlight', 'crown']
|
|
models = [ 'conference', 'sponza', 'headlight', 'crown', 'bentley', 'xyz_dragon', 'powerplant' ]
|
|
arg = ''
|
|
modelDir = ''
|
|
tutorial = 'tutorial03'
|
|
statDir = 'stat'
|
|
name = ''
|
|
modelDir = '~/models/embree/benchmarking'
|
|
|
|
########################## rendering ##########################
|
|
|
|
def baseName(name,model):
|
|
return name + '_' + model
|
|
|
|
def render(name,model):
|
|
executable = tutorial
|
|
base = baseName(name,model)
|
|
os.system('mkdir -p ' + statDir)
|
|
logFile = statDir + dash + base + '.log'
|
|
if not os.path.exists(logFile):
|
|
command = executable
|
|
command += ' -c ' + modelDir + dash + model + '_tutorial.ecs'
|
|
for arg in args:
|
|
command += ' ' + arg
|
|
command += ' -size 1024 1024 -benchmark 4 8 > ' + logFile
|
|
os.system(command)
|
|
|
|
def renderLoop():
|
|
avgBase = baseName(name,'average')
|
|
memory [avgBase] = 0
|
|
buildperf[avgBase] = 0
|
|
sah [avgBase] = 0
|
|
fps [avgBase] = 0
|
|
fpsgain [avgBase] = 0
|
|
printHeader()
|
|
for model in models:
|
|
sys.stdout.write(' ' + '{0:<20}'.format(model) + ' | ')
|
|
render(name,model)
|
|
extract(name,model,'')
|
|
printData(name,model)
|
|
|
|
########################## data extraction ##########################
|
|
|
|
memory = {}
|
|
buildperf = {}
|
|
sah = {}
|
|
fps = {}
|
|
fpsgain = {}
|
|
|
|
def extract(name,model,prevname):
|
|
base = baseName(name,model)
|
|
prevBase = baseName(prevname,model)
|
|
avgBase = baseName(name,'average')
|
|
logFileName = statDir + dash + base + '.log'
|
|
memory [base] = 0
|
|
buildperf[base] = 0
|
|
sah [base] = 0
|
|
fps [base] = 0
|
|
fpsgain [base] = 0
|
|
try:
|
|
logFile = open(logFileName, 'r')
|
|
for line in logFile:
|
|
if line.count('BENCHMARK_BUILD ') == 1:
|
|
numbers = map(float, line[16:].split(" "))
|
|
buildperf[base] = numbers[1]
|
|
sah [base] = numbers[2]
|
|
memory[base] = numbers[3]
|
|
if line.count('BENCHMARK_RENDER ') == 1:
|
|
numbers = map(float, line[17:].split(" "))
|
|
fps[base] = numbers[0]
|
|
if (prevname != ''):
|
|
fpsgain[base] = 100.0*fps[base]/fps[prevBase]-100.0
|
|
except IOError :
|
|
print('cannot open ' + logFileName)
|
|
|
|
memory [avgBase] += memory [base] / len(models)
|
|
buildperf[avgBase] += buildperf[base] / len(models)
|
|
sah [avgBase] += sah [base] / len(models)
|
|
fps [avgBase] += fps [base] / len(models)
|
|
if (prevname != ''):
|
|
fpsgain [avgBase] += fpsgain [base] / len(models)
|
|
|
|
# Extract all data
|
|
def extractLoop():
|
|
prevname = ''
|
|
for name in names:
|
|
avgBase = baseName(name,'average')
|
|
memory [avgBase] = 0
|
|
buildperf[avgBase] = 0
|
|
sah [avgBase] = 0
|
|
fps [avgBase] = 0
|
|
fpsgain [avgBase] = 0
|
|
for model in models:
|
|
extract(name,model,prevname)
|
|
prevname = name
|
|
|
|
def printData(name,model):
|
|
base = baseName(name,model)
|
|
line = (' %#6.1f MB' % (1E-6*memory[base]))
|
|
line += (' %#6.1f M/s' % (1E-6*buildperf[base]))
|
|
line += (' %#6.1f ' % sah[base])
|
|
line += (' %#6.3f fps' % fps[base])
|
|
line += (' (%#+5.1f%%)' % fpsgain[base])
|
|
line += '\n'
|
|
sys.stdout.write(line)
|
|
|
|
def printHeader():
|
|
tableWidth = 40 + 60
|
|
line = ' ' + '{0:<20}'.format('') + ' | Memory Build SAH Render'
|
|
print(line)
|
|
line = ''
|
|
while (len(line) < tableWidth): line = line + '-'
|
|
print(line)
|
|
|
|
def printDataLoop():
|
|
print('')
|
|
printHeader()
|
|
for model in models:
|
|
print(model)
|
|
for name in names:
|
|
sys.stdout.write(' ' + '{0:<20}'.format(name) + ' | ')
|
|
printData(name,model)
|
|
if len(models) > 1:
|
|
print('average')
|
|
for name in names:
|
|
sys.stdout.write(' ' + '{0:<20}'.format(name) + ' | ')
|
|
printData(name,'average')
|
|
|
|
print('')
|
|
|
|
########################## command line parsing ##########################
|
|
|
|
def printUsage():
|
|
sys.stderr.write('Usage: ' + sys.argv[0] + ' run name tutorialXX args\n')
|
|
sys.stderr.write(' ' + sys.argv[0] + ' print name1 name2 ...\n')
|
|
sys.exit(1)
|
|
|
|
if len(sys.argv) < 3:
|
|
printUsage()
|
|
sys.exit(1)
|
|
|
|
if sys.argv[1] == 'run':
|
|
name = sys.argv[2]
|
|
tutorial = sys.argv[3]
|
|
args = sys.argv[4:]
|
|
renderLoop()
|
|
sys.exit(1)
|
|
|
|
if sys.argv[1] == 'print':
|
|
names = sys.argv[2:]
|
|
extractLoop()
|
|
printDataLoop()
|
|
sys.exit(1)
|
|
|
|
printUsage()
|
|
sys.exit(1)
|