Transform an AST into a compiled PROGRAM. May trigger BEAM search. Args: ast: The Ops.SINK/Ops.PROGRAM rooted AST renderer: The renderer used to generate the code Returns: The Ops.PROGRAM with SINK/DEVICE/LINEAR/SOURCE/BINARY.
(ast:UOp, renderer:Renderer)
| 174 | @track_rewrites(name=lambda ast,renderer,ret,**kwargs: TracingKey(ret.src[0].arg.name,(ret.src[0].arg.function_name, ast), ret=renderer), replay=True) |
| 175 | @Context(ALLOW_DEVICE_USAGE=0) |
| 176 | def do_to_program(ast:UOp, renderer:Renderer) -> UOp: |
| 177 | """ |
| 178 | Transform an AST into a compiled PROGRAM. May trigger BEAM search. |
| 179 | |
| 180 | Args: |
| 181 | ast: The Ops.SINK/Ops.PROGRAM rooted AST |
| 182 | renderer: The renderer used to generate the code |
| 183 | |
| 184 | Returns: |
| 185 | The Ops.PROGRAM with SINK/DEVICE/LINEAR/SOURCE/BINARY. |
| 186 | """ |
| 187 | if ast.op is Ops.PROGRAM: prg = ast |
| 188 | elif ast.op is Ops.SINK: |
| 189 | assert isinstance(ast.arg, KernelInfo), "requires KernelInfo on arg to to_program" |
| 190 | full_sink = full_rewrite_to_sink(ast, renderer, optimize=ast.tag is None) |
| 191 | prog_info = ProgramInfo.from_sink(full_sink) |
| 192 | # instruction selection |
| 193 | if isinstance(renderer, ISARenderer): |
| 194 | full_sink = graph_rewrite(full_sink, renderer.pre_isel_matcher, ctx=itertools.count(-1, -1), name="pre instruction selection", bottom_up=True) |
| 195 | full_sink = graph_rewrite(full_sink, renderer.isel_matcher, ctx=IselContext(full_sink), name="instruction selection", bottom_up=True) |
| 196 | prg = UOp(Ops.PROGRAM, src=(full_sink, UOp(Ops.DEVICE, arg=renderer.target.device)), arg=prog_info) |
| 197 | else: raise RuntimeError(f"can't call to_program on {ast.op}") |
| 198 | if not isinstance(prg.arg, ProgramInfo): prg = prg.replace(arg=ProgramInfo.from_sink(prg.src[0])) |
| 199 | prg = graph_rewrite(prg, pm_to_program, ctx=renderer, name="linearize/render") |
| 200 | if VIZ: graph_rewrite(prg, PatternMatcher([]), name="View Program") |
| 201 | return prg |
| 202 | |
| 203 | to_program_cache: dict[tuple, UOp] = {} |
| 204 | def to_program(ast:UOp, renderer:Renderer) -> UOp: |
searching dependent graphs…