CUTLASS Task Scheduling 资源抽象解析:PipelineConfig、MemoryResource 与 WorkQueue 源码指南
【免费下载链接】cutlassCUDA Templates and Python DSLs for High-Performance Linear Algebra项目地址: https://gitcode.com/GitHub_Trending/cu/cutlass
本文基于 CUTLASS 仓库中 Task Scheduling(TS)框架的resources模块,逐层讲解数据流图中各类资源抽象的源码实现。TS 框架用于把 warp-specialised kernel 组装成多阶段流水线:PipelineConfig负责描述并物化管线(TMA / UMMA / CLC),MemoryResource是数据流图的基类,WorkQueue驱动持久化 tile 调度。读完本文,你将掌握这些类的字段语义、生命周期钩子、命名 work 函数装饰器的用法,以及如何用SlotRouting控制变量在调度阶段之间的流动。
本文主体对应文档 resources.rst,其 Sphinxautomodule指令引用的实现位于 python/CuTeDSL/cutlass/experimental/task_scheduling/resources.py(约 3650 行),配套枚举定义在同目录 enums.py。
TS 框架与 resources 模块的定位
cutlass.experimental.task_scheduling是一个 Python DSL 子包,与 CUTLASS 的 Python DSL(CuTeDSL)集成。resources模块 docstring 开宗明义:
Compile-time abstraction:这里定义的管线操作(acquire、release、commit、wait)由 DSL 在编译期被 trace,产出与手写 bare-metal kernel 相同的 mbarrier PTX 指令,运行时零额外开销——框架是代码生成器,而非运行时调度器。
这意味着本文介绍的所有类都只是编译期描述符与钩子,真正"跑起来"的只有最终生成的 CUDA kernel。模块定义了 warp-specialised kernel 组装流水线的数据流积木:
PipelineConfig:不可变描述符,选择管线类型(TMA、UMMA、CLC 等)并捕获其参数(stage 数、字节数、协作组、信令策略);TileSchedulerConfig:把TileSchedulerType与调度器专属参数配对;StageInfo:只读快照,传入每次producer_work/consumer_work调用;MemoryResource:数据流图中所有资源的基类,拥有可选的PipelineConfig(物化出管线与 mbarrier)、按角色划分的变量字典(consumer_vars/producer_vars)与管线状态对象;WorkQueue:包装 tile 调度器的专用资源,驱动持久化 work loop。
生命周期(由 TaskManager 驱动)
模块 docstring 给出了典型生命周期,五个步骤对应下文各小节:
resource.create():分配 SMEM 屏障并物化管线对象,每个资源调用一次(由TaskManager.setup_resources_and_tasks()触发);resource.initialize_runtime_state_internal():初始化管线状态、状态标志与 task-local 存储默认值,每次 kernel 调用执行一次,且必须位于动态控制流之外;create_consumer_variables_internal()/create_producer_variables_internal():用用户定义的、在资源间流动的变量填充consumer_vars/producer_vars;consumer_work(stage_info)/producer_work(stage_info):由Task调度调用的用户逐阶段逻辑;copy_consumer_vars_to(dst_resource):把匹配的 consumer 变量传播到下游资源的 producer 变量,由Task自动调用。
PipelineConfig:不可变管线描述符
PipelineConfig(resources.py)是@dataclass(frozen=True),捕获MemoryResource.create_pipeline()物化具体管线对象所需的全部信息(屏障存储、stage 数、事务字节数、协作组、CTA 布局、信令策略)。
核心字段表
| 字段 | 类型 | 默认值 | 语义 |
|---|---|---|---|
num_stages | int | 必填 | 缓冲 stage 数(管线深度) |
num_bytes | int | 必填 | 每 stage 期望事务字节数(不适用时为 0) |
producer_group/consumer_group | pipeline.CooperativeGroup | 必填 | 定义生产/消费两端的协作组 |
pipeline_type | PipelineType | 必填 | 选择具体管线实现 |
barrier_ptr | cute.Pointer | None | 预分配的 SMEM 屏障存储(Int64,2 * num_stages);为None时由create_pipeline()分配 |
cta_layout_vmnk | cute.Layout | None | 簇分解布局,UMMA / CLC 管线必填 |
producer_signaling_threads | SignalingThreads | All | 执行生产者侧屏障操作(acquire、commit)的线程;CtaLeader把信令限制在 CTA 0 |
consumer_signaling_threads | SignalingThreads | All | 执行消费者侧屏障操作(wait、release)的线程 |
consumer_wait_signaling_threads | SignalingThreads/None | None | ConsumerTryWait / ConsumerWait 信令线程的覆盖项;None时回退到consumer_signaling_threads,用于 wait 与 release 需要不同 CTA 信令的 split-consumer 模式 |
async_producer_op | pipeline.PipelineOp | AsyncThread | AsyncAsync管线的生产者侧屏障操作;AsyncLoad选择使用cp.async.mbarrier.arrive的 cp.async 风格提交 |
umma_consumer_producer_op | pipeline.PipelineOp | AsyncThread | AsyncUmma管线的生产者侧屏障操作 |
advance_on_wait | bool | False | 何时推进 stage 索引。默认在release时推进;为True时在wait时推进,并用独立状态释放消费者。默认关闭,等待性能测量 |
advance_on_acquire | bool | False | 生产者侧对应物:为True时ProducerAcquire立即推进producer_state |
mcast_mode_mn | tuple[int, int] | (1, 1) | 传给 CUTLASS TMA 管线创建的 M/N 方向多播模式 |
num_bytes_per_warp_per_cta | int/None | None | 声明每个生产者 CTA 将其 TMA 完成路由到 leader 可见的 full barrier;值为每个生产者 warp、每个 CTA 的事务字节数,校验确保num_bytes覆盖整个簇的所有生产者 warp |
interleave_stride | int/tuple[int, int, int, int] | 1 | 交错推进步长,见下文专项讲解 |
七个静态工厂方法
用户不应直接构造PipelineConfig,而应使用静态工厂方法(docstring 明确要求),它们会填入正确的PipelineType与合理默认值:
| 工厂方法 | 生成的管线类型 | 适用场景 |
|---|---|---|
create_async_async_pipeline_cfg | AsyncAsync | 通用 async 生产者 + async 消费者 |
create_tma_async_pipeline_cfg | TmaAsync | TMA 生产者 + async 消费者 |
create_tma_umma_pipeline_cfg | TmaUmma | TMA 生产者 + UMMA 消费者 |
create_umma_async_pipeline_cfg | UmmaAsync | UMMA 生产者 + async 消费者 |
create_async_umma_pipeline_cfg | AsyncUmma | async 生产者 + UMMA 消费者 |
create_umma_umma_pipeline_cfg | UmmaUmma | UMMA 生产者 + UMMA 消费者(张量核两端均用 UMMA) |
create_clc_fetch_async_pipeline_cfg | ClcFetchAsync | CLC tile-fetch 生产者 + async 消费者 |
其中create_async_async_pipeline_cfg的producer_op=AsyncLoad匹配 async global-to-shared 生产者,它们用cp.async.mbarrier.arrive信令 full barrier,而消费者仍通过普通 async-thread mbarrier 释放(resources.py)。create_tma_async_pipeline_cfg的num_bytes语义为每 stage 的 TMA 事务字节数,并支持num_bytes_per_warp_per_cta用于 leader 路由的簇 TMA 完成校验(resources.py)。
interleave_stride:多 lane 共享一条管线
interleave_stride是较新的机制:当步长 > 1 时,N 条(warp 或 domain 拥有的)lane 共享一条有num_stages个 barrier 的管线,每条 lane 从自己的索引起步、按步长推进,步长必须整除num_stages(__post_init__中逐角色校验,resources.py)。
- 单个整数:对所有角色统一应用;
- 4 元组:按
(producer_acquire, producer_commit, consumer_wait, consumer_release)分配角色专属步长。
拆分要求相应推进标志:拆分producer_acquire与producer_commit需要advance_on_acquire=True;拆分consumer_wait与consumer_release需要advance_on_wait=True,否则构造时抛出ValueError。PipelineConfig提供interleave_strides、producer_acquire_interleave_stride等属性及has_interleaved_stride(任一步长 > 1 即返回True)供调度器判断。
构造时校验
__post_init__还执行一组显式校验:
producer_signaling_threads、consumer_signaling_threads、consumer_wait_signaling_threads必须通过SignalingThreads.validate;async_producer_op只能是AsyncThread或AsyncLoad,且仅AsyncAsync管线允许修改它;umma_consumer_producer_op同理,仅AsyncUmma管线允许修改;interleave_stride各角色取值必须是>= 1的int(_validate_interleave_stride_value,resources.py)。
TileSchedulerConfig:持久化 tile 调度器描述符
TileSchedulerConfig(resources.py)是@dataclass(frozen=True),把调度器类型与参数配对:
| 字段 | 语义 |
|---|---|
tile_scheduler_type | StaticPersistent或ClcDynamicPersistent(见 enums.py) |
tile_scheduler_params | PersistentTileSchedulerParams或ClcDynamicPersistentTileSchedulerParams(网格维度、簇形状等) |
response_ptr | SMEM 响应缓冲区指针,仅 CLC 动态模式需要 |
同样提供两个静态工厂:create_static_persistent_tile_scheduler_params(params)与create_clc_dynamic_persistent_tile_scheduler_params(params, response_ptr)。CLC 模式的response_ptr会被传给ClcDynamicPersistentTileScheduler.create(),作为硬件写回 tile 响应的 SMEM 缓冲区。
StageInfo:每次 work 调用的只读上下文
StageInfo(resources.py)是@dataclass(frozen=True),传入每个producer_work/consumer_work。字段包括:
| 字段 | 语义 |
|---|---|
loop_offset | K-tile 循环当前迭代索引 |
loop_start/loop_end/loop_step | K-tile 循环边界与步长(等价于range(loop_start, loop_end, loop_step)) |
stage_idx | 当前操作的管线 stage 索引;资源无管线时为None |
label | 用户定义的编译期 work 标签(来自调度条目),用于选择命名 work 钩子,见下例;未指定时为None |
barrier | 当前 stage 的 mbarrier 指针;无管线时为None |
work_tile | 来自 tile 调度器的 tile 坐标与有效性标志 |
num_active_stages | 延迟提交生产者调度中当前在途的生产者 stage 数;默认立即提交调度为 0 |
context | 携带smem_base、tmem_ptr_i32的统一ResourceContext;无分配器时为None |
task_cache | 可选的任务定义载荷,由Task.make_task_cache()返回,用于热路径读取而不逐个加宽StageInfo字段 |
label的典型用法是编译期分支:
if cutlass.const_expr(stage_info.label == WorkLabel.K_DESC): ... # K descriptor logic elif cutlass.const_expr(stage_info.label == WorkLabel.V_DESC): ... # V descriptor logicTaskLocalVariable 与变量流模型
TaskLocalVariable:资源拥有的逻辑变量
TaskLocalVariable(resources.py)是资源拥有变量的公开身份。在生成代码中它物化为 task-local 寄存器状态,consumer work 调用产生该寄存器值的新版本。字段:
dtype:task-local 寄存器槽中值的 DSL 类型(必填);default/default_factory:写入任何生产者之前、以及 SSA 汇合处的 sink-safe 初始值,二选一(同时给出会抛ValueError);docs:面向用户的描述;runtime_slot_name:内部槽名覆盖项(多数资源直接用 dataclass 字段名)。
声明方式:用TaskLocalVariable.uninitialized()占位,并在__init__/__post_init__中赋值:
item: TaskLocalVariable = TaskLocalVariable.uninitialized() def __post_init__(self) -> None: self.item = TaskLocalVariable(dtype=..., default=...)忘记赋值会在 TS 首次遍历资源的 task-local 变量时(bind_task_local_variables)抛出清晰的ValueError。TaskLocalVariable实例不可跨资源字段复用(_bind_owner校验)。模块级辅助函数bind_task_local_variables(resource)/get_task_local_variables(resource)负责绑定与校验(注意:这两个函数在 resources.rst 的 automodule 指令中被:exclude-members:排除,但仍可通过源码查看)。
SlotRouting:变量传播的唯一事实来源
模块注释详细规定了变量流模型(resources.py):
- consumer / producer 变量不是由 work 函数新建的:
create_consumer_variables/create_producer_variables一次性分配存储,consumer work原地修改已有变量,producer work 通过get_producer_var读取被修改后的值; SlotRouting表控制哪些被修改的 consumer 变量复制到哪些下游 producer / consumer 变量;- 一个 "slot" 是唯一标识为
(resource_id, stage, stage_type, call_idx)的一个调度条目,其中call_idx是同一调度段内(resource, stage, stage_type)元组的 0 基序号; - 每个键是写入者slot(任务的
src_resources中某资源的 ConsumerAuxWork 或 ConsumerWork),值是(var_routes, destinations)对的列表;路由可以是"name"(同名复制)或("src_name", "dst_name")(显式重映射); - 未被任何路由条目提及的变量完全不传播——路由表本身就是复制计划。
GEMM load 任务的示例(gmem tile 坐标喂给 TMA load):
slot_routing = { (id(gmem_ab), ScheduleStage.ConsumerWork, ScheduleStageType.Loop, 0): [ ( ["coord_k", ("coord_m_src", "coord_m"), "coord_n"], [(smem_ab, ScheduleStage.ProducerWork, ScheduleStageType.Loop, 0)], ), ], }构建期校验(TaskManager._verify_slot_routing)包含三点:① stage 合法性、call-idx 范围、路由/目的非空,且一个 reader 目标变量不能接收多个源变量;② 调度顺序:写入者必须在合并调度(head + loop body + tail)中线性先于读取者,不建模跨迭代的 loop-carry——body 读取者的唯一写入者若在 body 更靠后则被拒绝,要为第 0 迭代供数需添加同变量的 head 写入者;③ most-recent-writer 一致性:每个路由必须与线性匹配器从后向推导的逐 slot 写/读集合一致,防止同源变量的后续写入者静默覆盖更早的路由边。
MemoryResource:数据流图基类
MemoryResource(resources.py)是@dataclass(kw_only=True),元类_MemoryResourceMeta把 task-local dataclass 字段暴露为类级字段引用。它代表一段命名内存(GMEM、SMEM、TMEM 等)连同保护其访问的管线。核心属性:name(人类可读标签,用于调试打印与 PTX 注释)、pipeline_config、consumer_vars/producer_vars、pipeline(由create()物化)、consumer_state/producer_state(stage 索引 + phase 位)、consumer_status/producer_status(try_wait / try_acquire 的布尔标志)、is_barrier(纯信令资源为True,在_verify_resource_deps中获得宽松的依赖规则)、dummy(保持 DSL 状态在动态控制流边界存活)。
需在子类中覆写的钩子方法
| 钩子 | 语义 |
|---|---|
get_smem_requirements() -> list[SmemAllocation] | 数据 SMEM 需求(屏障 SMEM 由create_pipeline管理),默认[] |
get_tmem_requirements() -> list[TmemAllocation] | TMEM 列需求,默认[] |
create_consumer_variables() -> dict | consumer 侧产生并经由copy_consumer_vars_to转发到下游的{name: default}字典 |
create_producer_variables() -> dict | producer 侧消费、从上游 consumer vars 填充的字典 |
consumer_aux_work(stage_info)/producer_aux_work(stage_info) | ConsumerAuxWork/ProducerAuxWork阶段的辅助变量逻辑 |
consumer_work(stage_info)/producer_work(stage_info) | ConsumerWork/ProducerWork阶段的用户逻辑;使用标签时被命名@consumer_work/@producer_work方法覆盖 |
get_producer_requirements()/get_consumer_requirements() | 限定 producer / consumer 可访问的分配子集,供 exhaustive checker 构建别名图;默认None(全部可访问) |
physical_ranges() -> list[(memory_space, start_col, end_col)] | 声明物理内存区域,供跨 tile 别名校验器检测共享同一物理内存(如 TMEM 列重叠)的资源间的潜在数据竞争 |
捕获调度下的访问守卫
MemoryResource.__getattribute__/__setattr__实现了捕获调度(captured schedule)下的保护:用户钩子代码中直接读写consumer_vars/producer_vars或TaskLocalVariable字段会抛RuntimeError,提示"work hooks 必须用方法参数作为输入、返回匹配@consumer_work(returns=...)的标量或元组作为输出"(resources.py)。框架内部则通过_get_consumer_var_from_ts/_set_consumer_var_from_ts等@cute.jit方法绕过守卫。
捕获调度模式对旧钩子的限制
create_consumer_variables_internal(captured_schedule=True)与create_producer_variables_internal(captured_schedule=True)在捕获模式下禁止覆写create_consumer_variables/create_producer_variables,会抛TypeError:发射变量必须声明为TaskLocalVariable字段并从@consumer_work(returns=...)产生;producer 侧槽位由Task._allocate_slots_from_routing依据捕获调度的数据流 token 从上游consumer_vars自动分配。
管线状态初始化
initialize_runtime_state_internal(resources.py)始终创建consumer_status/producer_status(Int32)与consumer_state/producer_state(管线状态或 dummy Int32),保证无论是否挂载管线,DSL 树形状都一致——注释解释了为什么用 Int32 而非 Boolean:Boolean(i1)的 first-def 会被布尔赋值 pass 跳过,anti-aliasing 重建路径在状态跨越scf.if区域边界(consumer_try_wait→consumer_wait)时可能产生违反 MLIR dominance 的陈旧 SSA 值。CLC 管线用PipelineUserType.ProducerConsumer状态以支持双角色;advance_on_acquire/advance_on_wait分别创建独立的producer_commit_state/consumer_release_state滞后游标。
命名 work 函数装饰器
@consumer_work/@producer_work(resources.py)在MemoryResource子类上注册命名 work 方法,替代(或补充)整体式consumer_work/producer_work覆写。
典型声明:
item: TaskLocalVariable = TaskLocalVariable.uninitialized() @consumer_work(returns=item) @cute.jit def load(self, stage_info): return self.tensor[stage_info.loop_offset]@producer_work @cute.jit def store(self, stage_info, *, item): self.tensor[stage_info.loop_offset] = item要点:
@consumer_work语义:从资源视角"读"数据。装饰器在方法名下注册,该名字也是原始schedule_list的标签;returns=声明此 consumer 更新的TaskLocalVariable输出槽(字符串或TaskLocalVariable.uninitialized()字段引用,重复或空条目抛错);返回值被规范化为单个值或元组,禁止返回 dict(装饰期静态 AST 检查 + 运行期兜底双重拦截);@producer_work语义:从资源视角"写"数据。捕获调度把 consumer token 按名字作为关键字参数传入;典型签名store(self, stage_info, *, item)中的item会由 wrapper 从producer_vars自动注入;work_attrs参数:WorkAttr.AUXILIARY标记不携带数据载荷的辅助 work(如WorkQueue.init_work_tile),不参与常规资源排序检查;Constexpr参数:标注为cutlass.Constexpr[...]的关键字专属参数从调度调用点原样转发(constexpr 转发),不参与数据流路由;非关键字专属的Constexpr参数在装饰期抛TypeError;- 调度标签选择:资源注册 ≥2 个命名方法时,调度列表中的
ConsumerWork条目必须携带标签,如(smem_kv, ScheduleStage.ConsumerWork, "k_desc");拼写错误会得到带 did-you-mean 建议的ValueError;只有一个命名方法时自动分派,无命名方法时调用整体式consumer_work()。
WorkQueue:驱动持久化 work loop 的专用资源
WorkQueue(resources.py)包装 tile 调度器,参与每个任务的调度:
- 静态持久化模式(
StaticPersistent):启动的 CTA 数恰好填满 1 波 SM,work-tile 索引静态分配给每个 CTA,不需要专用调度 warp;get_and_advance_work_tile直接调用advance_to_next_work; - CLC 动态持久化模式(
ClcDynamicPersistent):专用调度 warp 充当生产者,在fetch_work_tile中发出 work-tile 抓取请求;消费者任务只需等待管线。
两种模式下,消费者侧变量work_tile(WorkTileInfo)都携带其他资源读取的 tile 坐标与有效性标志。WorkQueue在__init__中声明两个TaskLocalVariable:work_tile(dtype 为WorkTileInfo,默认全零 + 无效标志)与skip_work_tile(dtype 为cutlass.Boolean,默认False)。
三个核心 work 方法
init_work_tile(@consumer_work(work_attrs=WorkAttr.AUXILIARY, returns=("work_tile", "skip_work_tile"))):在第一个 work tile 前播种持久循环状态;get_and_advance_work_tile(@consumer_work(returns=("work_tile",))):推进到下一个 work tile。静态模式下在消费者侧调用tile_scheduler.advance_to_next_work()(注释说明这稍反直觉,但让所有任务无论静态还是动态都能用同一个三段式 tail 模式);CLC 模式下从每 stage 的响应缓冲区读取;fetch_work_tile(@producer_work):仅 CLC 动态模式,由生产者 warp 发出issue_clc_query。实现细节值得注意:cta_rank_in_cluster == 0时才触发查询(resources.py),且计数器递增被提升到动态条件之外,避免 voidscf.if把更新值困在 then 块内导致 SSA dominance 违规。
标准三段式 tail 模式(无论静态/动态调度器):
(work_queue, ScheduleStage.ConsumerTryWait, ScheduleStageType.Tail), (work_queue, ScheduleStage.ConsumerWait, ScheduleStageType.Tail), (work_queue, ScheduleStage.ConsumerWork, ScheduleStageType.Tail, "get_and_advance_work_tile"), (work_queue, ScheduleStage.ConsumerRelease, ScheduleStageType.Tail),CLC 多 stage work queue 中,每个 stage 有独立的 16 字节响应缓冲区:基础_clc_response_ptr指向 stage 0,后续 stage 各偏移一个 Int128 响应记录(_get_stage_response_ptr)。_decode_clc_response通过硬件查询指令cute.arch.clc_response解码 opaque 的 16 字节响应,并可按需插入fence_view_async_shared();_work_tile_info_from_clc_response再叠加_swizzle_and_rasterize与簇内 CTA 偏移得到最终WorkTileInfo。
PDL 屏障:Programmatic Dependent Launch
PdlWaitBarrier与PdlLaunchBarrier(resources.py)是仅含屏障的资源(is_barrier=True、无PipelineConfig),封装 CUDA Programmatic Dependent Launch:
PdlWaitBarrier.wait_griddep(@consumer_work):发射griddepcontrol.waitPTX,阻塞发起线程直到直接前驱 grid 依赖完成且其全局内存结果可见。接入约定:任何数据来自前驱 grid 的资源(如经 TMA 加载的 SMEM-A、直接读取的 GMEM-A、从对等 CTA 复制的 DSMEM-A)都把pdl_wait列入TaskManager.resource_dependency_graph的 upstreams;因is_barrier=True,校验器把该边解释为仅排序,但要求发射 wait 的调度条目先于任何产生依赖资源的任务的生产者条目。推荐模式是内联 wait:每个产生 PDL 依赖资源的任务自行调用pdl_wait.wait_griddep();PdlLaunchBarrier.launch_griddep(@producer_work):发射griddepcontrol.launch_dependents,通知后继 grid 可以开始启动 CTA。它不携带数据依赖,不应出现在resource_dependency_graph的目标中;exhaustive interleaving checker 仍要求每个可执行 launch 交错中已至少执行过一次wait_griddep,但不强制"至少一次 launch"——kernel 可以合法省略 launch(例如它是 pipeline chain 的最后一个 grid)。
PDL_BARRIER_TYPES元组收录两类,供框架代码做isinstance识别。
配套枚举速查
全部定义见 enums.py:
PipelineType:AsyncAsync、TmaAsync、TmaUmma、UmmaAsync、AsyncUmma、UmmaUmma、ClcFetchAsync,命名遵循<Producer><Consumer>约定;TileSchedulerType:StaticPersistent、ClcDynamicPersistent;PipelineGroupMode:Merge(N-to-1,消费者侧折叠)、Fork(1-to-N,生产者侧折叠),见 pipeline_group.py;SignalingThreads(IntFlag):All(独占)、CtaLeader、TaskWarpLeader;CtaLeader与TaskWarpLeader可组合(如CtaLeader | TaskWarpLeader),All不能与其他组合;WorkAttr(IntFlag):NONE、AUXILIARY;ScheduleStage:消费者侧ConsumerAuxWork/ConsumerTryWait/ConsumerWait/ConsumerWork/ConsumerRelease,生产者侧ProducerAuxWork/ProducerTryAcquire/ProducerAcquire/ProducerWork/ProducerCommit;ScheduleStageType:Head(循环前预取,执行一次)、Loop(稳态循环体,每次迭代)、LoopFirstIter/LoopLastIter(仅首/末次迭代)、Tail(循环后排空阶段,执行一次);LoopGuard:Always/LastIter/FirstIter,用于 LOOP 条目的条件执行守卫。
进一步探索
- 管线物化入口:resources.py 的
MemoryResource.create_pipeline()——按pipeline_type分派到pipeline.PipelineAsync、PipelineTmaAsync、PipelineTmaUmma、PipelineUmmaAsync、TSPipelineUmmaUmma、TSPipelineAsyncUmma、PipelineClcFetchAsync,全部以defer_sync=True创建(屏障初始化栅栏留给TaskManager/ kernel); - 调度构建与校验:同目录 schedule_builder.py、task.py(含
_verify_slot_routing)、task_manager.py(含setup_resources_and_tasks); - 分配与上下文:memory.py(
SmemAllocation/TmemAllocation/ResourceContext); - 验证工具:exhaustive_checker.py(跨 tile 别名与 launch 交错校验);
- 示例用法:在 examples/ 与 test/ 目录中搜索
PipelineConfig、WorkQueue、@consumer_work可找到基于这些抽象构建的 warp-specialised kernel 实例(本文所述均为当前仓库源码可直接核实的实现事实)。
【免费下载链接】cutlassCUDA Templates and Python DSLs for High-Performance Linear Algebra项目地址: https://gitcode.com/GitHub_Trending/cu/cutlass
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考