Operazioni
mpmd.assign (mpmd::AssignOp)
Operazione di assegnazione
Sintassi:
operation ::= `mpmd.assign` attr-dict $tensor `:` functional-type(operands, results)
Assegna un tensore locale a una mesh come completamente replicato all'interno di quella mesh.
Si tratta di un'operazione temporanea introdotta quando si riducono le operazioni Jax, per passare dai tipi locali ai tipi di mesh. Queste operazioni verranno eliminate durante l'importazione, quando gli input e i risultati dell'operazione func diventano tensori mesh.
Il nome del mesh del tipo di risultato deve corrispondere a un mesh nella topologia e il suo tipo globale deve essere identico al tipo di operando.
L'origine dell'operazione di assegnazione è l'origine della mesh, ad esempio named_computation, mesh inference e così via.
Tratti: AlwaysSpeculatableImplTrait, HasParent<::mlir::func::FuncOp, ForOp>
Interfacce: ConditionallySpeculatable, NoMemoryEffect (MemoryEffectOpInterface)
Effetti: MemoryEffects::Effect{}
Attributi:
| Attributo | Tipo MLIR | Descrizione |
|---|---|---|
origin | ::mlir::StringAttr | attributo stringa |
Operandi:
| Operando | Descrizione |
|---|---|
tensor |
tensore di valori di qualsiasi tipo non token |
Risultati:
| Risultato | Descrizione |
|---|---|
result |
mesh tensor type |
mpmd.broadcast (mpmd::BroadcastOp)
Operazione di trasmissione
Sintassi:
operation ::= `mpmd.broadcast` attr-dict $tensor `:` type($tensor)
Consente il trasferimento (o la replica) di un tensore in qualsiasi mesh in cui viene utilizzato. Ogni volta che viene trasferito, l'origine del trasferimento è la posizione attuale dell'operando.
Tratti: AlwaysSpeculatableImplTrait, SameOperandsAndResultType
Interfacce: ConditionallySpeculatable, InferTypeOpInterface, NoMemoryEffect (MemoryEffectOpInterface)
Effetti: MemoryEffects::Effect{}
Operandi:
| Operando | Descrizione |
|---|---|
tensor |
tensore di valori di qualsiasi tipo non token |
Risultati:
| Risultato | Descrizione |
|---|---|
result |
tensore di valori di qualsiasi tipo non token |
mpmd.call (mpmd::CallOp)
Funzione di chiamata specifica per MPMD
Sintassi:
operation ::= `mpmd.call` $callee `(` $tensors `)` attr-dict `:` functional-type(operands, results)
Un'operazione di chiamata di funzione. Utile per racchiudere il corpo dei loop nelle dichiarazioni di funzione per ridurre le dimensioni del codice, ad esempio.
Interfacce: ArgAndResultAttrsOpInterface, CallOpInterface, SymbolUserOpInterface
Attributi:
| Attributo | Tipo MLIR | Descrizione |
|---|---|---|
callee | ::mlir::FlatSymbolRefAttr | attributo di riferimento del simbolo di bemolle |
Operandi:
| Operando | Descrizione |
|---|---|
tensors |
variadico di tensore di valori di qualsiasi tipo non token o tipo di tensore mesh |
Risultati:
| Risultato | Descrizione |
|---|---|
| "senza nome" | variadico di tensore di valori di qualsiasi tipo non token o tipo di tensore mesh |
mpmd.for (mpmd::ForOp)
Per l'operatore
Restituisce il risultato dell'esecuzione di una funzione del corpo per un numero fisso di iterazioni, con l'indice di iterazione disponibile nel corpo.
È possibile specificare un fattore di srotolamento facoltativo, che deve dividere il numero di iterazioni, per srotolare il corpo dell'operazione in base a questo fattore, ovvero per il fattore di srotolamento N, il corpo viene replicato per creare N copie e il numero di iterazioni viene ridotto di un fattore 1/N. Ogni copia, tranne la prima, utilizza i risultati della copia precedente anziché gli argomenti del blocco e l'indice di iterazione viene moltiplicato per il fattore di srotolamento e incrementato dopo ogni copia.
Un operatore for può accettare e restituire qualsiasi tipo, ma il TypeID di questi deve essere lo stesso, ad esempio tutti i tipi di tensore o tutti i tipi di mesh MPMD e così via. Ciò ci consente di utilizzare l'operatore a vari livelli, condividendo l'implementazione e le trasformazioni.
Tratti: HLO_PairwiseSameOperandAndResultType, RecursiveMemoryEffects, RecursivelySpeculatableImplTrait, SingleBlockImplicitTerminator<ReturnOp>, SingleBlock
Interfacce: ConditionallySpeculatable, LoopLikeOpInterface, OpAsmOpInterface, ShardableDataFlowOpInterface
Attributi:
| Attributo | Tipo MLIR | Descrizione |
|---|---|---|
iterations | ::mlir::IntegerAttr | Attributo intero non firmato a 32 bit |
unroll_factor | ::mlir::IntegerAttr | Attributo intero non firmato a 32 bit |
Operandi:
| Operando | Descrizione |
|---|---|
tensors |
variadico di qualsiasi tipo non token |
Risultati:
| Risultato | Descrizione |
|---|---|
results |
variadico di qualsiasi tipo non token |
mpmd.fragment (mpmd::FragmentOp)
Operazione di frammentazione
Assegna un calcolo, ovvero un blocco di operazioni, a una mesh specifica in una topologia MPMD, che deve essere eseguita come frammento di programma SPMD individuale.
Il frammento accetta e restituisce solo i tensori mesh assegnati alla stessa mesh del frammento.
Il nome della mesh del frammento deve corrispondere a una mesh nella topologia.
Il frammento include un elenco di origini, ovvero metadati con informazioni relative alle named_computations originali che hanno formato questo frammento, e un staged_id definito iff se si tratta di un frammento definito dall'utente, ovvero se ha un elenco di origini non vuoto. L'argomento facoltativo in_shardings specifica lo sharding degli argomenti del blocco di un frammento, che corrispondono agli operandi. L'argomento out_shardings facoltativo specifica gli sharding dei risultati.
La regione del frammento non deve avere variabili libere e il tipo di ogni argomento del blocco e valore restituito nella regione è il tipo di tensore globale del tensore mesh corrispondente.
Tratti: HasParent<::mlir::func::FuncOp, ForOp>, IsolatedFromAbove, RecursiveMemoryEffects, RecursivelySpeculatableImplTrait, SingleBlockImplicitTerminator<ReturnOp>, SingleBlock
Interfacce: ConditionallySpeculatable, ShardableDataFlowOpInterface
Attributi:
| Attributo | Tipo MLIR | Descrizione |
|---|---|---|
origin | ::mlir::ArrayAttr | array di informazioni sull'origine |
mesh_name | ::mlir::StringAttr | attributo stringa |
stage_id | ::mlir::IntegerAttr | Attributo intero senza segno a 64 bit |
in_shardings | ::mlir::sdy::TensorShardingPerValueAttr | Suddivisione dei tensori per operando/risultato di un'operazione |
out_shardings | ::mlir::sdy::TensorShardingPerValueAttr | Suddivisione dei tensori per operando/risultato di un'operazione |
Operandi:
| Operando | Descrizione |
|---|---|
inputs |
variadico di tipo tensore mesh o token |
Risultati:
| Risultato | Descrizione |
|---|---|
results |
variadico di tipo tensore mesh o token |
mpmd.fragment_call (mpmd::FragmentCallOp)
Operazione di chiamata di frammento
Rappresenta una chiamata a una funzione che contiene un corpo di frammento MPMD, ovvero un calcolo assegnato a una mesh specifica in una topologia MPMD, che deve essere eseguito come frammento di programma SPMD individuale.
Il nome della mesh del frammento deve corrispondere a una mesh nella topologia della funzione di inclusione e la forma della mesh deve corrispondere a quella del destinatario della chiamata.
L'origine specifica i calcoli denominati dall'utente che hanno contribuito a questa chiamata di frammento, ad esempio tramite l'unione.
I tipi di input e risultato della funzione del chiamante devono essere i tipi di tensore locale dei tensori mesh corrispondenti degli operandi e dei risultati di questa operazione rispettivamente.
Esempio:
%2 = mpmd.fragment_call<mesh="m1",> origin=[] @my_fragment(%0, %1) :
(m<esh>_tensor..., m<esh>_te>nsor...) - m<esh>_tensor...
Tratti: HasParent<::mlir::func::FuncOp>, MemRefsNormalizable
Interfacce: ArgAndResultAttrsOpInterface, CallOpInterface, SymbolUserOpInterface
Attributi:
| Attributo | Tipo MLIR | Descrizione |
|---|---|---|
origin | ::mlir::ArrayAttr | array di informazioni sull'origine |
mesh_name | ::mlir::StringAttr | attributo stringa |
callee | ::mlir::FlatSymbolRefAttr | attributo di riferimento del simbolo di bemolle |
Operandi:
| Operando | Descrizione |
|---|---|
tensors |
variadico di tipo tensore mesh |
Risultati:
| Risultato | Descrizione |
|---|---|
| "senza nome" | variadico di tipo tensore mesh |
mpmd.named_computation (mpmd::NamedComputationOp)
Operazione di ambito denominato
Raggruppa un calcolo, ovvero un blocco di operazioni, e gli assegna un nome e un conteggio di trasposizione tramite l'attributo UserOrigin. Questa NamedComputation può essere utilizzata per assegnare una mesh al calcolo in MPMD o per le ottimizzazioni.
Il conteggio della trasposizione (valore predefinito=0) indica se il calcolo denominato è stato prodotto da un determinato numero di trasformazioni di trasposizione JAX AD.
La regione dell'operazione non deve avere variabili libere e il tipo di ogni argomento del blocco e valore restituito nella regione deve essere lo stesso del tipo degli input e del tipo restituito dell'operazione.
Tratti: IsolatedFromAbove, RecursiveMemoryEffects, RecursivelySpeculatableImplTrait, SingleBlockImplicitTerminator<ReturnOp>, SingleBlock
Interfacce: ConditionallySpeculatable
Attributi:
| Attributo | Tipo MLIR | Descrizione |
|---|---|---|
origin | ::mlir::mpmd::UserOriginAttr | Origine del calcolo specificato dall'utente. |
Operandi:
| Operando | Descrizione |
|---|---|
tensors |
variadico di tensore classificato di tipo float o booleano a 4/6/8/16/32/64 bit o intero a 2/4/8/16/32/64 bit o complesso con elementi float a 32/64 bit o valori interi quantizzati per tensore o token |
Risultati:
| Risultato | Descrizione |
|---|---|
results |
variadico di tensore classificato di tipo float o booleano a 4/6/8/16/32/64 bit o intero a 2/4/8/16/32/64 bit o complesso con elementi float a 32/64 bit o valori interi quantizzati per tensore o token |
mpmd.named_tensor (mpmd::NamedTensorOp)
Assegnare un tensore a una mesh
Sintassi:
operation ::= `mpmd.named_tensor` $tensor `name````=```$name attr-dict `:` type($result)
Un'operazione di identità che associa il risultato del tensore a un determinato nome. Questo NamedTensor può essere utilizzato per assegnare una mesh al tensore in MPMD.
Tratti: AlwaysSpeculatableImplTrait, SameOperandsAndResultType
Interfacce: ConditionallySpeculatable, InferTypeOpInterface, NoMemoryEffect (MemoryEffectOpInterface)
Effetti: MemoryEffects::Effect{}
Attributi:
| Attributo | Tipo MLIR | Descrizione |
|---|---|---|
name | ::mlir::StringAttr | attributo stringa |
Operandi:
| Operando | Descrizione |
|---|---|
tensor |
tensore di valori di qualsiasi tipo non token |
Risultati:
| Risultato | Descrizione |
|---|---|
result |
tensore di valori di qualsiasi tipo non token |
mpmd.reduce (mpmd::ReduceOp)
Operazione di riduzione cross-mesh
Sintassi:
operation ::= `mpmd.reduce` `` $reduction attr-dict $tensors `:` functional-type(operands, results)
Consente di ridurre un tensore su mesh diversi e poi trasmetterlo ovunque debba essere utilizzato.
Tratti: AlwaysSpeculatableImplTrait, SameOperandsAndResultType
Interfacce: ConditionallySpeculatable, NoMemoryEffect (MemoryEffectOpInterface)
Effetti: MemoryEffects::Effect{}
Attributi:
| Attributo | Tipo MLIR | Descrizione |
|---|---|---|
reduction | ::mlir::mpmd::ReductionAttr | Indica una riduzione. |
Operandi:
| Operando | Descrizione |
|---|---|
tensors |
variadico di tensore di valori di qualsiasi tipo non token |
Risultati:
| Risultato | Descrizione |
|---|---|
result |
tensore di valori di qualsiasi tipo non token |
mpmd.return (mpmd::ReturnOp)
L'operazione mpmd.return termina le regioni associate a mpmd
operazioni basate sulla regione. È variadica: accetta come argomenti un elenco di valori
i cui tipi possono essere qualsiasi (ma dello stesso tipo, ad es. AnyTensor) e
pertanto può essere riutilizzata a vari livelli dello stack IR MPMD.
Sintassi:
operation ::= `mpmd.return` attr-dict $results (`:` type($results)^)?
Tratti: AlwaysSpeculatableImplTrait, Terminator
Interfacce: ConditionallySpeculatable, NoMemoryEffect (MemoryEffectOpInterface)
Effetti: MemoryEffects::Effect{}
Operandi:
| Operando | Descrizione |
|---|---|
results |
variadico di qualsiasi tipo non token |
mpmd.transfer (mpmd::TransferOp)
Operazione di trasferimento
Sintassi:
operation ::= `mpmd.transfer` attr-dict $tensor `:` functional-type(operands, results)
Trasferisce un tensore distribuito da una mesh all'altra.
I nomi delle mesh dei tipi di operandi e risultati devono corrispondere alle mesh nella topologia e i loro tipi globali devono essere identici.
Tratti: AlwaysSpeculatableImplTrait, HasParent<::mlir::func::FuncOp>
Interfacce: ConditionallySpeculatable, NoMemoryEffect (MemoryEffectOpInterface), ShardingRuleOpInterface
Effetti: MemoryEffects::Effect{}
Operandi:
| Operando | Descrizione |
|---|---|
tensor |
mesh tensor type |
Risultati:
| Risultato | Descrizione |
|---|---|
result |
mesh tensor type |
mpmd.unassign (mpmd::UnassignOp)
Annulla assegnazione
Sintassi:
operation ::= `mpmd.unassign` attr-dict $tensor `:` functional-type(operands, results)
Annulla l'assegnazione di un tensore completamente replicato da una mesh.
Si tratta di un'operazione temporanea introdotta quando si riducono le operazioni Jax, per passare dai tipi locali ai tipi di mesh. Queste operazioni verranno eliminate durante l'importazione, quando gli input e i risultati dell'operazione func diventano tensori mesh.
Il nome del mesh del tipo di operando deve corrispondere a un mesh nella topologia e il suo tipo globale deve essere identico al tipo di risultato.
Tratti: AlwaysSpeculatableImplTrait, HasParent<::mlir::func::FuncOp, ForOp>, InferTensorType
Interfacce: ConditionallySpeculatable, InferShapedTypeOpInterface, InferTypeOpInterface, NoMemoryEffect (MemoryEffectOpInterface)
Effetti: MemoryEffects::Effect{}
Attributi:
| Attributo | Tipo MLIR | Descrizione |
|---|---|---|
origin | ::mlir::StringAttr | attributo stringa |
Operandi:
| Operando | Descrizione |
|---|---|
tensor |
mesh tensor type |
Risultati:
| Risultato | Descrizione |
|---|---|
result |
tensore di valori di qualsiasi tipo non token |
Attributi
MeshWithOriginsAttr
Mesh con le sue origini.
Sintassi:
#mpmd.mesh_with_origins<
::llvm::StringRef, # mesh_name
::llvm::ArrayRef<OriginAttr> # origins
>
Parametri:
| Parametro | Tipo C++ | Descrizione |
|---|---|---|
| mesh_name | ::llvm::StringRef |
mesh_name |
| origini | ::llvm::ArrayRef<OriginAttr> |
origini |
MeshesWithOriginsAttr
Un elenco di mesh con le relative origini.
Sintassi:
#mpmd.meshes_with_origins<
::llvm::ArrayRef<MeshWithOriginsAttr> # value
>
Parametri:
| Parametro | Tipo C++ | Descrizione |
|---|---|---|
| valore | ::llvm::ArrayRef<MeshWithOriginsAttr> |
NamedMeshAttr
Una coppia con un nome e una mesh.
Sintassi:
#mpmd.named_mesh<
::llvm::StringRef, # name
sdy::MeshAttr # mesh
>
Parametri:
| Parametro | Tipo C++ | Descrizione |
|---|---|---|
| nome | ::llvm::StringRef |
nome |
| mesh | sdy::MeshAttr |
mesh |
OriginAttr
Origine dell'assegnazione della mesh.
Sintassi:
#mpmd.origin<
::llvm::StringRef # origin_label
>
L'origine di un'assegnazione mesh.
origin_label è un'etichetta leggibile per l'origine.
È destinato all'uso per il debug.
Parametri:
| Parametro | Tipo C++ | Descrizione |
|---|---|---|
| origin_label | ::llvm::StringRef |
origin_label |
ReductionAttr
Indica una riduzione.
Sintassi:
#mpmd.reduction<
`none` | `add` | `max` | `min` | `mul` | `or` | `and` # reduction_type
>
Parametri:
| Parametro | Tipo C++ | Descrizione |
|---|---|---|
| reduction_type | ::mlir::mpmd::ReductionType |
un enum di tipo ReductionType |
TopologyAttr
Topologia delle mesh denominate.
Sintassi:
#mpmd.topology<
::llvm::ArrayRef<NamedMeshAttr> # meshes
>
Parametri:
| Parametro | Tipo C++ | Descrizione |
|---|---|---|
| meshes | ::llvm::ArrayRef<NamedMeshAttr> |
mesh di topologia |
UserOriginAttr
Origine del calcolo specificato dall'utente.
Sintassi:
#mpmd.user_origin<
::mlir::StringAttr, # userName
int64_t # transposeCount
>
Parametri:
| Parametro | Tipo C++ | Descrizione |
|---|---|---|
| userName | ::mlir::StringAttr |
|
| transposeCount | int64_t |
Tipi
MeshTensorType
Tipo di tensore mesh
Assegna un RankedTensorType a una mesh SPMD specifica nella topologia MPMD delle mesh del programma. Il tipo contiene uno sharding facoltativo che specifica come viene eseguito lo sharding del tensore rispetto alla mesh SPMD. Se lo sharding non è presente, il tensore viene replicato completamente.
Parametri:
| Parametro | Tipo C++ | Descrizione |
|---|---|---|
| mesh_name | ::llvm::StringRef |
nome mesh |
| ranked_tensor_type | ::mlir::RankedTensorType |
tipo di tensore con classificazione |
| partizionamento orizzontale | ::mlir::sdy::TensorShardingAttr |
|
| memory_kind | ::mlir::StringAttr |
Enum
ReductionType
Attributo Tipo di riduzione
Custodie:
| Simbolo | Valore | Stringa |
|---|---|---|
| kNone | 0 |
nessuno |
| kAdd | 1 |
add |
| kMax | 2 |
max |
| kMin | 3 |
min |
| kMul | 4 |
mul |
| kOr | 5 |
o |
| kAnd | 6 |
e |
EdgeNodeType
Enumerazione del tipo di nodo edge
Custodie:
| Simbolo | Valore | Stringa |
|---|---|---|
| OPERAND | 0 |
operando |
| RISULTATO | 1 |
risultato |
PropagationDirection
Enumerazione della direzione di propagazione
Custodie:
| Simbolo | Valore | Stringa |
|---|---|---|
| NESSUNO | 0 |
NESSUNO |
| AVANTI | 1 |
AVANTI |
| INDIETRO | 2 |
INDIETRO |
| ENTRAMBI | 3 |
ENTRAMBI |
ReductionOp
Enum. riduzione
Custodie:
| Simbolo | Valore | Stringa |
|---|---|---|
| SUM | 0 |
somma |
| MAX | 1 |
max |
| MIN | 2 |
min |