CUTLASS Task Scheduling 资源抽象解析:PipelineConfig、MemoryResource 与 WorkQueue 源码指南
2026/9/16 20:18:46 网站建设 项目流程

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 给出了典型生命周期,五个步骤对应下文各小节:

  1. resource.create():分配 SMEM 屏障并物化管线对象,每个资源调用一次(由TaskManager.setup_resources_and_tasks()触发);
  2. resource.initialize_runtime_state_internal():初始化管线状态、状态标志与 task-local 存储默认值,每次 kernel 调用执行一次,且必须位于动态控制流之外;
  3. create_consumer_variables_internal()/create_producer_variables_internal():用用户定义的、在资源间流动的变量填充consumer_vars/producer_vars
  4. consumer_work(stage_info)/producer_work(stage_info):由Task调度调用的用户逐阶段逻辑;
  5. copy_consumer_vars_to(dst_resource):把匹配的 consumer 变量传播到下游资源的 producer 变量,由Task自动调用。

PipelineConfig:不可变管线描述符

PipelineConfig(resources.py)是@dataclass(frozen=True),捕获MemoryResource.create_pipeline()物化具体管线对象所需的全部信息(屏障存储、stage 数、事务字节数、协作组、CTA 布局、信令策略)。

核心字段表

字段类型默认值语义
num_stagesint必填缓冲 stage 数(管线深度)
num_bytesint必填每 stage 期望事务字节数(不适用时为 0)
producer_group/consumer_grouppipeline.CooperativeGroup必填定义生产/消费两端的协作组
pipeline_typePipelineType必填选择具体管线实现
barrier_ptrcute.PointerNone预分配的 SMEM 屏障存储(Int64,2 * num_stages);为None时由create_pipeline()分配
cta_layout_vmnkcute.LayoutNone簇分解布局,UMMA / CLC 管线必填
producer_signaling_threadsSignalingThreadsAll执行生产者侧屏障操作(acquire、commit)的线程;CtaLeader把信令限制在 CTA 0
consumer_signaling_threadsSignalingThreadsAll执行消费者侧屏障操作(wait、release)的线程
consumer_wait_signaling_threadsSignalingThreads/NoneNoneConsumerTryWait / ConsumerWait 信令线程的覆盖项;None时回退到consumer_signaling_threads,用于 wait 与 release 需要不同 CTA 信令的 split-consumer 模式
async_producer_oppipeline.PipelineOpAsyncThreadAsyncAsync管线的生产者侧屏障操作;AsyncLoad选择使用cp.async.mbarrier.arrive的 cp.async 风格提交
umma_consumer_producer_oppipeline.PipelineOpAsyncThreadAsyncUmma管线的生产者侧屏障操作
advance_on_waitboolFalse何时推进 stage 索引。默认在release时推进;为True时在wait时推进,并用独立状态释放消费者。默认关闭,等待性能测量
advance_on_acquireboolFalse生产者侧对应物:为TrueProducerAcquire立即推进producer_state
mcast_mode_mntuple[int, int](1, 1)传给 CUTLASS TMA 管线创建的 M/N 方向多播模式
num_bytes_per_warp_per_ctaint/NoneNone声明每个生产者 CTA 将其 TMA 完成路由到 leader 可见的 full barrier;值为每个生产者 warp、每个 CTA 的事务字节数,校验确保num_bytes覆盖整个簇的所有生产者 warp
interleave_strideint/tuple[int, int, int, int]1交错推进步长,见下文专项讲解

七个静态工厂方法

用户不应直接构造PipelineConfig,而应使用静态工厂方法(docstring 明确要求),它们会填入正确的PipelineType与合理默认值:

工厂方法生成的管线类型适用场景
create_async_async_pipeline_cfgAsyncAsync通用 async 生产者 + async 消费者
create_tma_async_pipeline_cfgTmaAsyncTMA 生产者 + async 消费者
create_tma_umma_pipeline_cfgTmaUmmaTMA 生产者 + UMMA 消费者
create_umma_async_pipeline_cfgUmmaAsyncUMMA 生产者 + async 消费者
create_async_umma_pipeline_cfgAsyncUmmaasync 生产者 + UMMA 消费者
create_umma_umma_pipeline_cfgUmmaUmmaUMMA 生产者 + UMMA 消费者(张量核两端均用 UMMA)
create_clc_fetch_async_pipeline_cfgClcFetchAsyncCLC tile-fetch 生产者 + async 消费者

其中create_async_async_pipeline_cfgproducer_op=AsyncLoad匹配 async global-to-shared 生产者,它们用cp.async.mbarrier.arrive信令 full barrier,而消费者仍通过普通 async-thread mbarrier 释放(resources.py)。create_tma_async_pipeline_cfgnum_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_acquireproducer_commit需要advance_on_acquire=True;拆分consumer_waitconsumer_release需要advance_on_wait=True,否则构造时抛出ValueErrorPipelineConfig提供interleave_stridesproducer_acquire_interleave_stride等属性及has_interleaved_stride(任一步长 > 1 即返回True)供调度器判断。

构造时校验

__post_init__还执行一组显式校验:

  • producer_signaling_threadsconsumer_signaling_threadsconsumer_wait_signaling_threads必须通过SignalingThreads.validate
  • async_producer_op只能是AsyncThreadAsyncLoad,且AsyncAsync管线允许修改它;
  • umma_consumer_producer_op同理,仅AsyncUmma管线允许修改;
  • interleave_stride各角色取值必须是>= 1int_validate_interleave_stride_value,resources.py)。

TileSchedulerConfig:持久化 tile 调度器描述符

TileSchedulerConfig(resources.py)是@dataclass(frozen=True),把调度器类型与参数配对:

字段语义
tile_scheduler_typeStaticPersistentClcDynamicPersistent(见 enums.py)
tile_scheduler_paramsPersistentTileSchedulerParamsClcDynamicPersistentTileSchedulerParams(网格维度、簇形状等)
response_ptrSMEM 响应缓冲区指针,仅 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_offsetK-tile 循环当前迭代索引
loop_start/loop_end/loop_stepK-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_basetmem_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 logic

TaskLocalVariable 与变量流模型

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)抛出清晰的ValueErrorTaskLocalVariable实例不可跨资源字段复用_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_configconsumer_vars/producer_varspipeline(由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() -> dictconsumer 侧产生并经由copy_consumer_vars_to转发到下游的{name: default}字典
create_producer_variables() -> dictproducer 侧消费、从上游 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_varsTaskLocalVariable字段会抛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_waitconsumer_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,不需要专用调度 warpget_and_advance_work_tile直接调用advance_to_next_work
  • CLC 动态持久化模式ClcDynamicPersistent):专用调度 warp 充当生产者,在fetch_work_tile中发出 work-tile 抓取请求;消费者任务只需等待管线。

两种模式下,消费者侧变量work_tileWorkTileInfo)都携带其他资源读取的 tile 坐标与有效性标志。WorkQueue__init__中声明两个TaskLocalVariablework_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

PdlWaitBarrierPdlLaunchBarrier(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:

  • PipelineTypeAsyncAsyncTmaAsyncTmaUmmaUmmaAsyncAsyncUmmaUmmaUmmaClcFetchAsync,命名遵循<Producer><Consumer>约定;
  • TileSchedulerTypeStaticPersistentClcDynamicPersistent
  • PipelineGroupModeMerge(N-to-1,消费者侧折叠)、Fork(1-to-N,生产者侧折叠),见 pipeline_group.py;
  • SignalingThreads(IntFlag):All(独占)、CtaLeaderTaskWarpLeaderCtaLeaderTaskWarpLeader可组合(如CtaLeader | TaskWarpLeader),All不能与其他组合;
  • WorkAttr(IntFlag):NONEAUXILIARY
  • ScheduleStage:消费者侧ConsumerAuxWork/ConsumerTryWait/ConsumerWait/ConsumerWork/ConsumerRelease,生产者侧ProducerAuxWork/ProducerTryAcquire/ProducerAcquire/ProducerWork/ProducerCommit
  • ScheduleStageTypeHead(循环前预取,执行一次)、Loop(稳态循环体,每次迭代)、LoopFirstIter/LoopLastIter(仅首/末次迭代)、Tail(循环后排空阶段,执行一次);
  • LoopGuardAlways/LastIter/FirstIter,用于 LOOP 条目的条件执行守卫。

进一步探索

  • 管线物化入口:resources.py 的MemoryResource.create_pipeline()——按pipeline_type分派到pipeline.PipelineAsyncPipelineTmaAsyncPipelineTmaUmmaPipelineUmmaAsyncTSPipelineUmmaUmmaTSPipelineAsyncUmmaPipelineClcFetchAsync,全部以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/ 目录中搜索PipelineConfigWorkQueue@consumer_work可找到基于这些抽象构建的 warp-specialised kernel 实例(本文所述均为当前仓库源码可直接核实的实现事实)。

【免费下载链接】cutlassCUDA Templates and Python DSLs for High-Performance Linear Algebra项目地址: https://gitcode.com/GitHub_Trending/cu/cutlass

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询