matrix-shooter-train / native-eiffel /profile_render.py
peih's picture
backup native-eiffel
5dd27d0 verified
Raw History Blame Contribute Delete
1.21 kB
"""Where a native render's time goes: top CUDA kernels and host-side syncs."""
import torch
from torch.profiler import profile, ProfilerActivity
from engine_client import Engine
from native_render import NativeRenderer
engine = Engine()
renderer = NativeRenderer(engine.scene, engine.scene_arrays)
frames = []
for i in range(200):
events = [{'action': 'enter', 'phase': 'down'}, {'action': 'enter', 'phase': 'up'}] if i == 5 else []
header, frame = engine.advance(round((i + 1) * 60 / 24), events, capture=i % 4 == 0, state=False)
if i % 4 == 0:
frames.append({k: v.copy() for k, v in frame.items()})
engine.close()
for f in frames[:20]:
renderer.render(f)
torch.cuda.synchronize()
with profile(activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA]) as prof:
for f in frames[20:40]:
renderer.render(f)
torch.cuda.synchronize()
print(prof.key_averages().table(sort_by='cuda_time_total', row_limit=14, max_name_column_width=60))
syncs = [e for e in prof.key_averages() if any(k in e.key for k in ('Synchronize', 'cudaMemcpy', 'item', 'nonzero', 'local_scalar'))]
for e in syncs:
print('HOST', e.key, e.count, round(e.cpu_time_total / 20 / 1000, 3), 'ms/frame')