- Do not enable CPU device together with OpenCL/CUDA when device name is not specified. - Adopt output log parser fr the changed path tracing message. - Solve issue with using same short name of command line argument for single device specification. - Reshuffle include statements so it's kind of possible to use bundle python. Still need to work this properly, but that's for later.
89 lines
3.5 KiB
Python
89 lines
3.5 KiB
Python
import re
|
|
|
|
from foundation import util
|
|
|
|
|
|
class Stats:
|
|
def __init__(self):
|
|
# Pepare some regex for parsing
|
|
self.re_path_tracing = re.compile(
|
|
".*Rendered ([0-9]+)/([0-9]+) Tiles" +
|
|
"(, Sample ([0-9]+)\/([0-9]+))?$")
|
|
self.re_total_render_time = re.compile(
|
|
".*Total render time: ([0-9]+(\.[0-9]+)?)")
|
|
self.re_render_time_no_sync = re.compile(
|
|
".*Render time \(without synchronization\): ([0-9]+(\.[0-9]+)?)")
|
|
self.re_pipeline_time = re.compile(
|
|
"Time: ([0-9:\.]+) \(Saving: ([0-9:\.]+)\)")
|
|
self.re_cycles_memory = re.compile(
|
|
".*\| Mem:([0-9.]+[KM]?), Peak:([0-9.]+[KM]?) \|.*")
|
|
|
|
# Render time stats.
|
|
self.total_render_time = "N/A"
|
|
self.render_time_no_sync = "N/A"
|
|
self.pipeline_render_time = "N/A"
|
|
|
|
# Render memory stats.
|
|
self.device_peak_memory = "N/A"
|
|
self.device_memory_usage = "N/A"
|
|
|
|
# Current stats.
|
|
self.current_tiles = 0
|
|
self.total_tiles = 0
|
|
|
|
def update(self, line):
|
|
# Current tile progress.
|
|
match = self.re_path_tracing.match(line)
|
|
if match:
|
|
self.current_tiles = int(match.group(1))
|
|
self.total_tiles = int(match.group(2))
|
|
# Total render time.
|
|
match = self.re_total_render_time.match(line)
|
|
if match:
|
|
self.total_render_time = float(match.group(1))
|
|
# Render time without sync.
|
|
match = self.re_render_time_no_sync.match(line)
|
|
if match:
|
|
self.render_time_no_sync = float(match.group(1))
|
|
# Total pipeline time.
|
|
match = self.re_pipeline_time.match(line)
|
|
if match:
|
|
self.pipeline_render_time = \
|
|
util.humanReadableTimeToSeconds(match.group(1))
|
|
# Memory usage.
|
|
match = self.re_cycles_memory.match(line)
|
|
if match:
|
|
mem = util.humanReadableSizeToMegabytes(match.group(1))
|
|
peak = util.humanReadableSizeToMegabytes(match.group(1))
|
|
if self.device_memory_usage == "N/A" or \
|
|
mem > self.device_memory_usage:
|
|
self.device_memory_usage = mem
|
|
if self.device_peak_memory == "N/A" or \
|
|
mem > self.device_peak_memory:
|
|
self.device_peak_memory = mem
|
|
|
|
def print(self):
|
|
# TODO(sergey): Check that all stats are available.
|
|
print("Total pipeline render time: {} ({} sec)"
|
|
. format(util.humanReadableTimeDifference(
|
|
self.pipeline_render_time),
|
|
self.pipeline_render_time))
|
|
print("Total Cycles render time: {} ({} sec)"
|
|
. format(util.humanReadableTimeDifference(
|
|
self.total_render_time),
|
|
self.total_render_time))
|
|
print("Pure Cycles render time (without sync): {} ({} sec)"
|
|
. format(util.humanReadableTimeDifference(
|
|
self.render_time_no_sync),
|
|
self.render_time_no_sync))
|
|
print("Cycles memoty usage: {} ({} peak)"
|
|
. format(self.device_memory_usage,
|
|
self.device_peak_memory))
|
|
|
|
def asDict(self):
|
|
return {'total_render_time': self.total_render_time,
|
|
'render_time_no_sync': self.render_time_no_sync,
|
|
'pipeline_render_time': self.pipeline_render_time,
|
|
'device_peak_memory': self.device_peak_memory,
|
|
'device_memory_usage': self.device_memory_usage}
|