Shared Executable GPU Program IR¶
1. 角色¶
Shared GPU IR是一份provider-neutral、launchable、可独立验证的block program。它位于canonical KIR之后、Triton/cuTile source legalization之前。
它表达GPU source providers共同需要的program-level事实,但不表达下层distributed layout或机器指令。Provider serializer不得把缺失的执行结构留到字符串阶段补齐。
2. 顶层结构¶
一个physical module包含:
- external target-capability object;
- 一个或多个由不同KIR specializations产生的physical kernels;
- 每个kernel的public ABI和compiler-private resource parameters;
- compile-time physical parameter declarations;
- kernel的program space、body与origin map。
一个physical kernel对应一个target artifact和一次launch。Compiler-private workspace可以成为额外kernel argument并由runtime分配,但不能引入隐藏的第二次launch或跨kernel同步。
3. Program space¶
Program space定义有限physical program instances。IR显式表示:
- program-space extents;
- current program coordinates;
- execution-group segment lengths与prefix offsets;
- coordinates到execution group与logical workset coordinates的双射或guarded mapping;
- tail/empty program validity;
- 可选grouping、swizzle或grid-stride traversal。
Program space可以是任意logical rank;provider legalization负责flatten或映射到目标surface允许的grid rank。Mapping必须是一等IR关系,不能由serializer根据axis role或result shape重建。Runtime extents只能依赖launch-visible ABI scalars与shape relations;需要读取device data才能确定长度的ragged/member domain必须留在program body内,除非KIR本身已提供可直接用于launch的mapping。
每个workset由execution_group region持有实际执行体。其operands保存当前linear program coordinate与runtime extents,typed attributes保存对应launch extents、coordinate roles和segment identity/bounds;region arguments是按这些extents作row-major解码的index coordinates。外部dispatch guard仍是显式structured control,group本身不增加launch或barrier,也不改变body中的effects。修改mapping必须同时重绑region arguments与其执行体。
Provider入口在形成native grid后统一展开execution groups:region arguments替换为纯delinearize的结果,body原位展开。delinearize只表示linear和extents的数学解码,不保存launch、segment或ownership事实;普通CSE/DCE可合并或删除它,不需要无use保活规则。
Program coordinates只存在于physical IR,不回流成DSL/KIR values。
3.1 LaunchExpr¶
Program-space extents、execution-group segment offsets与provider grid使用受限typed LaunchExpr。其leaves只能是:
- integer/bool constants与已绑定physical parameters;
- public ABI中按值传入的scalar parameters;
- external view ABI中host可见的shape/stride metadata。
允许的operations是无effect的integer/bool arithmetic、comparison、select、min/max、floor/ceil division与tuple indexing;canonical equality/bounds facts只用于证明表达式合法,不能替代runtime value。LaunchExpr不能load device memory、调用kernel helper或依赖kernel-body SSA。
Provider wrapper在launch前求值LaunchExpr以形成grid;kernel body从同一typed expression重建dispatch/validity。若provider launch ABI不能在两侧直接共享某个metadata value,lowering把wrapper求得的结果声明为compiler-private scalar argument;该argument及其producer必须在physical module中显式存在,不能由serializer临时添加。
4. Values 与 types¶
共同GPU IR至少区分:
4.1 Scalar¶
Canonical scalar、logical index与predicate保持精确定义。Scalar不会为了统一代码路径被伪装成一元素fragment。
4.2 Fragment¶
Fragment是一个program instance拥有的静态或compile-time-parameterized shaped SSA value:
Fragment保存:
- element dtype;
- physical shape expressions;
- 各fragment axes到logical coordinates的compositional mapping及其source-axis provenance;
- active member/index set与validity的shape relation;
- owning program instance/workset。
Fragment不保存register/lane/warp/CTA distribution、shared/TMEM layout、MMA encoding或provider memory space。这些由外部provider compiler或被真实差异逼出的local extensions决定。
4.3 View¶
External view保留public ABI中的allocation identity、element offset、logical shape、element strides、access mode、bounds与alias semantics。Physical access使用显式coordinates消费view,不把pointer arithmetic留给emitter。
4.4 Buffer¶
Physical buffer是kernel内mutable resource,显式保存:
- element type与shape;
- allocation scope:program-private、iteration-private或invocation workspace;
- allocation-instance identity与ownership domain;
- initialization mode与可选full initial value,或uninitialized-first-write obligation;
- lifetime与uses;
- sharing/visibility obligation;
- 是否需要compiler-private workspace ABI。
具有full initial value的buffer在每个logical allocation instance上恰好初始化一次。未初始化buffer不产生默认fill,保留作者的先写后读义务;verifier不因静态初始化证明不足而拒绝程序。依赖初始化事实的优化仍须取得所需证明,不能把Unknown当成已初始化。Invocation workspace由runtime在同一次launch前分配;每个slice必须有唯一owner或明确的atomic/scatter-reduction semantics,不能依赖隐藏init kernel或kernel-global barrier。
共同IR不指定register、local、shared或TMEM。它先决定SSA value、program-private resource还是invocation workspace;provider/storage passes再从lifetime、sharing、resource limits与capability选择目标memory form。
5. Control¶
共同IR复用结构化SSA control:
- scalar-condition
if; - ordered
for/while及loop-carried values; - execution-group dispatch;
- compiler生成的physical traversal/blocking loops。
KIR中的unordered parallel在construction阶段被program mapping或明确的program-internal independent workset兑现,不继续作为一个等待provider解释的语义标记。
Physical loops可以使用runtime bounds或compile-time physical parameters。作者不可观察的blocking loops只存在于physical IR;作者定义的ordered control通过origin与semantic-preservation rules保持。
6. Coordinate 与 access relation¶
每个physical access显式包含:
- resource/view/buffer;
- result axes;
- 每个source axis的typed coordinate expression;
- coordinate对program ids、loops、fragments、runtime indices与source subregions的SSA dependencies;
- 从logical predicate及source bounds组合出的active member/index set与validity;
- load fill或write collision/effect semantics。
共同access operations是:
- load;
- store/unique scatter;
- gather;
- scatter-reduce;
- atomic load/store/RMW/CAS;
- buffer load/store。
Invalid load不产生memory access并返回显式fill;invalid write不产生effect。Pointer tensor、cuTile tile index或descriptor是provider representation,不是共同access identity。
Atomic operation另外显式保存memory order、logical sharing domain、RMW kind、old-value/CAS result schema。Provider scope由该sharing domain与current program mapping推得,而不是由serializer选择默认值。
7. Value operations¶
共同IR包含对scalar和fragment都定义明确的:
- arithmetic、comparison、select、cast与bitcast;
- broadcast、reshape、transpose、join、tuple与record operations;
- explicit scalar↔fragment broadcast/extract;
- immutable value reuse与rematerialization;
- typed pure helper/combiner regions。
Unary/binary operations 保留 KIR 的逐操作 approximate 与 flush_to_zero 数值属性,默认均为 false;合法 operator/dtype 组合与精度范围由 DSL 数值规格定义。属性不改变 fragment shape、ownership 或 ABI,不是 provider 参数;相同 operands/operator kind 但数值属性不同的操作不是同一纯值。
Broadcast、reshape、transpose、slice、tuple/record extraction与pure helper call同时组合value def-use与coordinate provenance。Physical pass若选择重算pure producer,必须真实改变def-use并保持等价coordinate map;若选择materialize,必须产生buffer/value及对应uses。不能只写replay=true、provenance ID或value ID列表。
8. Structured compute¶
Physical structured operations消费当前scalar/fragment SSA:
- reduce:physical axes、逐component identity、声明可结合与交换的typed pure combine region、dynamic extent、result relation与accumulator flow;
- scan:physical axis、逐component identity、可结合的typed pure combine region、direction、inclusive/exclusive、prefix result relation与carry;它保留prefix成员顺序,不继承reduce的重排许可;
- region fold:physical segment loop、source-slice operands、typed summarizer region、summary identity/combine、captures与result flow;
- region scan:physical segment loop、summarizer与transition combine、incoming-state application、slice emitter、source-aligned output assembly与final-state flow;
- contract:physical lhs/rhs/accumulator fragments、paired reduction与batch axis maps、free/result-axis order、zero-reduction result rule、result relation与accumulator dtype;
- scaled/sparse contract:保留KIR的logical format/schema,同时具有physical operand/access mapping;
- histogram:physical input fragment、validity与count result; -其它被canonical KIR正式定义的local structured operation。
Arg-reduce等复合result还保存tie、NaN与index semantics;ordinary ordered loop则显式保存runtime condition/bounds、loop-carried values、effects与terminators。Region summarizer内原本显式存在的contract/reduce继续是独立physical structured ops;compiler不需要从summary combine猜回它们。上述ops不携带provider primitive名称、MMA version、input precision hint、K-pack、warp policy或pipeline stage。Provider可以直接映射到native primitive、合法展开或明确拒绝,但不得改变KIR semantic schema。
普通reduce的结合交换合同来自operation语义,不需要附加一份combine代数证明或重排计划。Shared passes形成blocking、access与accumulator flow;provider已有等价collective时,其内部归约树、lane/warp通信与同步由provider compiler完成。Scan与ordered region operations继续按各自的顺序合同lower,不为统一实现而把ordinary reduce变成scan再取末项。
Structured op可以另外保存一个由typed predicate analysis得到的physical effective source range。该range只能收窄physical traversal,不修改KIR logical source;被排除的members必须已被证明对每个free lane产生identity/no effect。All-true区间可删除predicate,mixed区间保留原validity,all-false区间可从physical loop/access graph中删除。Effective range与改写后的loop/access SSA属于current program;proof是由current coordinate/predicate relations重算的analysis result,可缓存但不参与执行解释。
9. Dependency、storage 与 synchronization¶
共同IR使用SSA、memory effects、resource identities和explicit dependence edges表达producer-consumer、visibility与lifetime obligations。它不预先选择TMA/cp.async、mbarrier、named barrier或software pipeline。
共同IR不定义跨physical program instances的barrier;跨instances的冲突只能由KIR已有的atomic/scatter-reduction semantics闭合,否则该mapping非法。只有shared physical transformation在一个program instance内部真实创建了异步producer-consumer行为时,才可引入具有跨provider execution meaning的dependency token/operation。仅为拼出某个provider的copy API或为NVIDIA拼出mbarrier,不得污染共同IR。
Provider-local pass可以把共同dependency/lifetime展开成explicit allocation、copy、wait与barrier,也可以把它们委托给下层compiler。
10. 完整性不变量¶
任意shared GPU pass前后,program均满足:
- exactly one executable physical kernel body per KIR kernel specialization;
- program space与logical effect/result coverage完整;
- every SSA value具有合法scalar/fragment/resource type;
- fragment extents是常量或已声明physical parameter expressions;
- every access具有resource、compositional coordinates/provenance、active member set、validity及fill/effect;
- every control region具有完整arguments、yields与dominance;
- every buffer具有initialization或first-write obligation、lifetime与ownership;
- every structured op具有完整physical operands/results与semantic schema;
- non-atomic conflicting effects非法;
- runtime grid extents不依赖launch后才能读取的device data;
- every physical range narrowing具有原logical relation的subset/identity proof,并已真实改写loop、access与validity;
- execution不依赖KIR clone、axis/role字符串或side decision records。
11. 明确排除¶
共同GPU IR不包含:
- provider API spelling;
- kernel-name或whole-op template identity;
- warp/lane/register分布布局;
- TTGIR-style blocked/MMA/shared encodings与
convert_layout; - CUDA shared/TMEM address spaces;
- target copy instructions、TMA、WGMMA、TCGEN05、MFMA;
- software-pipeline stages、warp specialization与barrier protocol;
- autotune winner。
上述内容由provider-local extensions或外部provider compiler拥有。
12. GEMM 形态示例¶
完整域contract经过physicalization后,shared GPU IR应具有下列结构,而不是一个contract record加KIR shape:
kernel @gemm<BM, BN, BK>(A, B, C, M, N, K) {
grid = (ceil_div(M, BM), ceil_div(N, BN))
(pm, pn) = program_coord(grid)
m = pm * BM + range(0, BM)
n = pn * BN + range(0, BN)
acc = full<fragment<f32, [BM, BN]>>(0)
for k0 = 0 to K step BK iter_args(acc):
k = k0 + range(0, BK)
lhs = load A[m, k] valid (m < M && k < K) fill 0
rhs = load B[k, n] valid (k < K && n < N) fill 0
acc = contract lhs, rhs, acc
store C[m, n] = acc valid (m < M && n < N)
}
BM/BN/BK、grid、loops、fragments、coordinates、validity、loads、accumulator与store都属于当前program。Triton serializer只把它们机械写成tl.program_id、tl.arange、tl.load、tl.dot和tl.store;cuTile映射到ct.bid、tile indices、ct.load/mma/store。