"""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')