Dialetto "mpmd"

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:

AttributoTipo MLIRDescrizione
origin::mlir::StringAttrattributo 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:

AttributoTipo MLIRDescrizione
callee::mlir::FlatSymbolRefAttrattributo 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:

AttributoTipo MLIRDescrizione
iterations::mlir::IntegerAttrAttributo intero non firmato a 32 bit
unroll_factor::mlir::IntegerAttrAttributo 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:

AttributoTipo MLIRDescrizione
origin::mlir::ArrayAttrarray di informazioni sull'origine
mesh_name::mlir::StringAttrattributo stringa
stage_id::mlir::IntegerAttrAttributo intero senza segno a 64 bit
in_shardings::mlir::sdy::TensorShardingPerValueAttrSuddivisione dei tensori per operando/risultato di un'operazione
out_shardings::mlir::sdy::TensorShardingPerValueAttrSuddivisione 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:

AttributoTipo MLIRDescrizione
origin::mlir::ArrayAttrarray di informazioni sull'origine
mesh_name::mlir::StringAttrattributo stringa
callee::mlir::FlatSymbolRefAttrattributo 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:

AttributoTipo MLIRDescrizione
origin::mlir::mpmd::UserOriginAttrOrigine 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:

AttributoTipo MLIRDescrizione
name::mlir::StringAttrattributo 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:

AttributoTipo MLIRDescrizione
reduction::mlir::mpmd::ReductionAttrIndica 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:

AttributoTipo MLIRDescrizione
origin::mlir::StringAttrattributo 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