File size: 1,729 Bytes
5dd27d0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
"""CUDA-graph rendering must equal eager rendering bit for bit; and how long a frame takes."""
import json, statistics, time
import torch
from engine_client import Engine
from native_render import NativeRenderer

engine = Engine()
frames = []
for i in range(400):
    ev = [{'action': 'enter', 'phase': 'down'}, {'action': 'enter', 'phase': 'up'}] if i == 5 else []
    if 40 <= i < 380 and i % 24 == 0:
        ev.append({'action': 'w', 'phase': 'down' if (i // 24) % 2 == 0 else 'up'})
    if 60 <= i < 380 and i % 37 == 0:
        ev += [{'action': 'j', 'phase': 'down'}, {'action': 'j', 'phase': 'up'}]
    header, scene = engine.advance(round((i + 1) * 2.5), ev, capture=i % 4 == 0, state=False)
    if i % 4 == 0:
        frames.append({k: v.copy() for k, v in scene.items()})
engine.close()
eager = NativeRenderer(engine.scene, engine.scene_arrays, graphs=False)
graph = NativeRenderer(engine.scene, engine.scene_arrays, graphs=True)
same = sum(int(torch.equal(eager.render(f), graph.render(f))) for f in frames[10:])
rows = {}
for name, r in (('eager', eager), ('graphs', graph)):
    cpu, gpu = [], []
    for f in frames[10:]:
        torch.cuda.synchronize()
        s, e = torch.cuda.Event(enable_timing=True), torch.cuda.Event(enable_timing=True)
        t = time.perf_counter(); s.record(); r.render(f); e.record(); submit = time.perf_counter() - t
        e.synchronize(); cpu.append(submit * 1e3); gpu.append(s.elapsed_time(e))
    rows[name] = dict(submit_ms=round(statistics.median(cpu), 3), ready_ms=round(statistics.median(gpu), 3),
                      ready_p95_ms=round(sorted(gpu)[int(len(gpu) * .95)], 3))
print(json.dumps(dict(frames=len(frames) - 10, identical=f'{same}/{len(frames) - 10}', **rows)))