Why Symbolic Shapes
为何符号维优于 ? 或 -1¶
a. 可读性与清晰度¶
在形状定义中显式使用 M、N 等符号维,使程序更易阅读与理解。若仅见 ? 或 -1,读者难以判断该维究竟表示什么;符号维则直接表明 M、N 为依赖运行时取值的变量。这有助于可维护性,并降低阅读与修改代码时的认知负担。
例如,若程序用 ? 表示动态维,无法区分其表示未初始化、通配维或其他含义,推理程序行为时易产生困惑。相较之下,符号维显式展示形状如何确定:
// 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 / 2、N / 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 常需运行时求值与动态内存分配,阻碍优化机会。