169 lines
5.7 KiB
Python
169 lines
5.7 KiB
Python
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
"""Schedule instructions each corresponds to a schedule primitive"""
|
|
|
|
from typing import TYPE_CHECKING, Any
|
|
|
|
from tvm_ffi import register_object as _register_object
|
|
|
|
from tvm.runtime import Object
|
|
|
|
from . import _ffi_api
|
|
|
|
if TYPE_CHECKING:
|
|
from .schedule import RAND_VAR_TYPE
|
|
|
|
INPUT_RV_TYPE = RAND_VAR_TYPE | float | int | str | None # pylint: disable=invalid-name
|
|
OUTPUT_RV_TYPE = RAND_VAR_TYPE # pylint: disable=invalid-name
|
|
ATTR_TYPE = Any
|
|
else:
|
|
INPUT_RV_TYPE = OUTPUT_RV_TYPE = ATTR_TYPE = Any
|
|
|
|
|
|
@_register_object("s_tir.InstructionKind")
|
|
class InstructionKind(Object):
|
|
"""Kind of an instruction, e.g. Split, Reorder, etc.
|
|
Besides the name, every kind of instruction has its own properties, including:
|
|
1) A boolean indicating if the instruction is pure, i.e. change nothing in the schedule state
|
|
2) A functor that applies the instruction to a TensorIR schedule
|
|
3) A functor that converts the instruction to a statement in python syntax
|
|
4) A functor that serialize its attributes to JSON
|
|
5) A functor that deserialize its attributes from JSON
|
|
|
|
Unlike `tvm.ir.op`, `InstructionKind` doesn't support unstructured properties,
|
|
mainly because there is no such usecase yet to add any other property.
|
|
|
|
Attributes
|
|
----------
|
|
name : str
|
|
The name of a kind of instructions
|
|
|
|
Note
|
|
----
|
|
The functor properties are not exposed on python side at the moment
|
|
"""
|
|
|
|
name: str
|
|
|
|
@property
|
|
def is_pure(self) -> bool:
|
|
"""Indicates if the instruction is pure, i.e. removing it alone doesn't mutate the schedule
|
|
state. For example, the instruction `GetSBlock` is pure because it changes
|
|
nothing, while `ComputeInline` is not because removing it leads to a different resulting
|
|
schedule.
|
|
|
|
Returns
|
|
-------
|
|
pure : bool
|
|
The boolean flag indicating if the instruction is pure
|
|
"""
|
|
return bool(self._is_pure)
|
|
|
|
@staticmethod
|
|
def get(name: str) -> "InstructionKind":
|
|
"""Retrieve an InstructionKind using its name
|
|
|
|
Parameters
|
|
----------
|
|
name : str
|
|
The registered name of the InstructionKind
|
|
|
|
Returns
|
|
-------
|
|
kind : InstructionKind
|
|
The InstructionKind retrieved
|
|
"""
|
|
return _ffi_api.InstructionKindGet(name) # type: ignore # pylint: disable=no-member
|
|
|
|
|
|
@_register_object("s_tir.Instruction")
|
|
class Instruction(Object):
|
|
"""Schedule instructions each corresponds to a schedule primitive
|
|
|
|
Attributes
|
|
----------
|
|
kind : InstructionKind
|
|
The kind of the instruction
|
|
inputs : List[INPUT_RV_TYPE]
|
|
The input random variables of the instruction,
|
|
and the type of each element can be one of the following:
|
|
- SBlockRV
|
|
- LoopRV
|
|
- ExprRV
|
|
- float
|
|
- int
|
|
- str
|
|
- None
|
|
attrs : List[ATTR_TYPE]
|
|
The attributes of the instruction. Similar to attributes of an operator,
|
|
attributes of an instruction are arbitrary constant metadata required by the instructions.
|
|
For example, the name of the block to be retrieved in `GetSBlock`.
|
|
outputs : List[OUTPUT_RV_TYPE]
|
|
The output random variables of the instruction,
|
|
and the type of each element can be one of the following:
|
|
- SBlockRV
|
|
- LoopRV
|
|
- ExprRV, atomic variables only, won't be constants or composite Expr
|
|
"""
|
|
|
|
kind: InstructionKind
|
|
inputs: list[INPUT_RV_TYPE]
|
|
attrs: list[ATTR_TYPE]
|
|
outputs: list[OUTPUT_RV_TYPE]
|
|
|
|
def __init__(
|
|
self,
|
|
kind: InstructionKind,
|
|
inputs: list[INPUT_RV_TYPE],
|
|
attrs: list[ATTR_TYPE],
|
|
outputs: list[OUTPUT_RV_TYPE],
|
|
) -> None:
|
|
"""Constructor
|
|
|
|
Parameters
|
|
----------
|
|
kind : InstructionKind
|
|
The kind of the instruction
|
|
inputs : List[INPUT_RV_TYPE]
|
|
The input random variables of the instruction,
|
|
and the type of each element can be one of the following:
|
|
- SBlockRV
|
|
- LoopRV
|
|
- ExprRV
|
|
- float
|
|
- int
|
|
- str
|
|
- None
|
|
attrs : List[ATTR_TYPE]
|
|
The attributes of the instruction. Similar to attributes of an operator,
|
|
attributes of an instruction are arbitrary constant metadata required by the
|
|
instructions. For example, the name of the block to be retrieved in `GetSBlock`.
|
|
outputs : List[OUTPUT_RV_TYPE]
|
|
The output random variables of the instruction,
|
|
and the type of each element can be one of the following:
|
|
- SBlockRV
|
|
- LoopRV
|
|
- ExprRV, atomic variables only, won't be constants or composite Expr
|
|
"""
|
|
self.__init_handle_by_constructor__(
|
|
_ffi_api.Instruction, # type: ignore # pylint: disable=no-member
|
|
kind,
|
|
inputs,
|
|
attrs,
|
|
outputs,
|
|
)
|