跳转至

Why Symbolic Shapes

为何符号维优于 ?-1

a. 可读性与清晰度

在形状定义中显式使用 MN 等符号维,使程序更易阅读与理解。若仅见 ?-1,读者难以判断该维究竟表示什么;符号维则直接表明 MN 为依赖运行时取值的变量。这有助于可维护性,并降低阅读与修改代码时的认知负担。

例如,若程序用 ? 表示动态维,无法区分其表示未初始化、通配维或其他含义,推理程序行为时易产生困惑。相较之下,符号维显式展示形状如何确定:

// Using symbolic dimensions 
mdspan sp : [M, N]; 
mdspan spn : sp [1, M / 2, N / 4]; 
// Clear how the new shape is derived 

// Using `?` or `-1` 
mdspan sp : [? , ?];

后者含糊,缺乏符号维所提供的清晰度。

b. 类型安全与编译期检查

Choreo 中符号维的一大优势是其类型安全且可在编译期检查。可声明符号维并对其进行代数运算(如 M / 2N / 4),使其满足预期类型与约束,从而减少运行时检查——后者常引入错误或性能开销。

在其他系统中用 ?-1 作为动态维时,往往需在运行时做一致性检查(例如使用前确认维已正确初始化),带来额外开销并增加优化难度。相较之下,符号维使 Choreo 能在编译期检查约束,保证形状表达式在执行前即有效:

mdspan sp : [M, N]; 
// M and N are symbolic dimensions 

mdspan spn : sp [1, M / 2, N / 4]; 
// Compiler ensures validity of shape expressions`

由此保证类型一致性,降低运行时出错可能。

c. 表达力与灵活性

符号维为描述数据形状提供了更丰富的表达。与局限于简单占位维度的 ?-1 不同,符号维可通过复杂算术与关系加以约束,例如直接表达某一维如何依赖另一维,或如何缩放、分块,更为自然。

使用 ?-1 往往导致脆弱代码:开发者需在运行时手动推算或推断真实大小,易出错且难以推理。

例如,可用符号变量表达维间关系:

mdspan sp : [M, N]; // Symbolic dimensions 
mdspan spn : sp [1, M / 2, N / 4]; // Derived shape based on symbolic expressions

若改用 ?-1,表达相同关系往往需要迂回写法或额外运行时逻辑。

d. 编译期优化

符号维的另一重要益处是可参与编译期优化。Choreo 可在编译期对符号维求值,从而基于这些维优化 memory layout 与 kernel 执行计划,带来更高效代码生成与更好性能。相较之下,?-1 常需运行时求值与动态内存分配,阻碍优化机会。