Files
apache--tvm/python/tvm/backend/cuda/script.py
T
wehub-resource-sync 26446540fa
Lint / lint (push) Waiting to run
CI / MacOS (push) Waiting to run
CI / Windows (push) Waiting to run
chore: import upstream snapshot with attribution
2026-07-13 13:36:25 +08:00

574 lines
23 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.
"""CUDA TVMScript namespaces."""
from __future__ import annotations
from collections.abc import Callable
from typing import Any
from tvm.backend.cuda import op as _cuda_op
from tvm.tirx import Buffer
from tvm.tirx import op as _tir_op
from tvm.tirx.script.builder.ir import _dtype_forward, _op_wrapper
# pylint: disable=protected-access
def _ptx_ldg32(reg, guard, addr, local_addr):
if isinstance(addr, Buffer):
addr = addr[0]
return _tir_op.call_intrin(reg.ty, "tirx.ptx.ldg32", reg, guard, addr, local_addr)
_ptx_ldg32.__tir_op_name__ = "ptx.ldg32"
class PTXNamespace:
"""The PTX instruction submodule."""
def __init__(self):
self.ldg32 = _ptx_ldg32
self.ldmatrix = _dtype_forward(_cuda_op.ptx_ldmatrix)
# Apache-compatible variant. Same lowered intrinsic as
# ``ldmatrix`` but accepts the historical ``(trans, num, dtype,
# local_ptr, local_offset, smem_ptr, smem_offset)`` form. Coexists
# with the fork-native version so upstream-derived tests keep
# working without rewriting their tirx code.
self.ldmatrix_legacy = _dtype_forward(_cuda_op.ptx_ldmatrix_legacy)
self.stmatrix = _op_wrapper(_cuda_op.ptx_stmatrix)
self.setmaxnreg: Callable[..., Any] = _op_wrapper(_cuda_op.ptx_setmaxnreg)
self.elect_sync: Callable[..., Any] = _op_wrapper(_cuda_op.ptx_elect_sync)
self.clc_try_cancel = _op_wrapper(_cuda_op.ptx_clc_try_cancel)
self.clc_query_cancel = _op_wrapper(_cuda_op.ptx_clc_query_cancel)
self.fetch_register: Callable[..., Any] = _op_wrapper(_cuda_op.ptx_fetch_register)
self.ld = _op_wrapper(_cuda_op.ptx_ld)
self.ld_acquire = _op_wrapper(_cuda_op.ptx_ld_acquire)
self.ld_relaxed = _op_wrapper(_cuda_op.ptx_ld_relaxed)
self.ld_volatile = _op_wrapper(_cuda_op.ptx_ld_volatile)
self.ld_mmio = _op_wrapper(_cuda_op.ptx_ld_mmio)
self.ld_global_acquire = _op_wrapper(_cuda_op.ptx_ld_global_acquire)
self.red_scalar = _op_wrapper(_cuda_op.ptx_red_scalar)
self.atom_scalar = _op_wrapper(_cuda_op.ptx_atom_scalar)
self.prefetch_tensormap = _op_wrapper(_cuda_op.ptx_prefetch_tensormap)
self.mbarrier_test_wait_parity = _op_wrapper(_cuda_op.ptx_mbarrier_test_wait_parity)
self.cp_async_bulk_g2s_cta = _op_wrapper(_cuda_op.ptx_cp_async_bulk_g2s_cta)
self.cp_async_bulk_g2s_cluster = _op_wrapper(_cuda_op.ptx_cp_async_bulk_g2s_cluster)
self.cp_async_bulk_s2s_cluster = _op_wrapper(_cuda_op.ptx_cp_async_bulk_s2s_cluster)
self.cp_async_bulk_s2g = _op_wrapper(_cuda_op.ptx_cp_async_bulk_s2g)
self.st = _op_wrapper(_cuda_op.ptx_st)
self.st_relaxed = _op_wrapper(_cuda_op.ptx_st_relaxed)
self.st_release = _op_wrapper(_cuda_op.ptx_st_release)
self.st_volatile = _op_wrapper(_cuda_op.ptx_st_volatile)
self.st_mmio = _op_wrapper(_cuda_op.ptx_st_mmio)
self.st_bulk = _op_wrapper(_cuda_op.ptx_st_bulk)
self.fns_b32 = _op_wrapper(_cuda_op.ptx_fns_b32)
self.add_rn_f32_bf16 = _op_wrapper(_cuda_op.ptx_add_rn_f32_bf16)
self.mapa = _op_wrapper(_cuda_op.ptx_mapa)
self.map_shared_rank = _op_wrapper(_cuda_op.ptx_map_shared_rank)
self.any_sync = _op_wrapper(_cuda_op.ptx_any_sync)
# Math operations
self.exp2 = _op_wrapper(_cuda_op.ptx_exp2)
self.rcp = _op_wrapper(_cuda_op.ptx_rcp)
self.reduce3_min_f32 = _op_wrapper(_cuda_op.ptx_reduce3_min_f32)
self.reduce3_max_f32 = _op_wrapper(_cuda_op.ptx_reduce3_max_f32)
# add/sub/mul/fma DPS form: (d_addr, a, b[, c], *, rounding, ftz[, sat])
self.add_f32 = _op_wrapper(_cuda_op.ptx_add_f32)
self.add_f32x2 = _op_wrapper(_cuda_op.ptx_add_f32x2)
self.add_f64 = _op_wrapper(_cuda_op.ptx_add_f64)
self.sub_f32 = _op_wrapper(_cuda_op.ptx_sub_f32)
self.sub_f32x2 = _op_wrapper(_cuda_op.ptx_sub_f32x2)
self.sub_f64 = _op_wrapper(_cuda_op.ptx_sub_f64)
self.mul_f32 = _op_wrapper(_cuda_op.ptx_mul_f32)
self.mul_f32x2 = _op_wrapper(_cuda_op.ptx_mul_f32x2)
self.mul_f64 = _op_wrapper(_cuda_op.ptx_mul_f64)
self.fma_f32 = _op_wrapper(_cuda_op.ptx_fma_f32)
self.fma_f32x2 = _op_wrapper(_cuda_op.ptx_fma_f32x2)
self.fma_f64 = _op_wrapper(_cuda_op.ptx_fma_f64)
self.max_f32 = _op_wrapper(_cuda_op.ptx_max_f32)
self.mma = MmaNamespace()
self.cp_async = CpAsyncNamespace()
self.wgmma = WgmmaNamespace()
self.mbarrier = MbarrierNamespace()
self.tcgen05 = Tcgen05Namespace()
self.bar = BarNamespace()
self.barrier = BarrierNamespace()
self.fence = FenceNamespace()
self.griddepcontrol = GriddepcontrolNamespace()
class MmaNamespace:
"""The MMA instruction submodule."""
def __init__(self):
self.sp = _dtype_forward(_cuda_op.ptx_mma_sp)
# Apache-compatible variant of ptx_mma. Coexists with the
# fork-native ``__call__`` form (``T.ptx.mma(...)``).
self.legacy = _dtype_forward(_cuda_op.ptx_mma_legacy)
# __call__ corresponds to ptx_mma
self.__tir_call_op_name__ = "ptx_mma"
def __call__(self, *args, **kwds):
return _dtype_forward(_cuda_op.ptx_mma)(*args, **kwds)
class CpAsyncNamespace:
"""The CpAsync instruction submodule."""
def __init__(self):
self.commit_group = _op_wrapper(_cuda_op.ptx_cp_async_commit_group)
self.wait_group = _op_wrapper(_cuda_op.ptx_cp_async_wait_group)
# Legacy variant: takes (dst_ptr, dst_offset, src_ptr, src_offset,
# cp_size). Offsets are folded into the pointers; coexists with
# the fork-native ``__call__`` form.
self.legacy = _dtype_forward(_cuda_op.ptx_cp_async_legacy)
self.bulk = CpAsyncBulkNamespace()
self.mbarrier = CpAsyncMbarrierNamespace()
def __call__(self, *args, **kwds):
# Accept the legacy 6-arg form ``(elem_dtype, dst, dst_off, src,
# src_off, cp_size)`` that the printer round-trips for the raw
# ``tirx.ptx.cp_async`` Call emitted by
# ``tvm.backend.cuda.transform.InjectPTXAsyncCopy``. The pass-emitted
# Call has 5 args (no ``tvm_access_ptr`` fold) and a
# per-element-dtype Call.dtype, so build it directly.
if len(args) == 6 and isinstance(args[0], str) and "dtype" not in kwds:
import tvm
elem_dtype, dst, dst_off, src, src_off, cp_size = args
return tvm.ir.Call(
tvm.ir.Op.get("tirx.ptx.cp_async_raw"),
[dst, dst_off, src, src_off, cp_size],
ret_ty=tvm.ir.PrimType(elem_dtype),
)
return _dtype_forward(_cuda_op.ptx_cp_async)(*args, **kwds)
# __call__ corresponds to ptx_cp_async
__tir_call_op_name__ = "ptx_cp_async"
class CpAsyncBulkNamespace:
"""The CpAsyncBulk instruction submodule."""
def __init__(self):
self.commit_group = _op_wrapper(_cuda_op.ptx_cp_async_bulk_commit_group)
self.wait_group = _op_wrapper(_cuda_op.ptx_cp_async_bulk_wait_group)
self.tensor = CpAsyncBulkTensorNamespace()
self.s2c = _op_wrapper(_cuda_op.ptx_cp_async_bulk_shared_to_cluster)
def __call__(self, *args, **kwds):
return _dtype_forward(_cuda_op.ptx_cp_async_bulk)(*args, **kwds)
# __call__ corresponds to ptx_cp_async_bulk
__tir_call_op_name__ = "ptx_cp_async_bulk"
class CpAsyncBulkTensorNamespace:
"""The CpAsyncBulkTensor instruction submodule."""
def __init__(self):
self.g2c = _op_wrapper(_cuda_op.ptx_cp_async_bulk_tensor_global_to_cluster)
self.g2c_tile_gather4 = _op_wrapper(
_cuda_op.ptx_cp_async_bulk_tensor_tile_gather4_global_to_cluster
)
self.s2g = _op_wrapper(_cuda_op.ptx_cp_async_bulk_tensor_shared_to_global)
self.s2g_reduce = _op_wrapper(_cuda_op.ptx_cp_async_bulk_tensor_shared_to_global_reduce)
self.g2c_prefetch = _op_wrapper(
_cuda_op.ptx_cp_async_bulk_tensor_global_to_cluster_prefetch
)
@staticmethod
def g2c_bar_addr(
dim,
dst_ptr,
bar_addr,
tensormap_addr,
cta_mask,
cta_group,
cache_hint,
*coords,
cache_policy=None,
):
_cuda_op._choice("cta_group", cta_group, _cuda_op._TCGEN05_CTA_GROUP)
cache_policy, has_cache_policy = _cuda_op._resolve_cache_policy(cache_hint, cache_policy)
return _tir_op.call_intrin(
"",
"tirx.ptx.cp_async_bulk_tensor_global_to_cluster",
dim,
dst_ptr,
bar_addr,
tensormap_addr,
cta_mask,
cta_group,
cache_policy,
int(has_cache_policy),
1,
*coords,
)
@staticmethod
def g2c_tile_gather4_bar_addr(
dim,
dst_ptr,
bar_addr,
tensormap_addr,
cta_mask,
cta_group,
cache_hint,
*coords,
cache_policy=None,
):
_cuda_op._choice("cta_group", cta_group, _cuda_op._TCGEN05_CTA_GROUP)
cache_policy, has_cache_policy = _cuda_op._resolve_cache_policy(cache_hint, cache_policy)
return _tir_op.call_intrin(
"",
"tirx.ptx.cp_async_bulk_tensor_tile_gather4_global_to_cluster",
dim,
dst_ptr,
bar_addr,
tensormap_addr,
cta_mask,
cta_group,
cache_policy,
int(has_cache_policy),
1,
*coords,
)
class CpAsyncMbarrierNamespace:
"""The CpAsyncMbarrier instruction submodule."""
def __init__(self):
self.arrive = _op_wrapper(_cuda_op.ptx_cp_async_mbarrier_arrive)
class WgmmaNamespace:
"""The WGMMA instruction submodule."""
def __init__(self):
self.fence: Callable[..., Any] = _op_wrapper(_cuda_op.ptx_wgmma_fence)
self.commit_group = _op_wrapper(_cuda_op.ptx_wgmma_commit_group)
self.wait_group = _op_wrapper(_cuda_op.ptx_wgmma_wait_group)
self.noop_barrier = _op_wrapper(_cuda_op.ptx_wgmma_noop_barrier)
self.mma_async = WgmmaMmaAsyncNamespace()
self.encode_matrix_descriptor = _op_wrapper(_cuda_op.ptx_wgmma_encode_matrix_descriptor)
class WgmmaMmaAsyncNamespace:
"""The WGMMA MMAAsync instruction submodule."""
def __init__(self):
self.ss = _op_wrapper(_cuda_op.ptx_wgmma_mma_async_ss)
self.rs = _op_wrapper(_cuda_op.ptx_wgmma_mma_async_rs)
class MbarrierNamespace:
"""The Mbarrier instruction submodule."""
def __init__(self):
self.init = _op_wrapper(_cuda_op.ptx_mbarrier_init)
self.try_wait = _op_wrapper(_cuda_op.ptx_mbarrier_try_wait)
self.try_wait_once = _op_wrapper(_cuda_op.ptx_mbarrier_try_wait_once)
self.try_wait_acquire_cluster = _op_wrapper(_cuda_op.ptx_mbarrier_try_wait_acquire_cluster)
self.arrive = MbarrierArriveNamespace()
class MbarrierArriveNamespace:
"""The Mbarrier Arrive instruction submodule."""
def __init__(self):
self.expect_tx = _op_wrapper(_cuda_op.ptx_mbarrier_arrive_expect_tx)
self.cluster_count = _op_wrapper(_cuda_op.ptx_mbarrier_arrive_cluster_count)
def __call__(self, *args, **kwds):
return _op_wrapper(_cuda_op.ptx_mbarrier_arrive)(*args, **kwds)
# __call__ corresponds to ptx_mbarrier_arrive
__tir_call_op_name__ = "ptx_mbarrier_arrive"
class Tcgen05Namespace:
"""The Tcgen05 instruction submodule."""
def __init__(self):
self.alloc = _op_wrapper(_cuda_op.ptx_tcgen05_alloc)
self.dealloc = _op_wrapper(_cuda_op.ptx_tcgen05_dealloc)
self.relinquish_alloc_permit = _op_wrapper(_cuda_op.ptx_tcgen05_relinquish_alloc_permit)
self.encode_matrix_descriptor = _op_wrapper(_cuda_op.ptx_tcgen05_encode_matrix_descriptor)
self.encode_instr_descriptor = _op_wrapper(_cuda_op.ptx_tcgen05_encode_instr_descriptor)
self.encode_instr_descriptor_block_scaled = _op_wrapper(
_cuda_op.ptx_tcgen05_encode_instr_descriptor_block_scaled
)
self.ld = _op_wrapper(_cuda_op.ptx_tcgen05_ld)
self.st = _op_wrapper(_cuda_op.ptx_tcgen05_st)
self.cp = _op_wrapper(_cuda_op.ptx_tcgen05_cp)
self.shift = _op_wrapper(_cuda_op.ptx_tcgen05_shift)
self.commit = _op_wrapper(_cuda_op.ptx_tcgen05_commit)
self.wait = Tcgen05WaitNamespace()
self.mma = Tcgen05MmaNamespace()
self.fence = Tcgen05FenceNamespace()
class Tcgen05FenceNamespace:
"""The Tcgen05 Fence instruction submodule."""
def __init__(self):
self.before_thread_sync = _op_wrapper(_cuda_op.ptx_tcgen05_fence_before_thread_sync)
self.after_thread_sync = _op_wrapper(_cuda_op.ptx_tcgen05_fence_after_thread_sync)
class Tcgen05MmaNamespace:
"""The Tcgen05 MMA instruction submodule."""
def __init__(self):
self.block_scale = _op_wrapper(_cuda_op.ptx_tcgen05_mma_block_scale)
self.sp = Tcgen05MmaSpNamespace()
def __call__(self, *args, **kwds):
return _op_wrapper(_cuda_op.ptx_tcgen05_mma)(*args, **kwds)
# __call__ corresponds to ptx_tcgen05_mma
__tir_call_op_name__ = "ptx_tcgen05_mma"
class Tcgen05MmaSpNamespace:
"""Tcgen05 Sparse MMA instruction submodule."""
def __init__(self):
self.block_scale = _op_wrapper(_cuda_op.ptx_tcgen05_mma_sp_block_scale)
def __call__(self, *args, **kwds):
return _op_wrapper(_cuda_op.ptx_tcgen05_mma_sp)(*args, **kwds)
# __call__ corresponds to ptx_tcgen05_mma_sp
__tir_call_op_name__ = "ptx_tcgen05_mma_sp"
class Tcgen05WaitNamespace:
"""The Tcgen05 Wait instruction submodule."""
def __init__(self):
self.ld = _op_wrapper(_cuda_op.ptx_tcgen05_wait_ld)
self.st = _op_wrapper(_cuda_op.ptx_tcgen05_wait_st)
class BarNamespace:
"""The Bar instruction submodule."""
def __init__(self):
self.arrive = _op_wrapper(_cuda_op.ptx_bar_arrive)
self.sync = _op_wrapper(_cuda_op.ptx_bar_sync)
class BarrierNamespace:
"""The Barrier instruction submodule."""
def __init__(self):
self.cluster = BarrierClusterNamespace()
class BarrierClusterNamespace:
"""The BarrierCluster instruction submodule."""
def __init__(self):
self.arrive = _op_wrapper(_cuda_op.ptx_barrier_cluster_arrive)
self.wait = _op_wrapper(_cuda_op.ptx_barrier_cluster_wait)
class FenceNamespace:
"""PTX fence instruction submodule."""
def __init__(self):
self.proxy_async = _op_wrapper(_cuda_op.ptx_fence_proxy_async)
self.mbarrier_init = _op_wrapper(_cuda_op.ptx_fence_mbarrier_init)
def __call__(self, *args, **kwds):
return _op_wrapper(_cuda_op.ptx_fence)(*args, **kwds)
__tir_call_op_name__ = "ptx_fence"
class GriddepcontrolNamespace:
"""PTX griddepcontrol instruction submodule (sm_90+)."""
def __init__(self):
self.wait = _op_wrapper(_cuda_op.ptx_griddepcontrol_wait)
self.launch_dependents = _op_wrapper(_cuda_op.ptx_griddepcontrol_launch_dependents)
class CUDANamespace:
"""The CUDA intrinsics submodule."""
def __init__(self):
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.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_tma_2sm_mbarrier_addr = _op_wrapper(_cuda_op.cuda_sm100_tma_2sm_mbarrier_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 isinstance(var, Buffer):
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 isinstance(var, Buffer):
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 isinstance(var, Buffer):
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 isinstance(var, Buffer):
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")
class NVSHMEMNamespace:
"""The NVSHMEM intrinsics submodule."""
def __init__(self):
self.my_pe = _op_wrapper(_cuda_op.nvshmem_my_pe)
self.n_pes = _op_wrapper(_cuda_op.nvshmem_n_pes)
self.signal_op = _op_wrapper(_cuda_op.nvshmem_signal_op)
self.wait_until = _op_wrapper(_cuda_op.nvshmem_wait_until)
self.quiet = _op_wrapper(_cuda_op.nvshmem_quiet)
self.fence = _op_wrapper(_cuda_op.nvshmem_fence)
self.barrier_all = _op_wrapper(_cuda_op.nvshmem_barrier_all)
self.getmem_nbi = NVSHMEMGetMemNBINamespace()
self.putmem_nbi = NVSHMEMPutMemNBINamespace()
self.putmem_signal_nbi = NVSHMEMPutMemSignalNBINamespace()
class NVSHMEMGetMemNBINamespace:
"""The NVSHMEM GetMemNBI intrinsics submodule."""
def __init__(self):
self.warp = _op_wrapper(_cuda_op.nvshmem_getmem_nbi_warp)
self.block = _op_wrapper(_cuda_op.nvshmem_getmem_nbi_block)
def __call__(self, *args, **kwds):
return _op_wrapper(_cuda_op.nvshmem_getmem_nbi)(*args, **kwds)
# __call__ corresponds to nvshmem_getmem_nbi
__tir_call_op_name__ = "nvshmem_getmem_nbi"
class NVSHMEMPutMemNBINamespace:
"""The NVSHMEM PutMemNBI intrinsics submodule."""
def __init__(self):
self.warp = _op_wrapper(_cuda_op.nvshmem_putmem_nbi_warp)
self.block = _op_wrapper(_cuda_op.nvshmem_putmem_nbi_block)
def __call__(self, *args, **kwds):
return _op_wrapper(_cuda_op.nvshmem_putmem_nbi)(*args, **kwds)
# __call__ corresponds to nvshmem_putmem_nbi
__tir_call_op_name__ = "nvshmem_putmem_nbi"
class NVSHMEMPutMemSignalNBINamespace:
"""The NVSHMEM PutMemSignalNBI intrinsics submodule."""
def __init__(self):
self.warp = _op_wrapper(_cuda_op.nvshmem_putmem_signal_nbi_warp)
self.block = _op_wrapper(_cuda_op.nvshmem_putmem_signal_nbi_block)
def __call__(self, *args, **kwds):
return _op_wrapper(_cuda_op.nvshmem_putmem_signal_nbi)(*args, **kwds)
# __call__ corresponds to nvshmem_putmem_signal_nbi
__tir_call_op_name__ = "nvshmem_putmem_signal_nbi"
__all__ = ["CUDANamespace", "NVSHMEMNamespace", "PTXNamespace"]