操作
mpmd.assign (mpmd::AssignOp)
分配操作
语法:
operation ::= `mpmd.assign` attr-dict $tensor `:` functional-type(operands, results)
将局部张量分配给网格,使其在该网格内完全复制。
这是在降低 JAX 操作时引入的临时操作,用于从本地类型移动到网格类型。当 func op 的输入和结果变为网格张量时,这些操作将在导入期间被消除。
结果类型的网格名称应与拓扑中的网格相对应,并且其全局类型应与操作数类型相同。
分配操作的来源是网格的来源,例如命名计算、网格推理等。
特征:AlwaysSpeculatableImplTrait、HasParent<::mlir::func::FuncOp, ForOp>
接口:ConditionallySpeculatable、NoMemoryEffect (MemoryEffectOpInterface)
效果:MemoryEffects::Effect{}
属性:
| 属性 | MLIR 类型 | 说明 |
|---|---|---|
origin | ::mlir::StringAttr | 字符串属性 |
实参:
| Operand | 说明 |
|---|---|
tensor |
任何非令牌类型值的张量 |
结果:
| 结果 | 说明 |
|---|---|
result |
网格张量类型 |
mpmd.broadcast (mpmd::BroadcastOp)
广播操作
语法:
operation ::= `mpmd.broadcast` attr-dict $tensor `:` type($tensor)
允许在任何使用张量的网格中转移(或复制)张量。无论何时转移,转移的来源都是操作数的当前位置。
特征:AlwaysSpeculatableImplTrait、SameOperandsAndResultType
接口:ConditionallySpeculatable、InferTypeOpInterface、NoMemoryEffect (MemoryEffectOpInterface)
效果:MemoryEffects::Effect{}
实参:
| Operand | 说明 |
|---|---|
tensor |
任何非令牌类型值的张量 |
结果:
| 结果 | 说明 |
|---|---|
result |
任何非令牌类型值的张量 |
mpmd.call (mpmd::CallOp)
MPMD 特定的调用函数
语法:
operation ::= `mpmd.call` $callee `(` $tensors `)` attr-dict `:` functional-type(operands, results)
函数调用操作。可用于将循环正文封装在函数声明中,以减小代码大小。
接口:ArgAndResultAttrsOpInterface、CallOpInterface、SymbolUserOpInterface
属性:
| 属性 | MLIR 类型 | 说明 |
|---|---|---|
callee | ::mlir::FlatSymbolRefAttr | 降调符号参考属性 |
实参:
| Operand | 说明 |
|---|---|
tensors |
任意非令牌类型值或网格张量类型的张量的可变参数 |
结果:
| 结果 | 说明 |
|---|---|
| “未命名” | 任意非令牌类型值或网格张量类型的张量的可变参数 |
mpmd.for (mpmd::ForOp)
对于运营商
返回针对固定次数的迭代执行正文函数的结果,迭代指数可在正文中使用。
可以指定一个可选的展开系数(必须能整除迭代次数),以按该系数展开操作的正文,即对于展开系数 N,正文会被复制以创建 N 个副本,并且迭代次数会减少 1/N 倍。除第一个副本之外的每个副本都使用前一个副本的结果,而不是块实参,并且迭代索引乘以展开系数,并在每个副本之后递增。
for 运算符可以接受和返回任何类型,但这些类型的 TypeID 必须相同,例如所有张量类型或所有 MPMD 网格类型等。这样一来,我们就可以在各个级别使用该运算符,从而共享实现和转换。
特征:HLO_PairwiseSameOperandAndResultType、RecursiveMemoryEffects、RecursivelySpeculatableImplTrait、SingleBlockImplicitTerminator<ReturnOp>、SingleBlock
接口:ConditionallySpeculatable、LoopLikeOpInterface、OpAsmOpInterface、ShardableDataFlowOpInterface
属性:
| 属性 | MLIR 类型 | 说明 |
|---|---|---|
iterations | ::mlir::IntegerAttr | 32 位无符号整数属性 |
unroll_factor | ::mlir::IntegerAttr | 32 位无符号整数属性 |
实参:
| Operand | 说明 |
|---|---|
tensors |
任意非令牌类型的可变实参 |
结果:
| 结果 | 说明 |
|---|---|
results |
任意非令牌类型的可变实参 |
mpmd.fragment (mpmd::FragmentOp)
fragment 操作
将计算(即操作块)分配给 MPMD 拓扑中的特定网格,该网格旨在作为单独的 SPMD 程序片段执行。
该 fragment 仅接受和返回分配给与该 fragment 相同网格的网格张量。
片段的网格名称应与拓扑中的网格相对应。
该 fragment 包含一个来源列表,即包含有关构成此 fragment 的原始 named_computations 的信息的元数据,以及一个 staged_id(仅当它是用户定义的 fragment 时才定义)。也就是说,它具有非空的来源列表。可选的 in_shardings 指定了 fragment 的块实参(对应于操作数)的分片。 可选的 out_shardings 用于指定结果的分片。
fragment 的区域不应有任何自由变量,并且该区域中每个区块实参和返回值的类型都是相应网状网张量的全局张量类型。
特征:HasParent<::mlir::func::FuncOp, ForOp>、IsolatedFromAbove、RecursiveMemoryEffects、RecursivelySpeculatableImplTrait、SingleBlockImplicitTerminator<ReturnOp>、SingleBlock
接口:ConditionallySpeculatable、ShardableDataFlowOpInterface
属性:
| 属性 | MLIR 类型 | 说明 |
|---|---|---|
origin | ::mlir::ArrayAttr | 来源信息数组 |
mesh_name | ::mlir::StringAttr | 字符串属性 |
stage_id | ::mlir::IntegerAttr | 64 位无符号整数属性 |
in_shardings | ::mlir::sdy::TensorShardingPerValueAttr | 每个操作数/结果的张量分片 |
out_shardings | ::mlir::sdy::TensorShardingPerValueAttr | 每个操作数/结果的张量分片 |
实参:
| Operand | 说明 |
|---|---|
inputs |
网格张量类型或令牌的可变实参 |
结果:
| 结果 | 说明 |
|---|---|
results |
网格张量类型或令牌的可变实参 |
mpmd.fragment_call (mpmd::FragmentCallOp)
fragment 调用操作
表示对包含 MPMD fragment body 的函数的调用,即分配给 MPMD 拓扑中特定网格的计算,旨在作为单独的 SPMD 程序 fragment 执行。
片段的网格名称应与封装函数的拓扑中的网格相对应,并且该网格形状应与被调用者的网格形状相匹配。
来源指定了促成此 fragment 调用的用户命名计算(例如通过合并)。
被调用方的函数输入和结果类型必须分别是相应操作数和结果的相应网状网张量的本地张量类型。
示例:
%2 = mpmd.fragment_call<mesh="m1",> origin=[] @my_fragment(%0, %1) :
(m<esh>_tensor..., m<esh>_te>nsor...) - m<esh>_tensor...
特征:HasParent<::mlir::func::FuncOp>、MemRefsNormalizable
接口:ArgAndResultAttrsOpInterface、CallOpInterface、SymbolUserOpInterface
属性:
| 属性 | MLIR 类型 | 说明 |
|---|---|---|
origin | ::mlir::ArrayAttr | 来源信息数组 |
mesh_name | ::mlir::StringAttr | 字符串属性 |
callee | ::mlir::FlatSymbolRefAttr | 降调符号参考属性 |
实参:
| Operand | 说明 |
|---|---|
tensors |
网格张量类型的变参 |
结果:
| 结果 | 说明 |
|---|---|
| “未命名” | 网格张量类型的变参 |
mpmd.named_computation (mpmd::NamedComputationOp)
命名范围操作
对计算(即一系列操作)进行分组,并通过 UserOrigin 属性为其指定名称和转置次数。此 NamedComputation 可用于在 MPMD 中为计算分配网格或用于优化。
转置次数(默认值为 0)表示指定计算是否已通过一定数量的 JAX AD 转置转换生成。
操作的区域不应有任何自由变量,并且区域中每个块实参和返回值的类型必须与操作的输入类型和返回值类型相同。
特征:IsolatedFromAbove、RecursiveMemoryEffects、RecursivelySpeculatableImplTrait、SingleBlockImplicitTerminator<ReturnOp>、SingleBlock
接口:ConditionallySpeculatable
属性:
| 属性 | MLIR 类型 | 说明 |
|---|---|---|
origin | ::mlir::mpmd::UserOriginAttr | 用户指定计算的来源。 |
实参:
| Operand | 说明 |
|---|---|
tensors |
具有 32/64 位浮点元素或每个张量整数量化值或令牌的 4/6/8/16/32/64 位浮点或布尔或 2/4/8/16/32/64 位整数或复数类型的排名张量的可变参数 |
结果:
| 结果 | 说明 |
|---|---|
results |
具有 32/64 位浮点元素或每个张量整数量化值或令牌的 4/6/8/16/32/64 位浮点或布尔或 2/4/8/16/32/64 位整数或复数类型的排名张量的可变参数 |
mpmd.named_tensor (mpmd::NamedTensorOp)
将张量分配给网状网
语法:
operation ::= `mpmd.named_tensor` $tensor `name````=```$name attr-dict `:` type($result)
一种将张量的结果与指定名称相关联的恒等运算。 此 NamedTensor 可用于在 MPMD 中为张量分配网格。
特征:AlwaysSpeculatableImplTrait、SameOperandsAndResultType
接口:ConditionallySpeculatable、InferTypeOpInterface、NoMemoryEffect (MemoryEffectOpInterface)
效果:MemoryEffects::Effect{}
属性:
| 属性 | MLIR 类型 | 说明 |
|---|---|---|
name | ::mlir::StringAttr | 字符串属性 |
实参:
| Operand | 说明 |
|---|---|
tensor |
任何非令牌类型值的张量 |
结果:
| 结果 | 说明 |
|---|---|
result |
任何非令牌类型值的张量 |
mpmd.reduce (mpmd::ReduceOp)
跨网格 reduce 操作
语法:
operation ::= `mpmd.reduce` `` $reduction attr-dict $tensors `:` functional-type(operands, results)
允许跨不同网格缩减张量,然后广播到需要使用它的任何位置。
特征:AlwaysSpeculatableImplTrait、SameOperandsAndResultType
接口:ConditionallySpeculatable、NoMemoryEffect (MemoryEffectOpInterface)
效果:MemoryEffects::Effect{}
属性:
| 属性 | MLIR 类型 | 说明 |
|---|---|---|
reduction | ::mlir::mpmd::ReductionAttr | 表示归约。 |
实参:
| Operand | 说明 |
|---|---|
tensors |
任意非令牌类型值的张量的可变参数 |
结果:
| 结果 | 说明 |
|---|---|
result |
任何非令牌类型值的张量 |
mpmd.return (mpmd::ReturnOp)
mpmd.return 操作会终止附加到基于 mpmd 区域的操作的区域。它是可变参数函数:它接受一个值列表作为实参,这些值的类型可以是任意类型(但必须是同一种类型,例如 AnyTensor),因此可以在 MPMD IR 堆栈的各个层级重复使用。
语法:
operation ::= `mpmd.return` attr-dict $results (`:` type($results)^)?
特征:AlwaysSpeculatableImplTrait、Terminator
接口:ConditionallySpeculatable、NoMemoryEffect (MemoryEffectOpInterface)
效果:MemoryEffects::Effect{}
实参:
| Operand | 说明 |
|---|---|
results |
任意非令牌类型的可变实参 |
mpmd.transfer (mpmd::TransferOp)
转移操作
语法:
operation ::= `mpmd.transfer` attr-dict $tensor `:` functional-type(operands, results)
将分布式张量从一个网格转移到另一个网格。
操作数和结果类型的网格名称应与拓扑中的网格相对应,并且它们的全局类型应相同。
特征:AlwaysSpeculatableImplTrait、HasParent<::mlir::func::FuncOp>
接口:ConditionallySpeculatable、NoMemoryEffect (MemoryEffectOpInterface)、ShardingRuleOpInterface
效果:MemoryEffects::Effect{}
实参:
| Operand | 说明 |
|---|---|
tensor |
网格张量类型 |
结果:
| 结果 | 说明 |
|---|---|
result |
网格张量类型 |
mpmd.unassign (mpmd::UnassignOp)
取消分配操作
语法:
operation ::= `mpmd.unassign` attr-dict $tensor `:` functional-type(operands, results)
从网格中取消分配完全复制的张量。
这是在降低 JAX 操作时引入的临时操作,用于从本地类型移动到网格类型。当 func op 的输入和结果变为网格张量时,这些操作将在导入期间被消除。
操作数类型的网格名称应与拓扑中的网格相对应,并且其全局类型应与结果类型相同。
特征:AlwaysSpeculatableImplTrait、HasParent<::mlir::func::FuncOp, ForOp>、InferTensorType
接口:ConditionallySpeculatable、InferShapedTypeOpInterface、InferTypeOpInterface、NoMemoryEffect (MemoryEffectOpInterface)
效果:MemoryEffects::Effect{}
属性:
| 属性 | MLIR 类型 | 说明 |
|---|---|---|
origin | ::mlir::StringAttr | 字符串属性 |
实参:
| Operand | 说明 |
|---|---|
tensor |
网格张量类型 |
结果:
| 结果 | 说明 |
|---|---|
result |
任何非令牌类型值的张量 |
属性
MeshWithOriginsAttr
网状网及其来源。
语法:
#mpmd.mesh_with_origins<
::llvm::StringRef, # mesh_name
::llvm::ArrayRef<OriginAttr> # origins
>
参数:
| 参数 | C++ 类型 | 说明 |
|---|---|---|
| mesh_name | ::llvm::StringRef |
mesh_name |
| 来源 | ::llvm::ArrayRef<OriginAttr> |
来源 |
MeshesWithOriginsAttr
包含网格及其来源的列表。
语法:
#mpmd.meshes_with_origins<
::llvm::ArrayRef<MeshWithOriginsAttr> # value
>
参数:
| 参数 | C++ 类型 | 说明 |
|---|---|---|
| 值 | ::llvm::ArrayRef<MeshWithOriginsAttr> |
NamedMeshAttr
包含名称和网格的一对。
语法:
#mpmd.named_mesh<
::llvm::StringRef, # name
sdy::MeshAttr # mesh
>
参数:
| 参数 | C++ 类型 | 说明 |
|---|---|---|
| name | ::llvm::StringRef |
name |
| 网格 | sdy::MeshAttr |
网格 |
OriginAttr
网状网分配的来源。
语法:
#mpmd.origin<
::llvm::StringRef # origin_label
>
网格分配的来源。
origin_label 是直观易懂的来源标签。它旨在用于调试目的。
参数:
| 参数 | C++ 类型 | 说明 |
|---|---|---|
| origin_label | ::llvm::StringRef |
origin_label |
ReductionAttr
表示减少。
语法:
#mpmd.reduction<
`none` | `add` | `max` | `min` | `mul` | `or` | `and` # reduction_type
>
参数:
| 参数 | C++ 类型 | 说明 |
|---|---|---|
| reduction_type | ::mlir::mpmd::ReductionType |
ReductionType 类型的枚举 |
TopologyAttr
已命名的网格的拓扑。
语法:
#mpmd.topology<
::llvm::ArrayRef<NamedMeshAttr> # meshes
>
参数:
| 参数 | C++ 类型 | 说明 |
|---|---|---|
| 网格 | ::llvm::ArrayRef<NamedMeshAttr> |
拓扑网格 |
UserOriginAttr
用户指定计算的来源。
语法:
#mpmd.user_origin<
::mlir::StringAttr, # userName
int64_t # transposeCount
>
参数:
| 参数 | C++ 类型 | 说明 |
|---|---|---|
| userName | ::mlir::StringAttr |
|
| transposeCount | int64_t |
类型
MeshTensorType
网格张量类型
在程序的网格 MPMD 拓扑中,为特定 SPMD 网格分配 RankedTensorType。 该类型包含一个可选的分片,用于指定如何根据 SPMD 网格对张量进行分片。 如果不存在分片,则张量会完全复制。
参数:
| 参数 | C++ 类型 | 说明 |
|---|---|---|
| mesh_name | ::llvm::StringRef |
网状网名称 |
| ranked_tensor_type | ::mlir::RankedTensorType |
已排名张量类型 |
| 分片 | ::mlir::sdy::TensorShardingAttr |
|
| memory_kind | ::mlir::StringAttr |
枚举
ReductionType
减免类型属性
支持请求:
| 符号 | 值 | 字符串 |
|---|---|---|
| kNone | 0 |
无 |
| kAdd | 1 |
添加 |
| kMax | 2 |
max |
| kMin | 3 |
分钟 |
| kMul | 4 |
mul |
| kOr | 5 |
或 |
| kAnd | 6 |
和 |
EdgeNodeType
边缘节点类型枚举
支持请求:
| 符号 | 值 | 字符串 |
|---|---|---|
| OPERAND | 0 |
operand |
| 结果 | 1 |
结果 |
PropagationDirection
传播方向枚举
支持请求:
| 符号 | 值 | 字符串 |
|---|---|---|
| 无 | 0 |
无 |
| FORWARD | 1 |
FORWARD |
| 向后 | 2 |
向后 |
| 双方 | 3 |
双方 |
ReductionOp
缩减操作枚举
支持请求:
| 符号 | 值 | 字符串 |
|---|---|---|
| SUM | 0 |
总和 |
| 最大时间范围 | 1 |
max |
| MIN | 2 |
分钟 |