engine/rr: opt-in D4R_RR2_UNGUARDED, the translated code without its exactness guards
The parts of preset F that are NVIDIA's PTX translated by ptx2rr.py (encoder 0's and decoder 0's per-pixel code around the native blocks, the output passes) keep NVIDIA's arithmetic bit for bit with three kinds of guard: every register precise, an opaque zero OR-ed into binary16 stores and conversions (SUST_Z), and the NoContraction pass spv_exact_convert.py on their modules. At level 3 the native stages already run this GPU's own arithmetic, so D4R_RR2_UNGUARDED=1 drops the guards there too: ptx2rr.py --unguarded (no precise, SUST_Z 0) and no spv_exact_convert.py on those modules. compile_rr2.py refuses it below level 3. Off by default: the default model's files are byte-identical to the previous ones. Presented image against the default, RGB, peak 1: 1280x720 -> 1440p 56.0 dB on the reset frame, then 43.0 - 45.6 dB; 1114x626 -> 1080p 48.5, then 43.4 - 44.1; the moderate stress input 52.7, then 25 - 30. The exact build (level 0) is as far from the default (43.0 - 44.4; 43.2 - 44.3; 23.8 - 24.3) as from this build (43.0 - 44.4; 43.4 - 44.3; 23.8 - 24.3). Builds with D4R_RR2_SPLIT=1 too. RX 9070 XT, d4r-rr 720p -> 1440p, interleaved: frame 3.526 -> 3.501 ms (output 649 -> 624 us, dec0_1 446 -> 442). Signed-off-by: itchyfeetleech <[email protected]>
This commit is contained in:
1 parent
e94c4018e7
commit
44433c320a
2 files changed
+23
-7
No files matched your search
+8
-1
@@ -950,6 +950,9 @@ class RRT(base.T):
|
||||
w(f'shared uint mms[{384 * (self.bx * self.by * self.bz // 32)}]; // mma_e4m3_f16 scratch, per subgroup')
|
||||
|
||||
def runtime(self):
|
||||
if getattr(self, 'unguarded', False): # --unguarded: no opaque zero
|
||||
assert '#define SUST_Z (gl_NumWorkGroups.z - 1u)' in RR_RUNTIME
|
||||
return RR_RUNTIME.replace('#define SUST_Z (gl_NumWorkGroups.z - 1u)', '#define SUST_Z 0u')
|
||||
return RR_RUNTIME
|
||||
|
||||
|
||||
@@ -976,6 +979,9 @@ def main():
|
||||
ap.add_argument('--oob-report', action='store_true', help='debugging: count out-of-range buffer accesses')
|
||||
ap.add_argument('--exact-convert', action='store_true',
|
||||
help='the module goes through spv_exact_convert.py: lighter guards on binary16 conversions (CVT_GUARD)')
|
||||
ap.add_argument('--unguarded', action='store_true',
|
||||
help="none of the exactness guards: no 'precise' registers and no opaque zero OR-ed into binary16 "
|
||||
"stores and conversions, so the driver may contract, fold and fuse (compile_rr2.py D4R_RR2_UNGUARDED)")
|
||||
ns = ap.parse_args()
|
||||
block = tuple(int(x) for x in ns.block.split(',')) if ns.block else default_block(ns.kernel)
|
||||
formats = {int(k): v for k, v in (x.split('=') for x in ns.surface)}
|
||||
@@ -991,8 +997,9 @@ def main():
|
||||
t.probes = probes
|
||||
t.probe_block = tuple(int(x) for x in ns.probe_block.split(','))
|
||||
t.oob = ns.oob_report
|
||||
t.unguarded = ns.unguarded
|
||||
return t
|
||||
t = base.build(make, False, False, False)
|
||||
t = base.build(make, False, ns.unguarded, False)
|
||||
for off, fmt in formats.items():
|
||||
if off in t.surfaces:
|
||||
t.surfaces[off] = fmt
|
||||
|
||||
Reference in new issue
Block a user