This is an automated email from the ASF dual-hosted git repository.
tqchen pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tvm.git
The following commit(s) were added to refs/heads/main by this push:
new 5d1cc1fdc1 [REFACTOR][IR] Initialize Python Op APIs from registered
namespaces (#20539)
5d1cc1fdc1 is described below
commit 5d1cc1fdc1bc1e2cad7324974c40710cb4435932
Author: Tianqi Chen <[email protected]>
AuthorDate: Sun Oct 4 09:51:30 2026 -0400
[REFACTOR][IR] Initialize Python Op APIs from registered namespaces (#20539)
---
python/tvm/backend/cuda/__init__.py | 6 +-
python/tvm/backend/cuda/op.py | 551 +--------------------
python/tvm/backend/cuda/script.py | 200 +++-----
python/tvm/ir/op.py | 89 ++++
python/tvm/tirx/script/ir_builder/op.py | 28 +-
src/backend/cuda/op/iket.cc | 13 +-
src/backend/cuda/op/target_builtin.cc | 473 +++++++++---------
src/tirx/script/printer/expr.cc | 64 ++-
tests/python/tirx/iket/test_iket_profiler.py | 8 +-
.../python/tirx/script/test_tirx_script_printer.py | 6 +-
tests/python/tirx/test_op_namespace_cleanup.py | 6 +-
11 files changed, 516 insertions(+), 928 deletions(-)
diff --git a/python/tvm/backend/cuda/__init__.py
b/python/tvm/backend/cuda/__init__.py
index 627ff1a0ff..df0b40dc79 100644
--- a/python/tvm/backend/cuda/__init__.py
+++ b/python/tvm/backend/cuda/__init__.py
@@ -73,7 +73,7 @@ def register_backend():
pass
register_device_target_detector("cuda", _detect_target_from_device)
for name, namespace in script_namespaces().items():
- builder_op.register_script_namespace(name, namespace)
+ builder_op.register_script_namespace(name, namespace,
canonical_op_names=name == "cuda")
# script_namespaces() above pulls in ptx, which only imports the shared
# codegen layer -- not the device-helper modules. This import is the sole
@@ -85,16 +85,16 @@ def register_backend():
def script_namespaces(**_):
"""Return CUDA-owned TVMScript namespaces."""
+ from . import script # pylint: disable=import-outside-toplevel
from .ptx import PTXNamespace # pylint: disable=import-outside-toplevel
from .script import ( # pylint: disable=import-outside-toplevel
- CUDANamespace,
NVSHMEMNamespace,
PTXLegacyNamespace,
STIRNamespace,
)
return {
- "cuda": CUDANamespace(),
+ "cuda": script,
"nvshmem": NVSHMEMNamespace(),
"ptx_legacy": PTXLegacyNamespace(),
"ptx": PTXNamespace(),
diff --git a/python/tvm/backend/cuda/op.py b/python/tvm/backend/cuda/op.py
index 534bc625f9..65d8df68c7 100644
--- a/python/tvm/backend/cuda/op.py
+++ b/python/tvm/backend/cuda/op.py
@@ -21,6 +21,7 @@ from __future__ import annotations
from tvm import tirx
from tvm.ir import Call, Op, StringImm
+from tvm.ir.op import _init_op_api
from tvm.ir.type import PointerType, PrimType
from tvm.runtime import const
from tvm.tirx.op import bitwise_and, call_intrin, tvm_access_ptr
@@ -69,16 +70,6 @@ def cuda_iket_range_push(name, payload=None):
return call_intrin("", "tirx.cuda.iket_range_push", name)
-def cuda_iket_range_pop():
- """Create an NVIDIA IKET stack-range pop annotation."""
- return call_intrin("", "tirx.cuda.iket_range_pop")
-
-
-def cuda_iket_sentinel_token(name):
- """Create a no-op NVIDIA IKET range token for warp-uniform control flow."""
- return call_intrin("uint32", "tirx.cuda.iket_sentinel_token", name)
-
-
def cuda_iket_official_event(event_id, source_code="", payload=None):
"""Create an NVIDIA IKET official range-end event."""
if payload is not None:
@@ -194,194 +185,6 @@ def cuda_cta_min(value, num_warps, scratch):
return cuda_cta_reduce(value, "min", num_warps, scratch)
-def cuda_warp_sync():
- """TVM intrinsic to synchronize threads within the current warp.
-
- This lowers to a CUDA `__syncwarp()` call.
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("", "tirx.cuda.warp_sync")
-
-
-def cuda_cta_sync():
- """TVM intrinsic to call CUDA syncthreads (block-wide barrier)
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("", "tirx.cuda.cta_sync")
-
-
-def cuda_grid_sync():
- """TVM intrinsic to call CUDA grid-wide sync (cooperative groups)
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("", "tirx.cuda.grid_sync")
-
-
-def cuda_cluster_sync():
- """TVM intrinsic to call CUDA cluster-wide barrier sync
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("", "tirx.cuda.cluster_sync")
-
-
-def cuda_thread_rank():
- """TVM intrinsic that returns ``cooperative_groups::thread_rank()``
- for the enclosing CTA -- the linear thread index within the block.
-
- Useful for building "single thread of CTA" predicates without
- referencing user-declared scope_id vars. For example, the idiomatic
- mbarrier.init leader predicate is::
-
- T.cuda.thread_rank() == 0
-
- Returns
- -------
- call : Expr
- The call expression (``int32``).
- """
- return call_intrin("int32", "tirx.cuda.thread_rank")
-
-
-def cuda_half2float(src):
- """TVM intrinsic to convert half to float
-
- Parameters
- ----------
- src : Expr
- Source pointer.
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("float32", "tirx.cuda.half2float", src)
-
-
-def cuda_bfloat162float(src):
- """TVM intrinsic to convert bfloat16 to float
-
- Parameters
- ----------
- src : Expr
- Source pointer.
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("float32", "tirx.cuda.bfloat162float", src)
-
-
-def cuda_float22half2(dst, src):
- """TVM intrinsic to convert float2 to half2 with rounding
-
- Parameters
- ----------
- dst : Expr
- Destination pointer.
-
- src : Expr
- Source pointer.
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("", "tirx.cuda.float22half2", dst, src)
-
-
-def cuda_trap_when_assert_failed(cond):
- """TVM intrinsic to trap when assertion failed (cond == false)
-
- Parameters
- ----------
- cond : Expr
- Condition to check.
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("", "tirx.cuda.trap_when_assert_failed", cond)
-
-
-def cuda_runtime_instr_desc(desc, sf_id):
- """TVM intrinsic to update runtime instruction descriptor
-
- Parameters
- ----------
- desc : Expr
- Pointer to the descriptor (uint32*).
-
- sf_id : Expr
- The subfragment id.
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("", "tirx.cuda.runtime_instr_desc", desc, sf_id)
-
-
-def cuda_half8tofloat8(src_addr, dst_addr):
- """TVM intrinsic to convert 8 half2s to 8 float2s
-
- Parameters
- ----------
- src_addr : Expr
- Source pointer.
-
- dst_addr : Expr
- Destination pointer.
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("", "tirx.cuda.half8tofloat8", src_addr, dst_addr)
-
-
-def cuda_float8tohalf8(src_addr, dst_addr):
- """TVM intrinsic to convert 8 float2s to 8 half2s
-
- Parameters
- ----------
- src_addr : Expr
- Source pointer.
-
- dst_addr : Expr
- Destination pointer.
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("", "tirx.cuda.float8tohalf8", src_addr, dst_addr)
-
-
_WAIT_UNTIL_SCOPE = ("cta", "cluster", "gpu", "sys")
# Global only, and that is the whole surface a declared word needs. A protocol
# that waits inside a CTA or a cluster has `mbarrier`, which is the hardware's
@@ -534,42 +337,6 @@ def _validate_mbarrier_arrive_attrs(sem, scope, space,
remote):
raise ValueError("remote mbarrier.arrive requires
space='shared::cluster'")
-def cuda_mbarrier_wait(bar, phase):
- """Retry ``mbarrier.try_wait.parity.acquire.cta`` until it returns true.
-
- Parameters
- ----------
- bar : Var
- The pointer to barrier variable.
-
- phase : int
- The phase of the barrier.
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("", "tirx.cuda.mbarrier_wait", bar, phase)
-
-
-def cuda_mbarrier_wait_acquire_cluster(bar, phase):
- """``mbarrier.try_wait.parity.acquire.cluster`` retry loop.
-
- Cluster-scope acquire wait — used to wait on a barrier that a remote CTA in
- the cluster arrives on (a group cluster wait).
-
- Parameters
- ----------
- bar : Var
- The pointer to barrier variable.
-
- phase : int
- The phase of the barrier.
- """
- return call_intrin("", "tirx.cuda.mbarrier_wait_acquire_cluster", bar,
phase)
-
-
def ptx_cp_async_legacy(*all_args):
"""Legacy ``ptx_cp_async`` API taking explicit src/dst offsets.
@@ -610,11 +377,6 @@ def _is_static_unicast_cta_mask(cta_mask):
return False
-def cuda_elect_sync():
- """TVM intrinsic to call elect.sync"""
- return call_intrin("uint32", "tirx.cuda.elect_sync")
-
-
def cuda_mov_sreg(bits, reg_name):
"""TVM intrinsic to tvm instrinsics to fetch PTX pre-defined registers
@@ -841,72 +603,6 @@ def ptx_legacy_ldmatrix(*all_args):
)
-def cuda_wgmma_encode_matrix_descriptor(desc, addr, ldo, sdo, swizzle):
- """TVM intrinsic to create memory descriptor for wgmma instructions
-
- Parameters
- ----------
- desc : Expr
- The pointer to the shared memory descriptor.
-
- addr : Expr
- The address of the matrix.
-
- ldo : Expr
- The leading dimension offset.
-
- sdo : Expr
- The stride dimension offset.
-
- swizzle : int
- The swizzle value (CUtensorMapSwizzle_enum).
- """
- return call_intrin(
- "", "tirx.cuda.wgmma_encode_matrix_descriptor", desc, addr, ldo, sdo,
swizzle
- )
-
-
-def cuda_wgmma_noop_barrier(reg):
- """TVM intrinsic to call "" : "+{format}"(reg)::"memory"
-
- Parameters
- ----------
- reg : Expr
- The register to fence.
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("", "tirx.cuda.wgmma_noop_barrier", reg)
-
-
-def cuda_tcgen05_encode_matrix_descriptor(desc, addr, ldo, sdo, swizzle):
- """TVM intrinsic to create memory descriptor for tcgen05 instructions
-
- Parameters
- ----------
- desc : Expr
- The pointer to the shared memory descriptor.
-
- addr : Expr
- The address of the matrix.
-
- ldo : Expr
- The leading dimension offset.
-
- sdo : Expr
- The stride dimension offset.
-
- swizzle : int
- The swizzle value (CUtensorMapSwizzle_enum).
- """
- return call_intrin(
- "", "tirx.cuda.tcgen05_encode_matrix_descriptor", desc, addr, ldo,
sdo, swizzle
- )
-
-
def cuda_tcgen05_encode_instr_descriptor(
desc,
*,
@@ -1324,104 +1020,6 @@ def cuda_atomic_add(res_addr, value):
return call_intrin(value.ty, "tirx.cuda.atomic_add", res_addr, value)
-def cuda_thread_fence():
- """TVM intrinsic to call cuda thread fence instruction
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("", "tirx.cuda.thread_fence")
-
-
-def cuda_warpgroup_sync(bar_no):
- """TVM intrinsic to synchronize a CUDA warpgroup via a named barrier.
-
- Parameters
- ----------
- bar_no : Expr
- The named barrier id to use for the warpgroup.
-
- Notes
- -----
- Synchronizes 128 threads in a warpgroup using `bar.sync bar_no, 128`.
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("", "tirx.cuda.warpgroup_sync", bar_no)
-
-
-def cuda_syncthreads_and(cond):
- """TVM intrinsic to call cuda syncthreads_and instruction
-
- Parameters
- ----------
- cond: Expr
- The condition.
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("int64", "tirx.cuda.syncthreads_and", cond)
-
-
-def cuda_syncthreads_or(cond):
- """TVM intrinsic to call cuda syncthreads_or instruction
-
- Parameters
- ----------
- cond: Expr
- The condition.
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("int64", "tirx.cuda.syncthreads_or", cond)
-
-
-def cuda_nano_sleep(time):
- """TVM intrinsic to call cuda nano sleep instruction
-
- Parameters
- ----------
- time: Expr
- The time to sleep.
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("", "tirx.cuda.nano_sleep", time)
-
-
-def cuda_printf(fmt, *args):
- """TVM intrinsic to call cuda printf instruction
-
- Parameters
- ----------
- fmt: str
- The format string.
-
- *args: list
- The arguments to the format string.
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("", "tirx.cuda.printf", fmt, *args)
-
-
def cuda_ldg(addr, dtype, *, dst=None, vec=""):
"""TVM intrinsic to call CUDA C++ ``__ldg()``.
@@ -1456,76 +1054,12 @@ def cuda_ldg(addr, dtype, *, dst=None, vec=""):
return call_intrin("", "tirx.cuda.ldg", *dst, addr, dtype, vec, vec_len)
-def cuda_fdividef(x, y):
- """TVM intrinsic to call CUDA C++ ``__fdividef`` fast float division."""
- return call_intrin("float32", "tirx.cuda.fdividef", x, y)
-
-
-def cuda_get_tmem_addr(addr, row_offset, col_offset):
- """TVM intrinsic to call cuda tmem address calculation
-
- Parameters
- ----------
- addr: Expr
- The memory address to calculate.
-
- row_offset: Expr
- The row offset to calculate.
-
- col_offset: Expr
- The column offset to calculate.
-
- Returns
- -------
- call : Expr
- The call expression.
- """
- return call_intrin("uint32", "tirx.cuda.get_tmem_addr", addr, row_offset,
col_offset)
-
-
-def cuda_cvta_generic_to_shared(ptr):
- """Convert a generic pointer to a shared-memory address (uint32).
-
- Wraps ``__cvta_generic_to_shared(ptr)``. Used by op-wrappers that
- precompute the shared-memory address at the wrapper layer instead of
- inside the asm helper body.
- """
- return call_intrin("uint32", "tirx.cuda.cvta_generic_to_shared", ptr)
-
-
-def cuda_smem_addr_from_uint64(cluster_addr):
- """Narrow a 64-bit cluster-mapped SMEM address to a 32-bit SMEM address.
-
- Wraps ``static_cast<unsigned int>(cluster_addr)``. Used by
- cp.async.bulk.shared::cluster.* op-wrappers.
- """
- return call_intrin("uint32", "tirx.cuda.smem_addr_from_uint64",
cluster_addr)
-
-
def cuda_sm100_2sm_leader_smem_addr(ptr):
"""Return the SM100 2SM leader CTA shared-address operand.
The input is a generic pointer to shared memory.
"""
- return bitwise_and(cuda_cvta_generic_to_shared(ptr), const(0xFEFFFFFF,
dtype="uint32"))
-
-
-def cuda_any_sync(mask, pred):
- """TVM intrinsic for PTX warp-wide any predicate (__any_sync)
-
- Parameters
- ----------
- mask : Expr
- The thread mask (uint32).
- pred : Expr
- The predicate value (int32).
-
- Returns
- -------
- call : Expr
- The call expression returning 1 if any thread in mask has pred != 0.
- """
- return call_intrin("int32", "tirx.cuda.any_sync", mask, pred)
+ return bitwise_and(globals()["cvta_generic_to_shared"](ptr),
const(0xFEFFFFFF, dtype="uint32"))
_PTX_CVT_TYPES = {
@@ -1646,78 +1180,6 @@ def _validate_ptx_address(addr, space, op_name):
)
-def cuda_uint_as_float(bits):
- return call_intrin("float32", "tirx.cuda.uint_as_float", bits)
-
-
-def cuda_float_as_uint(x):
- return call_intrin("uint32", "tirx.cuda.float_as_uint", x)
-
-
-def cuda_ballot_sync(mask, pred):
- return call_intrin("uint32", "tirx.cuda.ballot_sync", mask, pred)
-
-
-def cuda_ffs_u32(value):
- return call_intrin("int32", "tirx.cuda.ffs_u32", value)
-
-
-def cuda_reduce_add_sync_u32(mask, value):
- return call_intrin("uint32", "tirx.cuda.reduce_add_sync_u32", mask, value)
-
-
-def cuda_reduce_min_sync_u32(mask, value):
- return call_intrin("uint32", "tirx.cuda.reduce_min_sync_u32", mask, value)
-
-
-def cuda_clock64():
- return call_intrin("uint64", "tirx.cuda.clock64")
-
-
-def cuda_make_float2(x, y):
- return call_intrin("uint64", "tirx.cuda.make_float2", x, y)
-
-
-def cuda_float2_x(packed):
- return call_intrin("float32", "tirx.cuda.float2_x", packed)
-
-
-def cuda_float2_y(packed):
- return call_intrin("float32", "tirx.cuda.float2_y", packed)
-
-
-def cuda_fmul2_rn(a, b):
- return call_intrin("uint64", "tirx.cuda.fmul2_rn", a, b)
-
-
-def cuda_fadd2_rn(a, b):
- return call_intrin("uint64", "tirx.cuda.fadd2_rn", a, b)
-
-
-def cuda_float22bfloat162_rn(v0, v1):
- return call_intrin("uint32", "tirx.cuda.float22bfloat162_rn", v0, v1)
-
-
-def cuda_float22bfloat162_rn_from_float2(packed):
- return call_intrin("uint32", "tirx.cuda.float22bfloat162_rn_from_float2",
packed)
-
-
-def cuda_bfloat1622float2(packed):
- return call_intrin("uint64", "tirx.cuda.bfloat1622float2", packed)
-
-
-def cuda_hmin2(a, b):
- return call_intrin("uint32", "tirx.cuda.hmin2", a, b)
-
-
-def cuda_hmax2(a, b):
- return call_intrin("uint32", "tirx.cuda.hmax2", a, b)
-
-
-def cuda_fp8x4_e4m3_from_float4(x, y, z, w):
- return call_intrin("uint32", "tirx.cuda.fp8x4_e4m3_from_float4", x, y, z,
w)
-
-
def cuda_atomic_cas(ptr, old_val, new_val):
"""TVM intrinsic to call cuda atomic cas instruction
@@ -2125,3 +1587,12 @@ def nvshmem_barrier_all():
"""
return call_intrin("", "tirx.nvshmem.barrier_all")
+
+
+# Canonical Op builders also supply the historical direct-import aliases.
+_init_op_api("tirx.cuda", __name__)
+for _name in Op.list_op_names():
+ if _name.startswith("tirx.cuda."):
+ _suffix = _name.removeprefix("tirx.cuda.")
+ if "." not in _suffix:
+ globals().setdefault("cuda_" + _suffix, globals()[_suffix])
diff --git a/python/tvm/backend/cuda/script.py
b/python/tvm/backend/cuda/script.py
index 048805fb23..bfe448c663 100644
--- a/python/tvm/backend/cuda/script.py
+++ b/python/tvm/backend/cuda/script.py
@@ -21,6 +21,7 @@ from __future__ import annotations
from collections.abc import Callable
from typing import Any
+from tvm import ir as _ir
from tvm.backend.cuda import op as _cuda_op
from tvm.tirx import is_buffer_var
from tvm.tirx import op as _tir_op
@@ -120,128 +121,80 @@ class IketNamespace:
self.official_event = _op_wrapper(_cuda_op.cuda_iket_official_event)
-class CUDANamespace:
- """The CUDA intrinsics submodule."""
-
- def __init__(self):
- self.iket = IketNamespace()
- self.wgmma = CudaWgmmaNamespace()
- self.tcgen05 = CudaTcgen05Namespace()
- self.any_sync = _op_wrapper(_cuda_op.cuda_any_sync)
- # elect.sync plus the predicated mov that materializes its predicate:
- # a multi-statement asm block, so it belongs here rather than T.ptx.
- # The warp-specialization passes match this op to build predicates.
- self.elect_sync: Callable[..., Any] =
_op_wrapper(_cuda_op.cuda_elect_sync)
- # `mov.u32 d, %sreg` -- one PTX instruction, but the special-register
- # name is baked into the asm text, so it is a helper per register
- # rather than a ptx entry with a register operand.
- self.mov_sreg: Callable[..., Any] = _op_wrapper(_cuda_op.cuda_mov_sreg)
- # Spin-until-ready mbarrier waits: label-loop asm blocks, not single
- # PTX instructions -- which is why they live here and not in T.ptx.
- # One declared synchronization word: every access a protocol makes to
- # it goes through these, so a checker can separate them from a stray
- # access and read the word's write history off the declaration.
- self.wait_until = _op_wrapper(_cuda_op.cuda_wait_until)
- self.mbarrier_wait = _op_wrapper(_cuda_op.cuda_mbarrier_wait)
- self.mbarrier_wait_acquire_cluster = _op_wrapper(
- _cuda_op.cuda_mbarrier_wait_acquire_cluster
- )
- self.atomic_add = _op_wrapper(_cuda_op.cuda_atomic_add)
- self.thread_fence = _op_wrapper(_cuda_op.cuda_thread_fence)
- self.warpgroup_sync = _op_wrapper(_cuda_op.cuda_warpgroup_sync)
- self.warp_sync = _op_wrapper(_cuda_op.cuda_warp_sync)
- self.warp_reduce = _op_wrapper(_cuda_op.cuda_warp_reduce)
- self.warp_sum = _op_wrapper(_cuda_op.cuda_warp_sum)
- self.warp_max = _op_wrapper(_cuda_op.cuda_warp_max)
- self.warp_min = _op_wrapper(_cuda_op.cuda_warp_min)
- self.cta_reduce = _op_wrapper(_cuda_op.cuda_cta_reduce)
- self.cta_sum = _op_wrapper(_cuda_op.cuda_cta_sum)
- self.cta_max = _op_wrapper(_cuda_op.cuda_cta_max)
- self.cta_min = _op_wrapper(_cuda_op.cuda_cta_min)
- self.cta_sync = _op_wrapper(_cuda_op.cuda_cta_sync)
- self.grid_sync = _op_wrapper(_cuda_op.cuda_grid_sync)
- self.cluster_sync = _op_wrapper(_cuda_op.cuda_cluster_sync)
- self.thread_rank = _op_wrapper(_cuda_op.cuda_thread_rank)
- self.trap_when_assert_failed =
_op_wrapper(_cuda_op.cuda_trap_when_assert_failed)
- self.runtime_instr_desc = _op_wrapper(_cuda_op.cuda_runtime_instr_desc)
- self.half2float = _op_wrapper(_cuda_op.cuda_half2float)
- self.bfloat162float = _op_wrapper(_cuda_op.cuda_bfloat162float)
- self.float22half2 = _op_wrapper(_cuda_op.cuda_float22half2)
- self.half8tofloat8 = _op_wrapper(_cuda_op.cuda_half8tofloat8)
- self.float8tohalf8 = _op_wrapper(_cuda_op.cuda_float8tohalf8)
- self.syncthreads_and = _op_wrapper(_cuda_op.cuda_syncthreads_and)
- self.syncthreads_or = _op_wrapper(_cuda_op.cuda_syncthreads_or)
- self.nano_sleep = _op_wrapper(_cuda_op.cuda_nano_sleep)
- self.atomic_cas = _op_wrapper(_cuda_op.cuda_atomic_cas)
- self.func_call = _op_wrapper(_cuda_op.cuda_func_call)
- self.printf = _op_wrapper(_cuda_op.cuda_printf)
- self.ldg = _op_wrapper(_cuda_op.cuda_ldg)
- self.fdividef = _op_wrapper(_cuda_op.cuda_fdividef)
- self.get_tmem_addr = _op_wrapper(_cuda_op.cuda_get_tmem_addr)
- self.cvta_generic_to_shared =
_op_wrapper(_cuda_op.cuda_cvta_generic_to_shared)
- self.smem_addr_from_uint64 =
_op_wrapper(_cuda_op.cuda_smem_addr_from_uint64)
- self.sm100_2sm_leader_smem_addr =
_op_wrapper(_cuda_op.cuda_sm100_2sm_leader_smem_addr)
- self.uint_as_float = _op_wrapper(_cuda_op.cuda_uint_as_float)
- self.float_as_uint = _op_wrapper(_cuda_op.cuda_float_as_uint)
- self.ballot_sync = _op_wrapper(_cuda_op.cuda_ballot_sync)
- self.ffs_u32 = _op_wrapper(_cuda_op.cuda_ffs_u32)
- self.reduce_add_sync_u32 =
_op_wrapper(_cuda_op.cuda_reduce_add_sync_u32)
- self.reduce_min_sync_u32 =
_op_wrapper(_cuda_op.cuda_reduce_min_sync_u32)
- self.clock64 = _op_wrapper(_cuda_op.cuda_clock64)
- self.make_float2 = _op_wrapper(_cuda_op.cuda_make_float2)
- self.float2_x = _op_wrapper(_cuda_op.cuda_float2_x)
- self.float2_y = _op_wrapper(_cuda_op.cuda_float2_y)
- self.fmul2_rn = _op_wrapper(_cuda_op.cuda_fmul2_rn)
- self.fadd2_rn = _op_wrapper(_cuda_op.cuda_fadd2_rn)
- self.float22bfloat162_rn =
_op_wrapper(_cuda_op.cuda_float22bfloat162_rn)
- self.float22bfloat162_rn_from_float2 = _op_wrapper(
- _cuda_op.cuda_float22bfloat162_rn_from_float2
- )
- self.bfloat1622float2 = _op_wrapper(_cuda_op.cuda_bfloat1622float2)
- self.hmin2 = _op_wrapper(_cuda_op.cuda_hmin2)
- self.hmax2 = _op_wrapper(_cuda_op.cuda_hmax2)
- self.fp8x4_e4m3_from_float4 =
_op_wrapper(_cuda_op.cuda_fp8x4_e4m3_from_float4)
- self.timer_init = _op_wrapper(_cuda_op.timer_init_cuda)
- self.timer_start = _op_wrapper(_cuda_op.timer_start_cuda)
- self.timer_end = _op_wrapper(_cuda_op.timer_end_cuda)
- self.timer_finalize = _op_wrapper(_cuda_op.timer_finalize_cuda)
- self.mma_store = _dtype_forward(_cuda_op.mma_store)
- self.mma_fill = _dtype_forward(_cuda_op.mma_fill)
- self.mma_store_legacy = _dtype_forward(_cuda_op.mma_store_legacy)
- self.mma_fill_legacy = _dtype_forward(_cuda_op.mma_fill_legacy)
- setattr(self, "__shfl_sync", self._shfl_sync)
- setattr(self, "__shfl_up_sync", self._shfl_up_sync)
- setattr(self, "__shfl_down_sync", self._shfl_down_sync)
- setattr(self, "__shfl_xor_sync", self._shfl_xor_sync)
- setattr(self, "__activemask", self._activemask)
-
- @staticmethod
- def _shfl_sync(mask, var, lane, width):
- if is_buffer_var(var):
- var = var[0]
- return _tir_op.call_intrin(var.ty, "tirx.cuda.__shfl_sync", mask, var,
lane, width)
-
- @staticmethod
- def _shfl_up_sync(mask, var, delta, width):
- if is_buffer_var(var):
- var = var[0]
- return _tir_op.call_intrin(var.ty, "tirx.cuda.__shfl_up_sync", mask,
var, delta, width)
-
- @staticmethod
- def _shfl_down_sync(mask, var, delta, width):
- if is_buffer_var(var):
- var = var[0]
- return _tir_op.call_intrin(var.ty, "tirx.cuda.__shfl_down_sync", mask,
var, delta, width)
-
- @staticmethod
- def _shfl_xor_sync(mask, var, lane_mask, width):
- if is_buffer_var(var):
- var = var[0]
- return _tir_op.call_intrin(var.ty, "tirx.cuda.__shfl_xor_sync", mask,
var, lane_mask, width)
-
- @staticmethod
- def _activemask():
- return _tir_op.call_intrin("uint32", "tirx.cuda.__activemask")
+def _shfl_sync(mask, var, lane, width):
+ if is_buffer_var(var):
+ var = var[0]
+ return _tir_op.call_intrin(var.ty, "tirx.cuda.__shfl_sync", mask, var,
lane, width)
+
+
+def _shfl_up_sync(mask, var, delta, width):
+ if is_buffer_var(var):
+ var = var[0]
+ return _tir_op.call_intrin(var.ty, "tirx.cuda.__shfl_up_sync", mask, var,
delta, width)
+
+
+def _shfl_down_sync(mask, var, delta, width):
+ if is_buffer_var(var):
+ var = var[0]
+ return _tir_op.call_intrin(var.ty, "tirx.cuda.__shfl_down_sync", mask,
var, delta, width)
+
+
+def _shfl_xor_sync(mask, var, lane_mask, width):
+ if is_buffer_var(var):
+ var = var[0]
+ return _tir_op.call_intrin(var.ty, "tirx.cuda.__shfl_xor_sync", mask, var,
lane_mask, width)
+
+
+def _activemask():
+ return _tir_op.call_intrin("uint32", "tirx.cuda.__activemask")
+
+
+iket = IketNamespace()
+wgmma = CudaWgmmaNamespace()
+tcgen05 = CudaTcgen05Namespace()
+mov_sreg: Callable[..., Any] = _cuda_op.cuda_mov_sreg
+wait_until = _cuda_op.cuda_wait_until
+atomic_add = _cuda_op.cuda_atomic_add
+warp_reduce = _cuda_op.cuda_warp_reduce
+warp_sum = _cuda_op.cuda_warp_sum
+warp_max = _cuda_op.cuda_warp_max
+warp_min = _cuda_op.cuda_warp_min
+cta_reduce = _cuda_op.cuda_cta_reduce
+cta_sum = _cuda_op.cuda_cta_sum
+cta_max = _cuda_op.cuda_cta_max
+cta_min = _cuda_op.cuda_cta_min
+atomic_cas = _cuda_op.cuda_atomic_cas
+func_call = _cuda_op.cuda_func_call
+ldg = _cuda_op.cuda_ldg
+sm100_2sm_leader_smem_addr = _cuda_op.cuda_sm100_2sm_leader_smem_addr
+timer_init = _cuda_op.timer_init_cuda
+timer_start = _cuda_op.timer_start_cuda
+timer_end = _cuda_op.timer_end_cuda
+timer_finalize = _cuda_op.timer_finalize_cuda
+mma_store = _dtype_forward(_cuda_op.mma_store)
+mma_fill = _dtype_forward(_cuda_op.mma_fill)
+mma_store_legacy = _dtype_forward(_cuda_op.mma_store_legacy)
+mma_fill_legacy = _dtype_forward(_cuda_op.mma_fill_legacy)
+mov_sreg.__tvm_op__ = _ir.Op.get("tirx.cuda.mov_sreg")
+wait_until.__tvm_op__ = _ir.Op.get("tirx.cuda.wait_until")
+atomic_add.__tvm_op__ = _ir.Op.get("tirx.cuda.atomic_add")
+warp_reduce.__tvm_op__ = _ir.Op.get("tirx.cuda.warp_reduce")
+cta_reduce.__tvm_op__ = _ir.Op.get("tirx.cuda.cta_reduce")
+atomic_cas.__tvm_op__ = _ir.Op.get("tirx.cuda.atomic_cas")
+func_call.__tvm_op__ = _ir.Op.get("tirx.cuda.func_call")
+ldg.__tvm_op__ = _ir.Op.get("tirx.cuda.ldg")
+__shfl_sync = _shfl_sync
+__shfl_sync.__tvm_op__ = _ir.Op.get("tirx.cuda.__shfl_sync")
+__shfl_up_sync = _shfl_up_sync
+__shfl_up_sync.__tvm_op__ = _ir.Op.get("tirx.cuda.__shfl_up_sync")
+__shfl_down_sync = _shfl_down_sync
+__shfl_down_sync.__tvm_op__ = _ir.Op.get("tirx.cuda.__shfl_down_sync")
+__shfl_xor_sync = _shfl_xor_sync
+__shfl_xor_sync.__tvm_op__ = _ir.Op.get("tirx.cuda.__shfl_xor_sync")
+__activemask = _activemask
+__activemask.__tvm_op__ = _ir.Op.get("tirx.cuda.__activemask")
+
+_ir.op._init_op_api("tirx.cuda", __name__)
class NVSHMEMNamespace:
@@ -300,6 +253,3 @@ class NVSHMEMPutMemSignalNBINamespace:
# __call__ corresponds to nvshmem_putmem_signal_nbi
__tir_call_op_name__ = "nvshmem_putmem_signal_nbi"
-
-
-__all__ = ["CUDANamespace", "NVSHMEMNamespace", "PTXLegacyNamespace",
"STIRNamespace"]
diff --git a/python/tvm/ir/op.py b/python/tvm/ir/op.py
index 6dc519d9b9..927b8edac7 100644
--- a/python/tvm/ir/op.py
+++ b/python/tvm/ir/op.py
@@ -17,7 +17,10 @@
# pylint: disable=invalid-name
"""Primitive operators in the TVM IR."""
+import keyword
+import sys
from collections.abc import Sequence
+from types import ModuleType, SimpleNamespace
import tvm_ffi
@@ -25,6 +28,92 @@ from . import _ffi_api
from .expr import Expr
+def _make_op_api(op, module_name):
+ """Build a callable whose operands and result are governed by its Op."""
+ from .expr import Call, reinfer_type # pylint:
disable=import-outside-toplevel
+
+ def call(*args, attrs=None, ty_args=None, span=None, ret_ty=None,
**kwargs):
+ # Bind named operands using the registered signature, without inventing
+ # defaults or interpreting arbitrary Python wrapper signatures.
+ operands = list(args)
+ for index, info in enumerate(op.args_info):
+ if index < len(args):
+ if info.name in kwargs:
+ raise TypeError(f"{op.name}: multiple values for
{info.name!r}")
+ elif info.name in kwargs:
+ operands.append(kwargs.pop(info.name))
+ else:
+ raise TypeError(f"{op.name}: missing operand {info.name!r}")
+ if kwargs:
+ raise TypeError(f"{op.name}: unexpected keyword operands
{tuple(kwargs)}")
+ if ret_ty is None and (
+ op.get_attr("TFixedReturnType") is not None or
op.get_attr("FInferType") is not None
+ ):
+ provisional = Call.unchecked(op, operands, attrs=attrs,
ty_args=ty_args, span=span)
+ ret_ty = reinfer_type(provisional)
+ return Call(op, operands, attrs=attrs, ty_args=ty_args, span=span,
ty=ret_ty)
+
+ call.__name__ = op.name.rsplit(".", 1)[-1]
+ call.__module__ = module_name
+ call.__doc__ = op.doc or f"Construct a call to {op.name}."
+ call.__tvm_op__ = op
+ return call
+
+
+def _init_op_api(namespace, target_module_name=None):
+ """Initialize registered Op callables in an already loaded Python module.
+
+ Like :func:`tvm_ffi.init_ffi_api`, the registry prefix comes first and the
+ target defaults to that module name. For example, a backend module uses
+ ``_init_op_api("tirx.cuda", __name__)``. Dotted suffixes require existing
+ module or SimpleNamespace containers; underscores are ordinary name parts.
+
+ Generated functions accept registered positional/named operands plus
+ ``attrs``, ``ty_args``, ``span`` and ``ret_ty``. Omitting the result
invokes
+ an available Op inference hook; without one, Call retains a missing type.
+ Explicit results and inference/validation errors are preserved.
+
+ Existing generated functions are reused. A deliberate wrapper may declare
+ ``__tvm_op__ = Op.get(name)`` to retain ownership of that name. This
declares
+ identity, not semantic equivalence: the wrapper must accept printed calls
+ or have an appropriate exceptional printer hook. Other collisions fail
+ before any functions are installed. Script namespaces separately publish
+ their callable names to the printer after initialization. Returns None.
+ """
+ if not namespace or any(
+ not part.isidentifier() or keyword.iskeyword(part) for part in
namespace.split(".")
+ ):
+ raise ValueError(f"Invalid Op namespace {namespace!r}")
+ target = sys.modules[target_module_name or namespace]
+ pending = []
+ destinations = set()
+ for name in sorted(Op.list_op_names()):
+ if not name.startswith(namespace + "."):
+ continue
+ parts = name[len(namespace) + 1 :].split(".")
+ if any(not part.isidentifier() or keyword.iskeyword(part) for part in
parts):
+ raise ValueError(f"Op {name!r} has no Python attribute spelling")
+ container = target
+ for part in parts[:-1]:
+ container = vars(container).get(part)
+ if not isinstance(container, ModuleType | SimpleNamespace):
+ raise ValueError(f"Op {name!r} requires an existing namespace
at {part!r}")
+ destination = (id(container), parts[-1])
+ if destination in destinations:
+ raise ValueError(f"Op {name!r} aliases another exposure
destination")
+ destinations.add(destination)
+ op = Op.get(name)
+ if parts[-1] in vars(container):
+ current = vars(container)[parts[-1]]
+ identity = getattr(current, "__tvm_op__", None)
+ if not callable(current) or not isinstance(identity, Op) or not
identity.same_as(op):
+ raise ValueError(f"Op {name!r} conflicts with an existing
Python attribute")
+ else:
+ pending.append((container, parts[-1], _make_op_api(op,
target.__name__)))
+ for container, name, call in pending:
+ setattr(container, name, call)
+
+
@tvm_ffi.register_object("ir.Op")
class Op(Expr):
"""Primitive operator in the IR."""
diff --git a/python/tvm/tirx/script/ir_builder/op.py
b/python/tvm/tirx/script/ir_builder/op.py
index 7b145e0590..3db9cec137 100644
--- a/python/tvm/tirx/script/ir_builder/op.py
+++ b/python/tvm/tirx/script/ir_builder/op.py
@@ -287,7 +287,9 @@ def _get_script_namespace(name: str) -> object:
raise AttributeError(f"No script namespace {name!r}")
-def register_script_namespace(name: str, namespace: object, override: bool =
False) -> object:
+def register_script_namespace(
+ name: str, namespace: object, override: bool = False, *,
canonical_op_names: bool = False
+) -> object:
"""Register a construction namespace and return it.
Parameters
@@ -299,6 +301,10 @@ def register_script_namespace(name: str, namespace:
object, override: bool = Fal
override : bool, optional
Replace differing operator printer names if True. Existing equal names
are reused; other duplicates raise ValueError.
+ canonical_op_names : bool, optional
+ Publish registered Op names whose canonical attributes expose matching
+ callables. Preserve explicit printer aliases. Otherwise discover names
+ from legacy wrappers. Repeat registration to publish newly exposed Ops.
"""
_SCRIPT_NAMESPACES[name] = namespace
globals()[name] = namespace
@@ -320,7 +326,25 @@ def register_script_namespace(name: str, namespace:
object, override: bool = Fal
if isinstance(module_all, list) and name not in module_all:
module_all.append(name)
- _register_script_namespace_printer_names(namespace, f"tirx.{name}",
override)
+ if canonical_op_names:
+ prefix = f"tirx.{name}."
+ for op_name in _ir.Op.list_op_names():
+ if not op_name.startswith(prefix):
+ continue
+ current = namespace
+ for part in op_name[len(prefix) :].split("."):
+ current = getattr(current, part, None)
+ op = _ir.Op.get(op_name)
+ identity = getattr(current, "__tvm_op__", None)
+ if (
+ callable(current)
+ and isinstance(identity, _ir.Op)
+ and identity.same_as(op)
+ and op.get_attr("TScriptPrinterName") is None
+ ):
+ op.set_attr("TScriptPrinterName", op_name)
+ else:
+ _register_script_namespace_printer_names(namespace, f"tirx.{name}",
override)
return namespace
diff --git a/src/backend/cuda/op/iket.cc b/src/backend/cuda/op/iket.cc
index 2e8c4fdcb4..fbd427a842 100644
--- a/src/backend/cuda/op/iket.cc
+++ b/src/backend/cuda/op/iket.cc
@@ -33,7 +33,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void())
.set_attr<TIRxOpCategory>("TIRxOpCategory", ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>("TDeviceIntrinsicNamespace",
ffi::String("cuda"))
- .set_attr<TScriptPrinterName>("TScriptPrinterName",
ffi::String("tirx.cuda.iket.mark"))
.set_attr<TCallEffectKind>("TCallEffectKind",
static_cast<int64_t>(CallEffectKind::kOpaque));
OpDef("tirx.cuda.iket_range_start")
@@ -41,7 +40,6 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(32))
.set_attr<TIRxOpCategory>("TIRxOpCategory", ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>("TDeviceIntrinsicNamespace",
ffi::String("cuda"))
- .set_attr<TScriptPrinterName>("TScriptPrinterName",
ffi::String("tirx.cuda.iket.range_start"))
.set_attr<TCallEffectKind>("TCallEffectKind",
static_cast<int64_t>(CallEffectKind::kOpaque));
OpDef("tirx.cuda.iket_range_end")
@@ -49,37 +47,34 @@ TVM_FFI_STATIC_INIT_BLOCK() {
.set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void())
.set_attr<TIRxOpCategory>("TIRxOpCategory", ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>("TDeviceIntrinsicNamespace",
ffi::String("cuda"))
- .set_attr<TScriptPrinterName>("TScriptPrinterName",
ffi::String("tirx.cuda.iket.range_end"))
.set_attr<TCallEffectKind>("TCallEffectKind",
static_cast<int64_t>(CallEffectKind::kOpaque));
OpDef("tirx.cuda.iket_range_push")
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void())
.signature(sig::arg("name", "The name."), sig::var_args("args"))
.set_attr<TIRxOpCategory>("TIRxOpCategory", ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>("TDeviceIntrinsicNamespace",
ffi::String("cuda"))
- .set_attr<TScriptPrinterName>("TScriptPrinterName",
ffi::String("tirx.cuda.iket.range_push"))
.set_attr<TCallEffectKind>("TCallEffectKind",
static_cast<int64_t>(CallEffectKind::kOpaque));
OpDef("tirx.cuda.iket_range_pop")
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void())
.set_attr<TIRxOpCategory>("TIRxOpCategory", ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>("TDeviceIntrinsicNamespace",
ffi::String("cuda"))
- .set_attr<TScriptPrinterName>("TScriptPrinterName",
ffi::String("tirx.cuda.iket.range_pop"))
.set_attr<TCallEffectKind>("TCallEffectKind",
static_cast<int64_t>(CallEffectKind::kOpaque));
OpDef("tirx.cuda.iket_sentinel_token")
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(32))
.signature(sig::arg("name", "The name."))
.set_attr<TIRxOpCategory>("TIRxOpCategory", ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>("TDeviceIntrinsicNamespace",
ffi::String("cuda"))
- .set_attr<TScriptPrinterName>("TScriptPrinterName",
-
ffi::String("tirx.cuda.iket.sentinel_token"))
.set_attr<TCallEffectKind>("TCallEffectKind",
static_cast<int64_t>(CallEffectKind::kOpaque));
OpDef("tirx.cuda.iket_official_event")
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(32))
.signature(sig::arg("event_id", "The event identifier."),
sig::arg("source_code", "The source code."),
sig::var_args("args"))
.set_attr<TIRxOpCategory>("TIRxOpCategory", ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>("TDeviceIntrinsicNamespace",
ffi::String("cuda"))
- .set_attr<TScriptPrinterName>("TScriptPrinterName",
-
ffi::String("tirx.cuda.iket.official_event"))
.set_attr<TCallEffectKind>("TCallEffectKind",
static_cast<int64_t>(CallEffectKind::kOpaque));
}
diff --git a/src/backend/cuda/op/target_builtin.cc
b/src/backend/cuda/op/target_builtin.cc
index 4ac2b7b8ee..7eaa19106e 100644
--- a/src/backend/cuda/op/target_builtin.cc
+++ b/src/backend/cuda/op/target_builtin.cc
@@ -29,16 +29,14 @@
#include <tvm/tirx/op.h>
#include <tvm/tirx/op_attr_types.h>
-#include <initializer_list>
#include <string>
-#include <utility>
namespace tvm {
namespace tirx {
namespace builtin {
namespace {
-void RegisterDeviceIntrinsicAliases();
+void RegisterDeviceIntrinsics();
Type InferTypeCudaLdg(const CallNode* call) {
TVM_FFI_CHECK_GE(call->args.size(), 2U, ValueError)
@@ -221,266 +219,281 @@ void RegisterCudaTargetBuiltins() {
.set_attr<TIRxOpCategory>("TIRxOpCategory", ffi::String("builtin"))
.set_attr<TCallEffectKind>("TCallEffectKind",
static_cast<int64_t>(CallEffectKind::kOpaque));
- RegisterDeviceIntrinsicAliases();
+ RegisterDeviceIntrinsics();
}
namespace {
-struct DeviceIntrinsicNames {
- std::string canonical;
- std::string printer;
-};
-
-TVM_FFI_NO_INLINE DeviceIntrinsicNames MakeDeviceIntrinsicNames(const char*
op_name,
- const char*
op_namespace) {
- std::string name(op_name);
- std::string namespace_name(op_namespace);
- std::string prefix = namespace_name + "_";
- std::string suffix = name;
- if (suffix.rfind(prefix, 0) == 0) {
- suffix = suffix.substr(prefix.size());
- }
-
- std::string canonical = "tirx." + namespace_name + "." + suffix;
- // Match the nested construction namespaces at the canonical registration
site.
- if (namespace_name == "cuda" &&
- (suffix.rfind("tcgen05_", 0) == 0 || suffix.rfind("wgmma_", 0) == 0 ||
- suffix.rfind("iket_", 0) == 0)) {
- suffix[suffix.find('_')] = '.';
- } else if (namespace_name == "nvshmem" &&
- ((suffix.size() >= 6 && suffix.compare(suffix.size() - 6, 6,
"_block") == 0) ||
- (suffix.size() >= 5 && suffix.compare(suffix.size() - 5, 5,
"_warp") == 0))) {
- suffix[suffix.rfind('_')] = '.';
- }
- return {std::move(canonical), "tirx." + namespace_name + "." + suffix};
-}
-
TVM_FFI_NO_INLINE void RegisterDeviceIntrinsicAttrs(OpDef& def, const char*
op_namespace,
- CallEffectKind effect_kind,
- const std::string&
printer_name) {
+ CallEffectKind
effect_kind) {
+ std::string printer_name = def.op()->name;
+ if (std::string(op_namespace) == "nvshmem" &&
+ ((printer_name.size() >= 6 &&
+ printer_name.compare(printer_name.size() - 6, 6, "_block") == 0) ||
+ (printer_name.size() >= 5 &&
+ printer_name.compare(printer_name.size() - 5, 5, "_warp") == 0))) {
+ printer_name[printer_name.rfind('_')] = '.';
+ }
def.set_attr<TIRxOpCategory>("TIRxOpCategory", ffi::String("device_intrin"))
.set_attr<TDeviceIntrinsicNamespace>("TDeviceIntrinsicNamespace",
ffi::String(op_namespace))
- .set_attr<TCallEffectKind>("TCallEffectKind",
static_cast<int64_t>(effect_kind))
- .set_attr<TScriptPrinterName>("TScriptPrinterName",
ffi::String(printer_name));
+ .set_attr<TCallEffectKind>("TCallEffectKind",
static_cast<int64_t>(effect_kind));
+ if (std::string(op_namespace) != "cuda") {
+ def.set_attr<TScriptPrinterName>("TScriptPrinterName",
ffi::String(printer_name));
+ }
}
template <typename... Specs>
-void RegisterDeviceIntrinsic(const char* op_name, const char* op_namespace,
- CallEffectKind effect_kind, const Specs&...
specs) {
- DeviceIntrinsicNames names = MakeDeviceIntrinsicNames(op_name, op_namespace);
- OpDef def(names.canonical);
+OpDef& RegisterDeviceIntrinsic(OpDef&& def, const char* op_namespace,
CallEffectKind effect_kind,
+ const Specs&... specs) {
def.signature(specs...);
- RegisterDeviceIntrinsicAttrs(def, op_namespace, effect_kind, names.printer);
+ RegisterDeviceIntrinsicAttrs(def, op_namespace, effect_kind);
+ return def;
}
-void RegisterDeviceIntrinsicAliases() {
- RegisterDeviceIntrinsic("cuda_any_sync", "cuda", CallEffectKind::kPure,
sig::arg<IntExpr>("mask"),
- sig::arg("pred"));
- RegisterDeviceIntrinsic("cuda_atomic_add", "cuda", CallEffectKind::kOpaque,
sig::arg("res_addr"),
- sig::arg("value"));
- RegisterDeviceIntrinsic("cuda_atomic_cas", "cuda", CallEffectKind::kOpaque,
sig::arg("ptr"),
- sig::arg("old_val"), sig::arg("new_val"));
- RegisterDeviceIntrinsic("cuda_wait_until", "cuda", CallEffectKind::kOpaque,
sig::arg("dst"),
- sig::arg("ptr"), sig::arg("condition"),
sig::arg("scope"),
- sig::arg("space"), sig::arg("ptx_type"),
sig::arg<IntExpr>("backoff_ns"));
- RegisterDeviceIntrinsic("cuda_ballot_sync", "cuda", CallEffectKind::kOpaque,
- sig::arg<IntExpr>("mask"), sig::arg("pred"));
- RegisterDeviceIntrinsic("cuda_bfloat1622float2", "cuda",
CallEffectKind::kOpaque,
- sig::arg("packed"));
- RegisterDeviceIntrinsic("cuda_bfloat162float", "cuda",
CallEffectKind::kOpaque, sig::arg("src"));
- RegisterDeviceIntrinsic("cuda_clock64", "cuda", CallEffectKind::kOpaque);
- RegisterDeviceIntrinsic("cuda_cluster_sync", "cuda",
CallEffectKind::kOpaque);
- RegisterDeviceIntrinsic("cuda_cta_reduce", "cuda", CallEffectKind::kOpaque,
sig::arg("value"),
- sig::arg("op"), sig::arg<IntExpr>("num_warps"),
sig::arg("scratch"));
- RegisterDeviceIntrinsic("cuda_cta_sync", "cuda", CallEffectKind::kOpaque);
- RegisterDeviceIntrinsic("cuda_cvta_generic_to_shared", "cuda",
CallEffectKind::kOpaque,
- sig::arg("ptr"));
- RegisterDeviceIntrinsic("cuda_elect_sync", "cuda", CallEffectKind::kOpaque);
- RegisterDeviceIntrinsic("cuda_fadd2_rn", "cuda", CallEffectKind::kOpaque,
sig::arg("a"),
- sig::arg("b"));
- RegisterDeviceIntrinsic("cuda_fdividef", "cuda", CallEffectKind::kPure,
sig::arg("x"),
- sig::arg("y"));
- RegisterDeviceIntrinsic("cuda_ffs_u32", "cuda", CallEffectKind::kOpaque,
- sig::arg<IntExpr>("value"));
- RegisterDeviceIntrinsic("cuda_float22bfloat162_rn", "cuda",
CallEffectKind::kOpaque,
- sig::arg("v0"), sig::arg("v1"));
- RegisterDeviceIntrinsic("cuda_float22bfloat162_rn_from_float2", "cuda",
CallEffectKind::kOpaque,
- sig::arg("packed"));
- RegisterDeviceIntrinsic("cuda_float22half2", "cuda",
CallEffectKind::kOpaque, sig::arg("dst"),
- sig::arg("src"));
- RegisterDeviceIntrinsic("cuda_float2_x", "cuda", CallEffectKind::kOpaque,
sig::arg("packed"));
- RegisterDeviceIntrinsic("cuda_float2_y", "cuda", CallEffectKind::kOpaque,
sig::arg("packed"));
- RegisterDeviceIntrinsic("cuda_float8tohalf8", "cuda",
CallEffectKind::kOpaque,
- sig::arg("src_addr"), sig::arg("dst_addr"));
- RegisterDeviceIntrinsic("cuda_float_as_uint", "cuda",
CallEffectKind::kOpaque, sig::arg("x"));
- RegisterDeviceIntrinsic("cuda_fmul2_rn", "cuda", CallEffectKind::kOpaque,
sig::arg("a"),
- sig::arg("b"));
- RegisterDeviceIntrinsic("cuda_fp8x4_e4m3_from_float4", "cuda",
CallEffectKind::kOpaque,
- sig::arg("x"), sig::arg("y"), sig::arg("z"),
sig::arg("w"));
- RegisterDeviceIntrinsic("cuda_func_call", "cuda", CallEffectKind::kOpaque,
sig::arg("func_name"),
- sig::var_args("args"));
- RegisterDeviceIntrinsic("cuda_get_tmem_addr", "cuda",
CallEffectKind::kOpaque, sig::arg("addr"),
- sig::arg<IntExpr>("row_offset"),
sig::arg<IntExpr>("col_offset"));
- RegisterDeviceIntrinsic("cuda_grid_sync", "cuda", CallEffectKind::kOpaque);
- RegisterDeviceIntrinsic("cuda_half2float", "cuda", CallEffectKind::kOpaque,
sig::arg("src"));
- RegisterDeviceIntrinsic("cuda_half8tofloat8", "cuda",
CallEffectKind::kOpaque,
- sig::arg("src_addr"), sig::arg("dst_addr"));
- RegisterDeviceIntrinsic("cuda_hmax2", "cuda", CallEffectKind::kOpaque,
sig::arg("a"),
- sig::arg("b"));
- RegisterDeviceIntrinsic("cuda_hmin2", "cuda", CallEffectKind::kOpaque,
sig::arg("a"),
- sig::arg("b"));
- RegisterDeviceIntrinsic("cuda_ldg", "cuda", CallEffectKind::kOpaque,
sig::var_args("args"));
- RegisterDeviceIntrinsic("cuda_make_float2", "cuda", CallEffectKind::kOpaque,
sig::arg("x"),
- sig::arg("y"));
- RegisterDeviceIntrinsic("cuda_mbarrier_wait", "cuda",
CallEffectKind::kOpaque, sig::arg("bar"),
- sig::arg<IntExpr>("phase"));
- RegisterDeviceIntrinsic("cuda_mbarrier_wait_acquire_cluster", "cuda",
CallEffectKind::kOpaque,
- sig::arg("bar"), sig::arg<IntExpr>("phase"));
- RegisterDeviceIntrinsic("cuda_mov_sreg", "cuda", CallEffectKind::kPure,
sig::arg<IntExpr>("bits"),
- sig::arg("reg_name"));
- RegisterDeviceIntrinsic("cuda_nano_sleep", "cuda", CallEffectKind::kOpaque,
- sig::arg<IntExpr>("time"));
- RegisterDeviceIntrinsic("cuda_printf", "cuda", CallEffectKind::kOpaque,
sig::arg("fmt"),
- sig::var_args("args"));
- RegisterDeviceIntrinsic("cuda_reduce_add_sync_u32", "cuda",
CallEffectKind::kOpaque,
- sig::arg<IntExpr>("mask"),
sig::arg<IntExpr>("value"));
- RegisterDeviceIntrinsic("cuda_reduce_min_sync_u32", "cuda",
CallEffectKind::kOpaque,
- sig::arg<IntExpr>("mask"),
sig::arg<IntExpr>("value"));
- RegisterDeviceIntrinsic("cuda_runtime_instr_desc", "cuda",
CallEffectKind::kOpaque,
- sig::arg("desc"), sig::arg<IntExpr>("sf_id"));
- RegisterDeviceIntrinsic("cuda_sm100_2sm_leader_smem_addr", "cuda",
CallEffectKind::kOpaque,
- sig::arg("ptr"));
- RegisterDeviceIntrinsic("cuda_smem_addr_from_uint64", "cuda",
CallEffectKind::kOpaque,
- sig::arg<IntExpr>("cluster_addr"));
- RegisterDeviceIntrinsic("cuda_syncthreads_and", "cuda",
CallEffectKind::kOpaque,
- sig::arg("cond"));
- RegisterDeviceIntrinsic("cuda_syncthreads_or", "cuda",
CallEffectKind::kOpaque, sig::arg("cond"));
- RegisterDeviceIntrinsic("cuda_tcgen05_encode_instr_descriptor", "cuda",
CallEffectKind::kOpaque,
- sig::arg("desc"), sig::arg("d_dtype"),
sig::arg("a_dtype"),
- sig::arg("b_dtype"), sig::arg<IntExpr>("M"),
sig::arg<IntExpr>("N"),
- sig::arg<IntExpr>("K"), sig::arg("trans_a"),
sig::arg("trans_b"),
- sig::arg<IntExpr>("n_cta_groups"),
sig::arg("neg_a"), sig::arg("neg_b"),
- sig::arg("sat_d"), sig::arg("is_sparse"));
- RegisterDeviceIntrinsic("cuda_tcgen05_encode_instr_descriptor_block_scaled",
"cuda",
+void RegisterDeviceIntrinsics() {
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.any_sync"), "cuda",
CallEffectKind::kPure,
+ sig::arg<IntExpr>("mask"), sig::arg("pred"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Int(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.atomic_add"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("res_addr"), sig::arg("value"))
+ .set_attr<FInferType>("FInferType",
FInferType::FromNative<&InferTypeReturnArgType<1>>());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.atomic_cas"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("ptr"), sig::arg("old_val"),
sig::arg("new_val"))
+ .set_attr<FInferType>("FInferType",
FInferType::FromNative<&InferTypeReturnArgType<1>>());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.wait_until"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("dst"), sig::arg("ptr"),
sig::arg("condition"),
+ sig::arg("scope"), sig::arg("space"),
sig::arg("ptx_type"),
+ sig::arg<IntExpr>("backoff_ns"));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.ballot_sync"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg<IntExpr>("mask"), sig::arg("pred"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.bfloat1622float2"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("packed"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(64));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.bfloat162float"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("src"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Float(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.clock64"), "cuda",
CallEffectKind::kOpaque)
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(64));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.cluster_sync"), "cuda",
CallEffectKind::kOpaque)
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.cta_reduce"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("value"), sig::arg("op"),
sig::arg<IntExpr>("num_warps"),
+ sig::arg("scratch"));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.cta_sync"), "cuda",
CallEffectKind::kOpaque)
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.cvta_generic_to_shared"), "cuda",
+ CallEffectKind::kOpaque, sig::arg("ptr"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.elect_sync"), "cuda",
CallEffectKind::kOpaque)
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.fadd2_rn"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("a"), sig::arg("b"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(64));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.fdividef"), "cuda",
CallEffectKind::kPure, sig::arg("x"),
+ sig::arg("y"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Float(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.ffs_u32"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg<IntExpr>("value"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Int(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.float22bfloat162_rn"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("v0"), sig::arg("v1"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.float22bfloat162_rn_from_float2"),
"cuda",
+ CallEffectKind::kOpaque, sig::arg("packed"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.float22half2"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("dst"), sig::arg("src"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.float2_x"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("packed"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Float(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.float2_y"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("packed"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Float(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.float8tohalf8"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("src_addr"), sig::arg("dst_addr"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.float_as_uint"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("x"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.fmul2_rn"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("a"), sig::arg("b"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(64));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.fp8x4_e4m3_from_float4"), "cuda",
+ CallEffectKind::kOpaque, sig::arg("x"),
sig::arg("y"), sig::arg("z"),
+ sig::arg("w"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.func_call"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("func_name"), sig::var_args("args"));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.get_tmem_addr"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("addr"), sig::arg<IntExpr>("row_offset"),
+ sig::arg<IntExpr>("col_offset"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.grid_sync"), "cuda",
CallEffectKind::kOpaque)
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.half2float"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("src"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Float(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.half8tofloat8"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("src_addr"), sig::arg("dst_addr"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.hmax2"), "cuda",
CallEffectKind::kOpaque, sig::arg("a"),
+ sig::arg("b"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.hmin2"), "cuda",
CallEffectKind::kOpaque, sig::arg("a"),
+ sig::arg("b"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.ldg"), "cuda",
CallEffectKind::kOpaque,
+ sig::var_args("args"))
+ .set_attr<FInferType>("FInferType",
FInferType::FromNative<&InferTypeCudaLdg>());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.make_float2"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("x"), sig::arg("y"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(64));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.mbarrier_wait"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("bar"), sig::arg<IntExpr>("phase"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.mbarrier_wait_acquire_cluster"),
"cuda",
+ CallEffectKind::kOpaque, sig::arg("bar"),
sig::arg<IntExpr>("phase"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.mov_sreg"), "cuda",
CallEffectKind::kPure,
+ sig::arg<IntExpr>("bits"), sig::arg("reg_name"));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.nano_sleep"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg<IntExpr>("time"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.printf"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("fmt"), sig::var_args("args"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.reduce_add_sync_u32"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg<IntExpr>("mask"),
sig::arg<IntExpr>("value"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.reduce_min_sync_u32"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg<IntExpr>("mask"),
sig::arg<IntExpr>("value"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.runtime_instr_desc"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("desc"), sig::arg<IntExpr>("sf_id"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.smem_addr_from_uint64"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg<IntExpr>("cluster_addr"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::UInt(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.syncthreads_and"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("cond"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Int(64));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.syncthreads_or"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("cond"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Int(64));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.tcgen05_encode_instr_descriptor"),
"cuda",
+ CallEffectKind::kOpaque, sig::arg("desc"),
sig::arg("d_dtype"),
+ sig::arg("a_dtype"), sig::arg("b_dtype"),
sig::arg<IntExpr>("M"),
+ sig::arg<IntExpr>("N"), sig::arg<IntExpr>("K"),
sig::arg("trans_a"),
+ sig::arg("trans_b"),
sig::arg<IntExpr>("n_cta_groups"), sig::arg("neg_a"),
+ sig::arg("neg_b"), sig::arg("sat_d"),
sig::arg("is_sparse"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+
RegisterDeviceIntrinsic(OpDef("tirx.cuda.tcgen05_encode_instr_descriptor_block_scaled"),
"cuda",
CallEffectKind::kOpaque, sig::arg("desc"),
sig::arg("d_dtype"),
sig::arg("a_dtype"), sig::arg("b_dtype"),
sig::arg("sfa_dtype"),
sig::arg("sfb_dtype"), sig::arg("sfa_tmem_addr"),
sig::arg("sfb_tmem_addr"), sig::arg<IntExpr>("M"),
sig::arg<IntExpr>("N"),
sig::arg<IntExpr>("K"), sig::arg("trans_a"),
sig::arg("trans_b"),
sig::arg<IntExpr>("n_cta_groups"),
sig::arg("neg_a"), sig::arg("neg_b"),
- sig::arg("is_sparse"));
- RegisterDeviceIntrinsic("cuda_tcgen05_encode_matrix_descriptor", "cuda",
CallEffectKind::kOpaque,
- sig::arg("desc"), sig::arg("addr"),
sig::arg<IntExpr>("ldo"),
- sig::arg<IntExpr>("sdo"),
sig::arg<IntExpr>("swizzle"));
- RegisterDeviceIntrinsic("cuda_thread_fence", "cuda",
CallEffectKind::kOpaque);
- RegisterDeviceIntrinsic("cuda_thread_rank", "cuda", CallEffectKind::kPure);
- RegisterDeviceIntrinsic("cuda_trap_when_assert_failed", "cuda",
CallEffectKind::kOpaque,
- sig::arg("cond"));
- RegisterDeviceIntrinsic("cuda_uint_as_float", "cuda",
CallEffectKind::kOpaque,
- sig::arg<IntExpr>("bits"));
- RegisterDeviceIntrinsic("cuda_warp_reduce", "cuda", CallEffectKind::kOpaque,
sig::arg("value"),
- sig::arg("op"), sig::arg<IntExpr>("width"));
- RegisterDeviceIntrinsic("cuda_warp_sync", "cuda", CallEffectKind::kOpaque);
- RegisterDeviceIntrinsic("cuda_warpgroup_sync", "cuda",
CallEffectKind::kOpaque,
- sig::arg<IntExpr>("bar_no"));
- RegisterDeviceIntrinsic("cuda_wgmma_encode_matrix_descriptor", "cuda",
CallEffectKind::kOpaque,
- sig::arg("desc"), sig::arg("addr"),
sig::arg<IntExpr>("ldo"),
- sig::arg<IntExpr>("sdo"),
sig::arg<IntExpr>("swizzle"));
- RegisterDeviceIntrinsic("cuda_wgmma_noop_barrier", "cuda",
CallEffectKind::kOpaque,
- sig::arg("reg"));
- RegisterDeviceIntrinsic("nvshmem_barrier_all", "nvshmem",
CallEffectKind::kOpaque);
- RegisterDeviceIntrinsic("nvshmem_fence", "nvshmem", CallEffectKind::kOpaque);
- RegisterDeviceIntrinsic("nvshmem_getmem_nbi", "nvshmem",
CallEffectKind::kOpaque, sig::arg("dst"),
- sig::arg("src"), sig::arg<IntExpr>("nelems"),
sig::arg<IntExpr>("pe"));
- RegisterDeviceIntrinsic("nvshmem_getmem_nbi_block", "nvshmem",
CallEffectKind::kOpaque,
+ sig::arg("is_sparse"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.tcgen05_encode_matrix_descriptor"),
"cuda",
+ CallEffectKind::kOpaque, sig::arg("desc"),
sig::arg("addr"),
+ sig::arg<IntExpr>("ldo"), sig::arg<IntExpr>("sdo"),
+ sig::arg<IntExpr>("swizzle"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.thread_fence"), "cuda",
CallEffectKind::kOpaque)
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.thread_rank"), "cuda",
CallEffectKind::kPure)
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Int(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.trap_when_assert_failed"), "cuda",
+ CallEffectKind::kOpaque, sig::arg("cond"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.uint_as_float"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg<IntExpr>("bits"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Float(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.warp_reduce"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("value"), sig::arg("op"),
sig::arg<IntExpr>("width"));
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.warp_sync"), "cuda",
CallEffectKind::kOpaque)
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.warpgroup_sync"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg<IntExpr>("bar_no"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.wgmma_encode_matrix_descriptor"),
"cuda",
+ CallEffectKind::kOpaque, sig::arg("desc"),
sig::arg("addr"),
+ sig::arg<IntExpr>("ldo"), sig::arg<IntExpr>("sdo"),
+ sig::arg<IntExpr>("swizzle"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.cuda.wgmma_noop_barrier"), "cuda",
CallEffectKind::kOpaque,
+ sig::arg("reg"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.nvshmem.barrier_all"), "nvshmem",
CallEffectKind::kOpaque)
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.nvshmem.fence"), "nvshmem",
CallEffectKind::kOpaque)
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.nvshmem.getmem_nbi"), "nvshmem",
CallEffectKind::kOpaque,
sig::arg("dst"), sig::arg("src"),
sig::arg<IntExpr>("nelems"),
- sig::arg<IntExpr>("pe"));
- RegisterDeviceIntrinsic("nvshmem_getmem_nbi_warp", "nvshmem",
CallEffectKind::kOpaque,
+ sig::arg<IntExpr>("pe"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.nvshmem.getmem_nbi_block"), "nvshmem",
+ CallEffectKind::kOpaque, sig::arg("dst"),
sig::arg("src"),
+ sig::arg<IntExpr>("nelems"),
sig::arg<IntExpr>("pe"));
+ RegisterDeviceIntrinsic(OpDef("tirx.nvshmem.getmem_nbi_warp"), "nvshmem",
CallEffectKind::kOpaque,
sig::arg("dst"), sig::arg("src"),
sig::arg<IntExpr>("nelems"),
- sig::arg<IntExpr>("pe"));
- RegisterDeviceIntrinsic("nvshmem_my_pe", "nvshmem", CallEffectKind::kOpaque);
- RegisterDeviceIntrinsic("nvshmem_n_pes", "nvshmem", CallEffectKind::kOpaque);
- RegisterDeviceIntrinsic("nvshmem_putmem_nbi", "nvshmem",
CallEffectKind::kOpaque, sig::arg("dst"),
- sig::arg("src"), sig::arg<IntExpr>("nelems"),
sig::arg<IntExpr>("pe"));
- RegisterDeviceIntrinsic("nvshmem_putmem_nbi_block", "nvshmem",
CallEffectKind::kOpaque,
+ sig::arg<IntExpr>("pe"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.nvshmem.my_pe"), "nvshmem",
CallEffectKind::kOpaque)
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Int(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.nvshmem.n_pes"), "nvshmem",
CallEffectKind::kOpaque)
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Int(32));
+ RegisterDeviceIntrinsic(OpDef("tirx.nvshmem.putmem_nbi"), "nvshmem",
CallEffectKind::kOpaque,
sig::arg("dst"), sig::arg("src"),
sig::arg<IntExpr>("nelems"),
- sig::arg<IntExpr>("pe"));
- RegisterDeviceIntrinsic("nvshmem_putmem_nbi_warp", "nvshmem",
CallEffectKind::kOpaque,
- sig::arg("dst"), sig::arg("src"),
sig::arg<IntExpr>("nelems"),
- sig::arg<IntExpr>("pe"));
- RegisterDeviceIntrinsic("nvshmem_putmem_signal_nbi", "nvshmem",
CallEffectKind::kOpaque,
- sig::arg("dst"), sig::arg("src"),
sig::arg<IntExpr>("nelems"),
- sig::arg("sig_addr"), sig::arg<IntExpr>("signal"),
sig::arg("sig_op"),
- sig::arg<IntExpr>("pe"));
- RegisterDeviceIntrinsic("nvshmem_putmem_signal_nbi_block", "nvshmem",
CallEffectKind::kOpaque,
+ sig::arg<IntExpr>("pe"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.nvshmem.putmem_nbi_block"), "nvshmem",
+ CallEffectKind::kOpaque, sig::arg("dst"),
sig::arg("src"),
+ sig::arg<IntExpr>("nelems"), sig::arg<IntExpr>("pe"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.nvshmem.putmem_nbi_warp"), "nvshmem",
CallEffectKind::kOpaque,
sig::arg("dst"), sig::arg("src"),
sig::arg<IntExpr>("nelems"),
+ sig::arg<IntExpr>("pe"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.nvshmem.putmem_signal_nbi"), "nvshmem",
+ CallEffectKind::kOpaque, sig::arg("dst"),
sig::arg("src"),
+ sig::arg<IntExpr>("nelems"), sig::arg("sig_addr"),
+ sig::arg<IntExpr>("signal"), sig::arg("sig_op"),
sig::arg<IntExpr>("pe"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.nvshmem.putmem_signal_nbi_block"),
"nvshmem",
+ CallEffectKind::kOpaque, sig::arg("dst"),
sig::arg("src"),
+ sig::arg<IntExpr>("nelems"), sig::arg("sig_addr"),
+ sig::arg<IntExpr>("signal"), sig::arg("sig_op"),
sig::arg<IntExpr>("pe"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.nvshmem.putmem_signal_nbi_warp"),
"nvshmem",
+ CallEffectKind::kOpaque, sig::arg("dst"),
sig::arg("src"),
+ sig::arg<IntExpr>("nelems"), sig::arg("sig_addr"),
+ sig::arg<IntExpr>("signal"), sig::arg("sig_op"),
sig::arg<IntExpr>("pe"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.nvshmem.quiet"), "nvshmem",
CallEffectKind::kOpaque)
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.nvshmem.signal_op"), "nvshmem",
CallEffectKind::kOpaque,
sig::arg("sig_addr"), sig::arg<IntExpr>("signal"),
sig::arg("sig_op"),
- sig::arg<IntExpr>("pe"));
- RegisterDeviceIntrinsic("nvshmem_putmem_signal_nbi_warp", "nvshmem",
CallEffectKind::kOpaque,
- sig::arg("dst"), sig::arg("src"),
sig::arg<IntExpr>("nelems"),
- sig::arg("sig_addr"), sig::arg<IntExpr>("signal"),
sig::arg("sig_op"),
- sig::arg<IntExpr>("pe"));
- RegisterDeviceIntrinsic("nvshmem_quiet", "nvshmem", CallEffectKind::kOpaque);
- RegisterDeviceIntrinsic("nvshmem_signal_op", "nvshmem",
CallEffectKind::kOpaque,
- sig::arg("sig_addr"), sig::arg<IntExpr>("signal"),
sig::arg("sig_op"),
- sig::arg<IntExpr>("pe"));
- RegisterDeviceIntrinsic("nvshmem_wait_until", "nvshmem",
CallEffectKind::kOpaque,
+ sig::arg<IntExpr>("pe"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.nvshmem.wait_until"), "nvshmem",
CallEffectKind::kOpaque,
sig::arg("ivar"), sig::arg("cmp"),
sig::arg<IntExpr>("cmp_value"),
- sig::arg("type"));
- RegisterDeviceIntrinsic("ptx_legacy_ldmatrix", "ptx_legacy",
CallEffectKind::kOpaque,
+ sig::arg("type"))
+ .set_attr<TFixedReturnType>("TFixedReturnType", PrimType::Void());
+ RegisterDeviceIntrinsic(OpDef("tirx.ptx_legacy.ldmatrix"), "ptx_legacy",
CallEffectKind::kOpaque,
sig::arg("trans"), sig::arg<IntExpr>("num"),
sig::arg("dtype"),
sig::arg("local_ptr"),
sig::arg<IntExpr>("local_offset"),
sig::arg("smem_ptr"),
sig::arg<IntExpr>("smem_offset"));
RegisterDeviceIntrinsic(
- "ptx_legacy_mma", "ptx_legacy", CallEffectKind::kOpaque,
sig::arg("shape"),
+ OpDef("tirx.ptx_legacy.mma"), "ptx_legacy", CallEffectKind::kOpaque,
sig::arg("shape"),
sig::arg("a_layout"), sig::arg("b_layout"), sig::arg("a_dtype"),
sig::arg("b_dtype"),
sig::arg("c_dtype"), sig::arg("a_ptr"), sig::arg<IntExpr>("a_offset"),
sig::arg("b_ptr"),
sig::arg<IntExpr>("b_offset"), sig::arg("acc_ptr"),
sig::arg<IntExpr>("c_offset"),
sig::arg("saturate"), sig::var_args("args"));
-
- for (const char* name : {
- "tirx.cuda.tcgen05_encode_matrix_descriptor",
- "tirx.cuda.wgmma_encode_matrix_descriptor",
- "tirx.cuda.tcgen05_encode_instr_descriptor",
- "tirx.cuda.tcgen05_encode_instr_descriptor_block_scaled",
- "tirx.cuda.wgmma_noop_barrier",
- "tirx.cuda.cluster_sync",
- "tirx.cuda.cta_sync",
- "tirx.cuda.grid_sync",
- "tirx.cuda.warp_sync",
- "tirx.cuda.thread_fence",
- "tirx.cuda.mbarrier_wait",
- "tirx.cuda.printf",
- "tirx.cuda.nano_sleep",
- "tirx.nvshmem.fence",
- "tirx.nvshmem.quiet",
- "tirx.nvshmem.barrier_all",
- "tirx.nvshmem.getmem_nbi",
- "tirx.nvshmem.getmem_nbi_warp",
- "tirx.nvshmem.putmem_nbi",
- "tirx.nvshmem.putmem_nbi_warp",
- "tirx.nvshmem.putmem_nbi_block",
- "tirx.nvshmem.signal_op",
- "tirx.nvshmem.wait_until",
- "tirx.nvshmem.putmem_signal_nbi",
- "tirx.nvshmem.putmem_signal_nbi_warp",
- "tirx.nvshmem.putmem_signal_nbi_block",
- }) {
- OpDef(name).set_attr<TFixedReturnType>("TFixedReturnType",
PrimType::Void());
- }
- for (const char* name : {"tirx.cuda.syncthreads_and",
"tirx.cuda.syncthreads_or"}) {
- OpDef(name).set_attr<TFixedReturnType>("TFixedReturnType",
PrimType::Int(64));
- }
- for (const char* name : {"tirx.nvshmem.my_pe", "tirx.nvshmem.n_pes"}) {
- OpDef(name).set_attr<TFixedReturnType>("TFixedReturnType",
PrimType::Int(32));
- }
- OpDef("tirx.cuda.elect_sync").set_attr<TFixedReturnType>("TFixedReturnType",
PrimType::UInt(32));
- OpDef("tirx.cuda.ldg")
- .set_attr<FInferType>("FInferType",
FInferType::FromNative<&InferTypeCudaLdg>());
- OpDef("tirx.cuda.atomic_add")
- .set_attr<FInferType>("FInferType",
FInferType::FromNative<&InferTypeReturnArgType<1>>());
- OpDef("tirx.cuda.atomic_cas")
- .set_attr<FInferType>("FInferType",
FInferType::FromNative<&InferTypeReturnArgType<1>>());
}
} // namespace
diff --git a/src/tirx/script/printer/expr.cc b/src/tirx/script/printer/expr.cc
index 9baf881187..405729ea02 100644
--- a/src/tirx/script/printer/expr.cc
+++ b/src/tirx/script/printer/expr.cc
@@ -510,13 +510,55 @@ ffi::Optional<ExprDoc>
TIRCallDocTranslate(DocTranslatorObj* d, const CallNode*
// their stored Call argument list. Keep the lossless I.Call form until a
// dedicated translation covers each signature.
bool incompatible_signature = (op.value()->name == "tirx.cuda.ldg" &&
call->args.size() != 2) ||
- op.value()->name == "tirx.cuda.wait_until";
- // IKET lowering accepts a variadic IR signature, but its named
constructors
- // expose just the event/token and an optional payload.
- if (op.value()->name == "tirx.cuda.iket_mark" ||
- op.value()->name == "tirx.cuda.iket_range_start" ||
- op.value()->name == "tirx.cuda.iket_range_end") {
- incompatible_signature = call->args.empty() || call->args.size() > 2;
+ op.value()->name == "tirx.cuda.wait_until" ||
+ op.value()->name == "tirx.cuda.mov_sreg";
+ // Meaningful wrappers choose their result from operands, independently of
+ // customizable inference hooks. Only use them when that choice is
lossless.
+ const std::string op_name = op.value()->name;
+ int result_operand = -1;
+ if (op_name == "tirx.cuda.atomic_add" || op_name == "tirx.cuda.atomic_cas"
||
+ op_name == "tirx.cuda.__shfl_sync" || op_name ==
"tirx.cuda.__shfl_up_sync" ||
+ op_name == "tirx.cuda.__shfl_down_sync" || op_name ==
"tirx.cuda.__shfl_xor_sync") {
+ result_operand = 1;
+ } else if (op_name == "tirx.cuda.warp_reduce" || op_name ==
"tirx.cuda.cta_reduce") {
+ result_operand = 0;
+ }
+ if (result_operand >= 0 &&
+ (call->args.size() <= static_cast<size_t>(result_operand) ||
+ !ffi::StructuralEqual()(call->ty, call->args[result_operand]->ty))) {
+ incompatible_signature = true;
+ }
+ if (op_name == "tirx.cuda.__activemask" &&
+ !ffi::StructuralEqual()(call->ty, PrimType::UInt(32))) {
+ incompatible_signature = true;
+ }
+ if (op_name == "tirx.cuda.ldg" && call->args.size() == 2) {
+ auto dtype = call->args[1].as<StringImmNode>();
+ auto result = call->ty.as<PrimType>();
+ if (!dtype || !result || ffi::DLDataTypeToString(result.value()->dtype)
!= dtype->value) {
+ incompatible_signature = true;
+ }
+ }
+ // Published CUDA callables use canonical names. Late registrations without
+ // a published callable retain lossless reconstruction.
+ bool canonical_cuda = op_name.find("tirx.cuda.") == 0;
+ if (canonical_cuda) {
+ // Generated APIs validate construction; preserve provisional or invalid
+ // Calls through the explicit unchecked reconstruction surface instead.
+ try {
+ op.value().Validate(call);
+ } catch (const ffi::Error&) {
+ return RawCall(d, call);
+ }
+ if (op_name.find("tirx.cuda.__shfl") == 0 && call->args.size() > 1 &&
+ call->args[1].as<VarNode>() &&
call->args[1]->ty.as<tirx::TensorTypeNode>()) {
+ return RawCall(d, call);
+ }
+ if ((result_operand >= 0 || op_name == "tirx.cuda.ldg") &&
+ std::any_of(call->args.begin(), call->args.end(),
+ [](const Expr& arg) { return arg.as<TensorRegionNode>()
!= nullptr; })) {
+ return RawCall(d, call);
+ }
}
if (names.count(op.value()) && !incompatible_signature) {
std::string name = names[op.value()];
@@ -532,6 +574,10 @@ ffi::Optional<ExprDoc>
TIRCallDocTranslate(DocTranslatorObj* d, const CallNode*
named_args.push_back(LiteralDoc::Str(string->value, std::nullopt));
} else {
ExprDoc argument = args[i];
+ // Canonical CUDA APIs preserve structured IR operands.
+ if (op.value()->name.find("tirx.cuda.") == 0) {
+ argument = MaterializeCallArgument(d, call->args[i], argument);
+ }
if (const auto* address = call->args[i].as<CallNode>();
is_ptx && address && IsPTXAddressCall(address)) {
// Use the address constructor only when it preserves its
operands.
@@ -541,7 +587,9 @@ ffi::Optional<ExprDoc>
TIRCallDocTranslate(DocTranslatorObj* d, const CallNode*
}
bool reads_operand_type =
is_ptx ||
- (i == 0 && (op.value()->name == "tirx.selector" ||
+ (i == 0 && (op.value()->name == "tirx.cuda.warp_reduce" ||
+ op.value()->name == "tirx.cuda.cta_reduce" ||
+ op.value()->name == "tirx.selector" ||
op.value()->name == "tirx.webgpu.subgroup_shuffle"
||
op.value()->name ==
"tirx.webgpu.subgroup_shuffle_up" ||
op.value()->name ==
"tirx.webgpu.subgroup_shuffle_down" ||
diff --git a/tests/python/tirx/iket/test_iket_profiler.py
b/tests/python/tirx/iket/test_iket_profiler.py
index ce7b8c9b44..87067d9824 100644
--- a/tests/python/tirx/iket/test_iket_profiler.py
+++ b/tests/python/tirx/iket/test_iket_profiler.py
@@ -371,7 +371,7 @@ def test_public_interface_is_official_only():
assert callable(cuda_transforms.LowerIket)
script = serial_a.script()
- assert 'T.cuda.iket.mark("a")' in script
+ assert 'T.cuda.iket_mark("a")' in script
assert "T.tirx.iket" not in script
assert (
tvm.script.from_source(
@@ -381,9 +381,9 @@ def test_public_interface_is_official_only():
)
payload_script = payload_types.script()
- assert 'T.cuda.iket.mark("i8", T.int8(-8))' in payload_script
- assert 'T.cuda.iket.range_start("token_payload", -7)' in payload_script
- assert "T.cuda.iket.range_end(token, 9)" in payload_script
+ assert 'T.cuda.iket_mark("i8", T.int8(-8))' in payload_script
+ assert 'T.cuda.iket_range_start("token_payload", -7)' in payload_script
+ assert "T.cuda.iket_range_end(token, 9)" in payload_script
assert (
tvm.script.from_source(
payload_script, extra_vars={"I": tvm.script.ir, "T":
tvm.script.tirx}
diff --git a/tests/python/tirx/script/test_tirx_script_printer.py
b/tests/python/tirx/script/test_tirx_script_printer.py
index 0f86ba147b..db7b20d618 100644
--- a/tests/python/tirx/script/test_tirx_script_printer.py
+++ b/tests/python/tirx/script/test_tirx_script_printer.py
@@ -780,7 +780,7 @@ def test_printer_ptx_more():
_assert_namespace_print(
cuda_op.cuda_tcgen05_encode_matrix_descriptor(d, a, 1, 2, 0),
"d: T.handle = T.handle()\na: T.handle = T.handle()\n"
- "T.cuda.tcgen05.encode_matrix_descriptor(d, a, 1, 2, 0)",
+ "T.cuda.tcgen05_encode_matrix_descriptor(d, a, 1, 2, 0)",
)
_assert_namespace_print(
cuda_op.cuda_tcgen05_encode_instr_descriptor(
@@ -1057,6 +1057,6 @@ def test_printer_ptx_mma_and_wgmma():
_assert_namespace_print(
cuda_op.cuda_wgmma_encode_matrix_descriptor(d, a, 1, 1, 0),
"d: T.handle = T.handle()\na: T.handle = T.handle()\n"
- "T.cuda.wgmma.encode_matrix_descriptor(d, a, 1, 1, 0)",
+ "T.cuda.wgmma_encode_matrix_descriptor(d, a, 1, 1, 0)",
)
- _assert_namespace_print(cuda_op.cuda_wgmma_noop_barrier(0),
"T.cuda.wgmma.noop_barrier(0)")
+ _assert_namespace_print(cuda_op.cuda_wgmma_noop_barrier(0),
"T.cuda.wgmma_noop_barrier(0)")
diff --git a/tests/python/tirx/test_op_namespace_cleanup.py
b/tests/python/tirx/test_op_namespace_cleanup.py
index ba6d8d6f60..0590f0b191 100644
--- a/tests/python/tirx/test_op_namespace_cleanup.py
+++ b/tests/python/tirx/test_op_namespace_cleanup.py
@@ -147,9 +147,7 @@ def test_tile_shorthand_and_scoped_aliases_use_tile_ops():
def test_device_intrinsic_namespaces_are_canonical_and_classified():
- from tvm.backend.cuda.script import (
- CUDANamespace as BackendCUDANamespace,
- )
+ cuda_script = importlib.import_module("tvm.backend.cuda.script")
from tvm.backend.cuda.script import (
NVSHMEMNamespace as BackendNVSHMEMNamespace,
)
@@ -160,7 +158,7 @@ def
test_device_intrinsic_namespaces_are_canonical_and_classified():
from tvm.backend.trn.script import NKINamespace as BackendNKINamespace
from tvm.tirx.script.ir_builder import op as builder_op
- assert isinstance(builder_op.cuda, BackendCUDANamespace)
+ assert builder_op.cuda is cuda_script
assert isinstance(builder_op.s_tir, BackendSTIRNamespace)
assert isinstance(builder_op.nvshmem, BackendNVSHMEMNamespace)
assert isinstance(builder_op.metal, BackendMetalNamespace)