Initial commit
This commit is contained in:
157
benchmark/main.py
Executable file
157
benchmark/main.py
Executable file
@@ -0,0 +1,157 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import argparse
|
||||
import foundation
|
||||
from foundation import (benchrunner,
|
||||
context,
|
||||
logger,
|
||||
system_info,
|
||||
util)
|
||||
|
||||
|
||||
def configureArgumentParser():
|
||||
parser = argparse.ArgumentParser(
|
||||
description="Cycles benchmark helper script.")
|
||||
parser.add_argument("-b", "--blender",
|
||||
help="Full file path to Blender's binary " +
|
||||
"to use for rendering",
|
||||
default="blender")
|
||||
parser.add_argument("-d", "--scenes-dir",
|
||||
help="Directory with scenes",
|
||||
default="")
|
||||
parser.add_argument('-s', '--scenes',
|
||||
nargs='+',
|
||||
help='Scenes to be rendered',
|
||||
default=[])
|
||||
parser.add_argument('-c', '--configure-script',
|
||||
help="Blender-side configuration script",
|
||||
default="configure.py")
|
||||
parser.add_argument('-t', '--device-type',
|
||||
help="Type of the device to render on",
|
||||
default="CPU")
|
||||
parser.add_argument('-n', '--device-name',
|
||||
help="Device name to render on",
|
||||
default="")
|
||||
parser.add_argument('-f', '--full-dump',
|
||||
help="Dump all available in formation",
|
||||
action='store_true',
|
||||
default=False)
|
||||
parser.add_argument('-j', '--json',
|
||||
help="When in full dump mode, dump JSON",
|
||||
action='store_true',
|
||||
default=False)
|
||||
return parser
|
||||
|
||||
|
||||
def _printFullResult(ctx, results):
|
||||
print("")
|
||||
print("=" * 40)
|
||||
# Print system information.
|
||||
sys_info = results['system_info']
|
||||
print("System info:")
|
||||
print(" System: {} {}" . format(sys_info['system'],
|
||||
sys_info['bitness']))
|
||||
if sys_info['system'] == "Linux":
|
||||
print(" Linux distro: {}, {}" . format(sys_info['dist_name'],
|
||||
sys_info['dist_version']))
|
||||
print(" CPU: {}" . format(sys_info['cpu_brand']))
|
||||
devices = sys_info['devices']
|
||||
if devices:
|
||||
print(" Compute devices:")
|
||||
for device in devices:
|
||||
print(" - {}: {}" . format(device['type'], device['name']))
|
||||
# Print Blender version.
|
||||
blender = results['blender_version']
|
||||
print("Blender:")
|
||||
print(" Version: {}" . format(blender['version']))
|
||||
print(" Hash: {}" . format(blender['build_hash']))
|
||||
print(" Commit: {} {}" . format(blender['build_commit_date'],
|
||||
blender['build_commit_time']))
|
||||
print(" Build: {} {}" . format(blender['build_date'],
|
||||
blender['build_time']))
|
||||
# Print scenes status.
|
||||
print("Nenchmark results:")
|
||||
stats = results['stats']
|
||||
for scene in ctx.scenes:
|
||||
if scene not in stats:
|
||||
continue
|
||||
stats = stats[scene]
|
||||
print(" {}:" . format(scene))
|
||||
print(" - Engine render time: {}" . format(
|
||||
util.humanReadableTimeDifference(
|
||||
stats.total_render_time)))
|
||||
print(" - Render time without sync: {}" . format(
|
||||
util.humanReadableTimeDifference(
|
||||
stats.render_time_no_sync)))
|
||||
print(" - Total render time: {}" . format(
|
||||
util.humanReadableTimeDifference(
|
||||
stats.pipeline_render_time)))
|
||||
print(" - Peak memory used on device: {}" . format(
|
||||
util.humanReadableSize(stats.device_peak_memory)))
|
||||
print(" - Memory used on device during rendering: {}" . format(
|
||||
util.humanReadableSize(stats.device_memory_usage)))
|
||||
|
||||
|
||||
def _printFullJSONResult(ctx, results):
|
||||
import json
|
||||
# Convert custom classes to dictionaries for easier JSON dump.
|
||||
json_results = results
|
||||
stats = json_results['stats']
|
||||
for scene in ctx.scenes:
|
||||
if scene not in stats:
|
||||
continue
|
||||
stats[scene] = stats[scene].asDict()
|
||||
print(json.dumps(json_results, sort_keys=True, indent=4))
|
||||
|
||||
|
||||
def _printBriefResult(ctx, results):
|
||||
print("")
|
||||
print("=" * 40)
|
||||
stats = results['stats']
|
||||
for scene in ctx.scenes:
|
||||
if scene not in stats:
|
||||
continue
|
||||
stats = stats[scene]
|
||||
print("{}: {}" . format(
|
||||
scene,
|
||||
util.humanReadableTimeDifference(
|
||||
stats.pipeline_render_time)))
|
||||
|
||||
|
||||
def main():
|
||||
parser = configureArgumentParser()
|
||||
args = parser.parse_args()
|
||||
logger.init()
|
||||
logger.HEADER("Cycles Benchmark Suite v{}" . format(foundation.VERSION))
|
||||
# Configure context.
|
||||
ctx = context.Context()
|
||||
ctx.blender = args.blender
|
||||
ctx.scenes_dir = args.scenes_dir
|
||||
ctx.configure_script = args.configure_script
|
||||
ctx.device_type = args.device_type
|
||||
ctx.device_name = args.device_name
|
||||
if args.scenes:
|
||||
ctx.scenes = args.scenes
|
||||
else:
|
||||
ctx.scenes = ctx.listAllScenes(args.scenes_dir)
|
||||
logger.INFO("Requested device details:")
|
||||
benchrunner.benchmarkPrintDeviceInfo(ctx)
|
||||
# Run benchmark.
|
||||
all_stats = benchrunner.benchmarkAll(ctx)
|
||||
# Gather all information together.
|
||||
result = {
|
||||
"blender_version": system_info.getBlenderVersion(ctx),
|
||||
"system_info": system_info.gatherSystemInfo(ctx),
|
||||
"stats": all_stats if all_stats else {}
|
||||
}
|
||||
if args.full_dump:
|
||||
if args.json:
|
||||
_printFullJSONResult(ctx, result)
|
||||
else:
|
||||
_printFullResult(ctx, result)
|
||||
else:
|
||||
_printBriefResult(ctx, result)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
Reference in New Issue
Block a user