Di seguito vengono descritte le semantiche delle operazioni definite nell'interfaccia
XlaBuilder. In genere, queste operazioni vengono mappate uno a uno alle operazioni definite nell'interfaccia RPC in
xla_data.proto.
Una nota sulla nomenclatura: il tipo di dati generalizzato XLA gestisce un array N-dimensionale contenente elementi di un tipo uniforme (ad esempio float a 32 bit). In tutta la documentazione, array viene utilizzato per indicare un array di dimensioni arbitrarie. Per comodità, i casi speciali hanno nomi più specifici e familiari; ad esempio, un vettore è un array unidimensionale e una matrice è un array bidimensionale.
Scopri di più sulla struttura di un'app in Forme e layout e Layout a mosaico.
Addominali
Vedi anche
XlaBuilder::Abs.
Element-wise abs x -> |x|.
Abs(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Per informazioni su StableHLO, vedi StableHLO - abs.
Aggiungi
Vedi anche
XlaBuilder::Add.
Esegue l'addizione elemento per elemento di lhs e rhs.
Add(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto per la trasmissione in dimensioni diverse per Aggiungi:
Add(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, vedi StableHLO - add.
AddDependency
Vedi anche
HloInstruction::AddDependency.
AddDependency può essere visualizzato nei dump HLO, ma non è destinato a essere
creato manualmente dagli utenti finali.
AfterAll
Vedi anche
XlaBuilder::AfterAll.
AfterAll accetta un numero variabile di token e produce un singolo token. I token
sono tipi primitivi che possono essere inseriti tra operazioni con effetti collaterali per
imporre l'ordinamento. AfterAll può essere utilizzato come unione di token per ordinare un'operazione dopo una serie di operazioni.
AfterAll(tokens)
| Argomenti | Tipo | Semantica |
|---|---|---|
tokens |
vettore di XlaOp |
numero variabile di token |
Per informazioni su StableHLO, vedi StableHLO - after_all.
AllGather
Vedi anche
XlaBuilder::AllGather.
Esegue la concatenazione tra le repliche.
AllGather(operand, all_gather_dimension, shard_count, replica_groups,
channel_id, layout, use_global_device_ids)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand
|
XlaOp
|
Array da concatenare tra le repliche |
all_gather_dimension |
int64 |
Dimensione di concatenazione |
shard_count
|
int64
|
Le dimensioni di ogni gruppo di repliche |
replica_groups
|
vettore di vettori di
int64 |
Gruppi tra cui viene eseguita la concatenazione |
channel_id
|
facoltativo
ChannelHandle |
ID canale facoltativo per la comunicazione tra moduli |
layout
|
facoltativo Layout
|
Crea un pattern di layout che acquisisce il layout corrispondente nell'argomento |
use_global_device_ids
|
facoltativo bool
|
Restituisce true se gli ID nella configurazione ReplicaGroup rappresentano un ID globale |
replica_groupsè un elenco di gruppi di repliche tra cui viene eseguita la concatenazione (l'ID replica per la replica corrente può essere recuperato utilizzandoReplicaId). L'ordine delle repliche in ogni gruppo determina l'ordine in cui si trovano i relativi input nel risultato.replica_groupsdeve essere vuoto (nel qual caso tutte le repliche appartengono a un unico gruppo, ordinato da0aN - 1) o contenere lo stesso numero di elementi del numero di repliche. Ad esempio,replica_groups = {0, 2}, {1, 3}esegue la concatenazione tra le repliche0e2e1e3.shard_countè la dimensione di ogni gruppo di repliche. Ciò è necessario nei casi in cuireplica_groupssono vuoti.channel_idviene utilizzato per la comunicazione tra moduli: solo le operazioniall-gathercon lo stessochannel_idpossono comunicare tra loro.use_global_device_idsRestituisce true se gli ID nella configurazione ReplicaGroup rappresentano un ID globale di (replica_id * partition_count + partition_id) anziché un ID replica. Ciò consente un raggruppamento più flessibile dei dispositivi se questa riduzione collettiva è sia cross-partition che cross-replica.
La forma di output è la forma di input con il all_gather_dimension reso
shard_count volte più grande. Ad esempio, se ci sono due repliche e l'operando ha il valore [1.0, 2.5] e [3.0, 5.25] rispettivamente sulle due repliche, il valore di output di questa operazione in cui all_gather_dim è 0 sarà [1.0, 2.5, 3.0,5.25] su entrambe le repliche.
L'API di AllGather viene scomposta internamente in due istruzioni HLO
(AllGatherStart e AllGatherDone).
Vedi anche
HloInstruction::CreateAllGatherStart.
AllGatherStart, AllGatherDone fungono da primitive in HLO. Queste operazioni potrebbero
essere visualizzate nei dump HLO, ma non sono destinate a essere create manualmente dagli utenti
finali.
Per informazioni su StableHLO, vedi StableHLO - all_gather.
AllReduce
Vedi anche
XlaBuilder::AllReduce.
Esegue un calcolo personalizzato tra le repliche.
AllReduce(operand, computation, replica_groups, channel_id,
shape_with_layout, use_global_device_ids)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand
|
XlaOp
|
Matrice o tupla non vuota di matrici da ridurre tra le repliche |
computation |
XlaComputation |
Calcolo della riduzione |
replica_groups
|
Vettore ReplicaGroup
|
Gruppi tra cui vengono eseguite le riduzioni |
channel_id
|
facoltativo
ChannelHandle |
ID canale facoltativo per la comunicazione tra moduli |
shape_with_layout
|
facoltativo Shape
|
Definisce il layout dei dati trasferiti |
use_global_device_ids
|
facoltativo bool
|
Restituisce true se gli ID nella configurazione ReplicaGroup rappresentano un ID globale |
- Quando
operandè una tupla di array, la riduzione viene eseguita su ciascun elemento della tupla. replica_groupsè un elenco di gruppi di repliche tra cui viene eseguita la riduzione (l'ID replica per la replica corrente può essere recuperato utilizzandoReplicaId).replica_groupsdeve essere vuoto (nel qual caso tutte le repliche appartengono a un unico gruppo) o contenere lo stesso numero di elementi del numero di repliche. Ad esempio,replica_groups = {0, 2}, {1, 3}esegue la riduzione tra le repliche0e2e1e3.channel_idviene utilizzato per la comunicazione tra moduli: solo le operazioniall-reducecon lo stessochannel_idpossono comunicare tra loro.shape_with_layout: forza il layout di AllReduce al layout specificato. Questo attributo viene utilizzato per garantire lo stesso layout per un gruppo di operazioni AllReduce compilate separatamente.use_global_device_idsRestituisce true se gli ID nella configurazione ReplicaGroup rappresentano un ID globale di (replica_id * partition_count + partition_id) anziché un ID replica. Ciò consente un raggruppamento più flessibile dei dispositivi se questa riduzione collettiva è sia cross-partition che cross-replica.
La forma dell'output è uguale a quella dell'input. Ad esempio, se ci sono due repliche e l'operando ha il valore [1.0, 2.5] e [3.0, 5.25] rispettivamente sulle due repliche, il valore di output di questa operazione e il calcolo della somma sarà [4.0, 7.75] su entrambe le repliche. Se l'input è una
tupla, anche l'output è una tupla.
Il calcolo del risultato di AllReduce richiede un input da ogni replica,
quindi se una replica esegue un nodo AllReduce più volte di un'altra, la
prima replica attenderà per sempre. Poiché le repliche eseguono tutte lo stesso programma, non ci sono molti modi in cui ciò può accadere, ma è possibile quando la condizione di un ciclo while dipende dai dati di infeed e i dati di infeed fanno sì che il ciclo while venga iterato più volte su una replica rispetto a un'altra.
L'API di AllReduce viene scomposta internamente in due istruzioni HLO
(AllReduceStart e AllReduceDone).
Vedi anche
HloInstruction::CreateAllReduceStart.
AllReduceStart e AllReduceDone fungono da primitive in HLO. Queste operazioni potrebbero
essere visualizzate nei dump HLO, ma non sono destinate a essere create manualmente dagli utenti
finali.
CrossReplicaSum
Vedi anche
XlaBuilder::CrossReplicaSum.
Esegue AllReduce con un calcolo di somma.
CrossReplicaSum(operand, replica_groups)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand
|
XlaOp | Matrice o tupla non vuota di matrici da ridurre tra le repliche |
replica_groups
|
vettore di vettori di
int64 |
Gruppi tra cui vengono eseguite le riduzioni |
Restituisce la somma del valore dell'operando all'interno di ogni sottogruppo di repliche. Tutte le repliche forniscono un input alla somma e tutte le repliche ricevono la somma risultante per ogni sottogruppo.
AllToAll
Vedi anche
XlaBuilder::AllToAll.
AllToAll è un'operazione collettiva che invia dati da tutti i core a tutti i core. È composta da due fasi:
- La fase di dispersione. Su ogni core, l'operando viene suddiviso in
split_countblocchi lungosplit_dimensionse i blocchi vengono distribuiti a tutti i core, ad esempio l'i-esimo blocco viene inviato all'i-esimo core. - La fase di raccolta. Ogni core concatena i blocchi ricevuti lungo
concat_dimension.
I core partecipanti possono essere configurati in base a:
replica_groups: ogni ReplicaGroup contiene un elenco di ID replica che partecipano al calcolo (l'ID replica per la replica corrente può essere recuperato utilizzandoReplicaId). AllToAll verrà applicato all'interno dei sottogruppi nell'ordine specificato. Ad esempio,replica_groups = { {1,2,3}, {4,5,0} }significa che verrà applicato un AllToAll all'interno delle repliche{1, 2, 3}e nella fase di raccolta, e i blocchi ricevuti verranno concatenati nello stesso ordine di 1, 2, 3. Quindi, verrà applicato un altro AllToAll all'interno delle repliche 4, 5, 0 e l'ordine di concatenazione è anche 4, 5, 0. Sereplica_groupsè vuoto, tutte le repliche appartengono a un unico gruppo, nell'ordine di concatenazione della loro visualizzazione.
Prerequisiti:
- La dimensione della dimensione dell'operando su
split_dimensionè divisibile persplit_count. - La forma dell'operando non è una tupla.
AllToAll(operand, split_dimension, concat_dimension, split_count,
replica_groups, layout, channel_id)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
array di input n-dimensionale |
split_dimension
|
int64
|
Un valore nell'intervallo
[0,n) che denomina la
dimensione lungo la quale
viene suddiviso l'operando |
concat_dimension
|
int64
|
Un valore nell'intervallo
[0,n) che denomina la
dimensione lungo la quale
vengono concatenati i
blocchi di suddivisione |
split_count
|
int64
|
Il numero di core che
partecipano a questa
operazione. Se
replica_groups è vuoto,
deve corrispondere al numero di
repliche; altrimenti, deve
essere uguale al numero di
repliche in ogni gruppo. |
replica_groups
|
ReplicaGroupvettore
|
Ogni gruppo contiene un elenco di ID replica. |
layout |
facoltativo Layout |
layout di memoria specificato dall'utente |
channel_id
|
facoltativo ChannelHandle
|
identificatore univoco per ogni coppia invio/ricezione |
Per saperne di più su forme e layout, consulta xla::shapes.
Per informazioni su StableHLO, vedi StableHLO - all_to_all.
AllToAll - Esempio 1.
XlaBuilder b("alltoall");
auto x = Parameter(&b, 0, ShapeUtil::MakeShape(F32, {4, 16}), "x");
AllToAll(
x,
/*split_dimension=*/ 1,
/*concat_dimension=*/ 0,
/*split_count=*/ 4);

Nell'esempio precedente, ci sono 4 core che partecipano all'operazione Alltoall. Su ogni core, l'operando viene suddiviso in 4 parti lungo la dimensione 1, quindi ogni parte ha forma f32[4,4]. Le 4 parti sono distribuite a tutti i core. Poi ogni core concatena le parti ricevute lungo la dimensione 0, nell'ordine dei core 0-4. Pertanto, l'output su ogni core ha forma f32[16,4].
AllToAll - Esempio 2 - StableHLO
Nell'esempio precedente, ci sono due repliche che partecipano all'operazione AllToAll. Su ogni replica, l'operando ha forma f32[2,4]. L'operando viene suddiviso in due parti lungo la dimensione 1, quindi ogni parte ha forma f32[2,2]. Le due parti vengono poi scambiate tra le repliche in base alla loro posizione nel gruppo di repliche. Ogni replica raccoglie la parte corrispondente da entrambi gli operandi e li concatena lungo la dimensione 0. Di conseguenza, l'output di ogni replica ha forma f32[4,2].
RaggedAllToAll
Vedi anche
XlaBuilder::RaggedAllToAll.
RaggedAllToAll esegue un'operazione collettiva all-to-all, in cui l'input e l'output sono tensori irregolari.
RaggedAllToAll(input, input_offsets, send_sizes, output, output_offsets,
recv_sizes, replica_groups, channel_id)
| Argomenti | Tipo | Semantica |
|---|---|---|
input |
XlaOp |
Array N di tipo T |
input_offsets |
XlaOp |
Array N di tipo T |
send_sizes |
XlaOp |
Array N di tipo T |
output |
XlaOp |
Array N di tipo T |
output_offsets |
XlaOp |
Array N di tipo T |
recv_sizes |
XlaOp |
Array N di tipo T |
replica_groups
|
Vettore ReplicaGroup
|
Ogni gruppo contiene un elenco di ID replica. |
channel_id
|
facoltativo ChannelHandle
|
identificatore univoco per ogni coppia invio/ricezione |
I tensori irregolari sono definiti da un insieme di tre tensori:
data: il tensoredataè "irregolare" lungo la sua dimensione più esterna, lungo la quale ogni elemento indicizzato ha dimensioni variabili.offsets: il tensoreoffsetsindicizza la dimensione più esterna del tensoredatae rappresenta l'offset iniziale di ogni elemento irregolare del tensoredata.sizes: il tensoresizesrappresenta la dimensione di ogni elemento irregolare del tensoredata, dove la dimensione è specificata in unità di elementi secondari. Un sottoelemento è definito come il suffisso della forma del tensore "data" ottenuto rimuovendo la dimensione "irregolare" più esterna.- I tensori
offsetsesizesdevono avere le stesse dimensioni.
Esempio di tensore irregolare:
data: [8,3] =
{ {a,b,c},{d,e,f},{g,h,i},{j,k,l},{m,n,o},{p,q,r},{s,t,u},{v,w,x} }
offsets: [3] = {0, 1, 4}
sizes: [3] = {1, 3, 4}
// Index 'data' at 'offsets'[0], 'sizes'[0]' // {a,b,c}
// Index 'data' at 'offsets'[1], 'sizes'[1]' // {d,e,f},{g,h,i},{j,k,l}
// Index 'data' at 'offsets'[2], 'sizes'[2]' // {m,n,o},{p,q,r},{s,t,u},{v,w,x}
output_offsets deve essere partizionato in modo che ogni replica abbia offset nella
prospettiva di output della replica di destinazione.
Per l'offset di output i-esimo, la replica corrente invierà
l'aggiornamento input[input_offsets[i]:input_offsets[i]+input_sizes[i]] alla replica
i-esima che verrà scritto in
output_i[output_offsets[i]:output_offsets[i]+send_sizes[i]] nella replica
output-esima.i
Ad esempio, se abbiamo due repliche:
replica 0:
input: [1, 2, 2]
output:[0, 0, 0, 0]
input_offsets: [0, 1]
send_sizes: [1, 2]
output_offsets: [0, 0]
recv_sizes: [1, 1]
replica 1:
input: [3, 4, 0]
output: [0, 0, 0, 0]
input_offsets: [0, 1]
send_sizes: [1, 1]
output_offsets: [1, 2]
recv_sizes: [2, 1]
// replica 0's result will be: [1, 3, 0, 0]
// replica 1's result will be: [2, 2, 4, 0]
L'HLO ragged all-to-all ha i seguenti argomenti:
input: tensore dei dati di input irregolare.output: tensore di dati di output irregolare.input_offsets: tensore degli offset di input irregolari.send_sizes: tensore delle dimensioni di invio irregolari.output_offsets: array di offset irregolari nell'output della replica di destinazione.recv_sizes: tensore delle dimensioni di ricezione irregolari.
I tensori *_offsets e *_sizes devono avere tutti la stessa forma.
Per i tensori *_offsets e *_sizes sono supportate due forme:
[num_devices]dove ragged-all-to-all può inviare al massimo un aggiornamento a ogni dispositivo remoto nel gruppo di repliche. Ad esempio:
for (remote_device_id : replica_group) {
SEND input[input_offsets[remote_device_id]],
output[output_offsets[remote_device_id]],
send_sizes[remote_device_id] }
[num_devices, num_updates]dove ragged-all-to-all può inviare fino anum_updatesaggiornamenti allo stesso dispositivo remoto (ciascuno con offset diversi), per ogni dispositivo remoto nel gruppo di repliche.
Ad esempio:
for (remote_device_id : replica_group) {
for (update_idx : num_updates) {
SEND input[input_offsets[remote_device_id][update_idx]],
output[output_offsets[remote_device_id][update_idx]]],
send_sizes[remote_device_id][update_idx] } }
E
Vedi anche
XlaBuilder::And.
Esegue l'operazione AND elemento per elemento di due tensori lhs e rhs.
And(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto della trasmissione di dimensioni diverse per And:
And(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, vedi StableHLO - and.
Asinc
Vedi anche HloInstruction::CreateAsyncStart,
HloInstruction::CreateAsyncUpdate,
HloInstruction::CreateAsyncDone.
AsyncDone, AsyncStart e AsyncUpdate sono istruzioni HLO interne utilizzate
per le operazioni asincrone e fungono da primitive in HLO. Queste operazioni potrebbero essere visualizzate
nei dump HLO, ma non sono destinate a essere create manualmente dagli utenti finali.
Atan2
Vedi anche
XlaBuilder::Atan2.
Esegue l'operazione atan2 elemento per elemento su lhs e rhs.
Atan2(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto della trasmissione multidimensionale per Atan2:
Atan2(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, vedi StableHLO - atan2.
BatchNormGrad
Per una descrizione dettagliata dell'algoritmo, consulta anche
XlaBuilder::BatchNormGrad
e l'articolo originale sulla normalizzazione batch.
Calcola i gradienti della normalizzazione batch.
BatchNormGrad(operand, scale, batch_mean, batch_var, grad_output, epsilon,
feature_index)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp | Array n-dimensionale da normalizzare (x) |
scale |
XlaOp | Array unidimensionale (\(\gamma\)) |
batch_mean |
XlaOp | Array unidimensionale (\(\mu\)) |
batch_var |
XlaOp | Array unidimensionale (\(\sigma^2\)) |
grad_output |
XlaOp | Gradienti passati a BatchNormTraining (\(\nabla y\)) |
epsilon |
float |
Valore epsilon (\(\epsilon\)) |
feature_index |
int64 |
Indice della dimensione della funzionalità in operand |
Per ogni caratteristica nella dimensione delle caratteristiche (feature_index è l'indice della dimensione delle caratteristiche in operand), l'operazione calcola i gradienti rispetto a operand, offset e scale in tutte le altre dimensioni. feature_index deve essere un indice valido per la dimensione della funzionalità in operand.
I tre gradienti sono definiti dalle seguenti formule (supponendo un array
quadridimensionale come operand e con indice di dimensione della funzionalità l, dimensione
batch m e dimensioni spaziali w e h):
\[ \begin{split} c_l&= \frac{1}{mwh}\sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h \left( \nabla y_{ijkl} \frac{x_{ijkl} - \mu_l}{\sigma^2_l+\epsilon} \right) \\\\ d_l&= \frac{1}{mwh}\sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h \nabla y_{ijkl} \\\\ \nabla x_{ijkl} &= \frac{\gamma_{l} }{\sqrt{\sigma^2_{l}+\epsilon} } \left( \nabla y_{ijkl} - d_l - c_l (x_{ijkl} - \mu_{l}) \right) \\\\ \nabla \gamma_l &= \sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h \left( \nabla y_{ijkl} \frac{x_{ijkl} - \mu_l}{\sqrt{\sigma^2_{l}+\epsilon} } \right) \\\\\ \nabla \beta_l &= \sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h \nabla y_{ijkl} \end{split} \]
Gli input batch_mean e batch_var rappresentano i valori dei momenti nelle dimensioni batch e spaziali.
Il tipo di output è una tupla di tre handle:
| Output | Tipo | Semantica |
|---|---|---|
grad_operand
|
XlaOp | gradiente rispetto
all'input operand
(\(\nabla x\)) |
grad_scale
|
XlaOp | gradiente rispetto all'input **scale **
(\(\nabla\gamma\)) |
grad_offset
|
XlaOp | gradiente rispetto
all'input
offset(\(\nabla\beta\)) |
Per informazioni su StableHLO, vedi StableHLO - batch_norm_grad.
BatchNormInference
Per una descrizione dettagliata dell'algoritmo, consulta anche
XlaBuilder::BatchNormInference
e l'articolo originale sulla normalizzazione batch.
Normalizza un array in base alle dimensioni batch e spaziali.
BatchNormInference(operand, scale, offset, mean, variance, epsilon,
feature_index)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp | Array n-dimensionale da normalizzare |
scale |
XlaOp | Array unidimensionale |
offset |
XlaOp | Array unidimensionale |
mean |
XlaOp | Array unidimensionale |
variance |
XlaOp | Array unidimensionale |
epsilon |
float |
Valore epsilon |
feature_index |
int64 |
Indice della dimensione della funzionalità in operand |
Per ogni caratteristica nella dimensione delle caratteristiche (feature_index è l'indice della dimensione delle caratteristiche in operand), l'operazione calcola la media e la varianza in tutte le altre dimensioni e utilizza la media e la varianza per normalizzare ogni elemento in operand. feature_index deve essere un indice valido per la dimensione
della funzionalità in operand.
BatchNormInference è equivalente alla chiamata di BatchNormTraining senza
calcolare mean e variance per ogni batch. Utilizza invece mean e
variance come valori stimati. Lo scopo di questa operazione è ridurre
la latenza nell'inferenza, da cui il nome BatchNormInference.
L'output è un array normalizzato n-dimensionale con la stessa forma dell'input
operand.
Per informazioni su StableHLO, vedi StableHLO - batch_norm_inference.
BatchNormTraining
Vedi anche
XlaBuilder::BatchNormTraining
e the original batch normalization paper
per una descrizione dettagliata dell'algoritmo.
Normalizza un array in base alle dimensioni batch e spaziali.
BatchNormTraining(operand, scale, offset, epsilon, feature_index)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
Array n-dimensionale da normalizzare (x) |
scale |
XlaOp |
Array unidimensionale (\(\gamma\)) |
offset |
XlaOp |
Array unidimensionale (\(\beta\)) |
epsilon |
float |
Valore epsilon (\(\epsilon\)) |
feature_index |
int64 |
Indice della dimensione della funzionalità in operand |
Per ogni caratteristica nella dimensione delle caratteristiche (feature_index è l'indice della dimensione delle caratteristiche in operand), l'operazione calcola la media e la varianza in tutte le altre dimensioni e utilizza la media e la varianza per normalizzare ogni elemento in operand. feature_index deve essere un indice valido per la dimensione
della funzionalità in operand.
L'algoritmo funziona nel seguente modo per ogni batch in operand \(x\) che contiene m
elementi con w e h come dimensioni spaziali (supponendo che operand
sia un array quadridimensionale):
Calcola la media del batch \(\mu_l\) per ogni caratteristica
lnella dimensione della caratteristica: \(\mu_l=\frac{1}{mwh}\sum_{i=1}^m\sum_{j=1}^w\sum_{k=1}^h x_{ijkl}\)Calcola la varianza del batch \(\sigma^2_l\): $\sigma^2l=\frac{1}{mwh}\sum{i=1}^m\sum{j=1}^w\sum{k=1}^h (x_{ijkl} - \mu_l)^2$
Normalizza, scala e sposta: \(y_{ijkl}=\frac{\gamma_l(x_{ijkl}-\mu_l)}{\sqrt[2]{\sigma^2_l+\epsilon} }+\beta_l\)
Il valore epsilon, in genere un numero piccolo, viene aggiunto per evitare errori di divisione per zero.
Il tipo di output è una tupla di tre XlaOp:
| Output | Tipo | Semantica |
|---|---|---|
output
|
XlaOp
|
Array n-dimensionale con la stessa forma dell'input
operand (y) |
batch_mean |
XlaOp |
Array unidimensionale (\(\mu\)) |
batch_var |
XlaOp |
Array unidimensionale (\(\sigma^2\)) |
batch_mean e batch_var sono momenti calcolati in base alle dimensioni batch e spaziali utilizzando le formule riportate sopra.
Per informazioni su StableHLO, vedi StableHLO - batch_norm_training.
Bitcast
Vedi anche
HloInstruction::CreateBitcast.
Bitcast può essere visualizzato nei dump HLO, ma non è destinato a essere costruito
manualmente dagli utenti finali.
BitcastConvertType
Vedi anche
XlaBuilder::BitcastConvertType.
Simile a un tf.bitcast in TensorFlow, esegue un'operazione bitcast element-wise da una forma di dati a una forma di destinazione. Le dimensioni dell'input e dell'output devono
corrispondere: ad esempio, s32 elementi diventano f32 elementi tramite la routine bitcast e un
elemento s32 diventerà quattro elementi s8. Bitcast viene implementato come
trasmissione di basso livello, quindi le macchine con rappresentazioni in virgola mobile diverse
daranno risultati diversi.
BitcastConvertType(operand, new_element_type)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
array di tipo T con dimensioni D |
new_element_type |
PrimitiveType |
tipo U |
Le dimensioni dell'operando e della forma di destinazione devono corrispondere, a parte l'ultima dimensione, che cambierà in base al rapporto tra le dimensioni primitive prima e dopo la conversione.
I tipi di elementi di origine e di destinazione non devono essere tuple.
Per informazioni su StableHLO, vedi StableHLO - bitcast_convert.
Bitcast: conversione in tipo primitivo di larghezza diversa
BitcastConvert L'istruzione HLO supporta il caso in cui la dimensione del tipo di elemento di output T' non è uguale alla dimensione dell'elemento di input T. Poiché l'intera operazione è concettualmente un bitcast e non modifica i byte sottostanti, la forma dell'elemento di output deve cambiare. Per B = sizeof(T), B' =
sizeof(T'), esistono due possibili casi.
Innanzitutto, quando B > B', la forma di output acquisisce una nuova dimensione secondaria di dimensione
B/B'. Ad esempio:
f16[10,2]{1,0} %output = f16[10,2]{1,0} bitcast-convert(f32[10]{0} %input)
La regola rimane invariata per gli scalari effettivi:
f16[2]{0} %output = f16[2]{0} bitcast-convert(f32[] %input)
In alternativa, per B' > B l'istruzione richiede che l'ultima dimensione logica
della forma di input sia uguale a B'/B e questa dimensione viene eliminata durante
la conversione:
f32[10]{0} %output = f32[10]{0} bitcast-convert(f16[10,2]{1,0} %input)
Tieni presente che le conversioni tra diverse larghezze di bit non sono elementwise.
Trasmissione
Vedi anche
XlaBuilder::Broadcast.
Aggiunge dimensioni a un array duplicando i dati nell'array.
Broadcast(operand, broadcast_sizes)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'array da duplicare |
broadcast_sizes |
ArraySlice<int64> |
Le dimensioni delle nuove dimensioni |
Le nuove dimensioni vengono inserite a sinistra, ovvero se broadcast_sizes ha
valori {a0, ..., aN} e la forma dell'operando ha dimensioni {b0, ..., bM}, allora
la forma dell'output ha dimensioni {a0, ..., aN, b0, ..., bM}.
I nuovi indici di dimensione nelle copie dell'operando, ovvero
output[i0, ..., iN, j0, ..., jM] = operand[j0, ..., jM]
Ad esempio, se operand è uno scalare f32 con valore 2.0f e
broadcast_sizes è {2, 3}, il risultato sarà un array con forma
f32[2, 3] e tutti i valori nel risultato saranno 2.0f.
Per informazioni su StableHLO, vedi StableHLO - broadcast.
BroadcastInDim
Vedi anche
XlaBuilder::BroadcastInDim.
Aumenta le dimensioni e il numero di dimensioni di un array duplicando i dati nell'array.
BroadcastInDim(operand, out_dim_size, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'array da duplicare |
out_dim_size
|
ArraySlice<int64>
|
Le dimensioni delle dimensioni della forma target |
broadcast_dimensions
|
ArraySlice<int64>
|
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Simile a Trasmissione, ma consente di aggiungere dimensioni ovunque ed espandere le dimensioni esistenti con dimensione 1.
operand viene trasmesso alla forma descritta da out_dim_size.
broadcast_dimensions mappa le dimensioni di operand alle dimensioni della
forma di destinazione, ovvero la i-esima dimensione dell'operando viene mappata alla
i-esima dimensione di broadcast_dimension della forma di output. Le dimensioni di
operand devono avere dimensione 1 o le stesse dimensioni della dimensione nella forma di output a cui sono mappate. Le dimensioni rimanenti vengono riempite con dimensioni di
dimensione 1. La trasmissione delle dimensioni degenerate viene quindi eseguita lungo queste dimensioni degenerate per raggiungere la forma di output. La semantica è descritta in dettaglio nella
pagina di trasmissione.
Chiama
Vedi anche
XlaBuilder::Call.
Richiama un calcolo con gli argomenti specificati.
Call(computation, operands...)
| Argomenti | Tipo | Semantica |
|---|---|---|
computation
|
XlaComputation
|
calcolo di tipo T_0, T_1, ...,
T_{N-1} -> S con N parametri di
tipo arbitrario |
operands |
sequenza di N XlaOp |
N argomenti di tipo arbitrario |
L'arità e i tipi di operands devono corrispondere ai parametri di computation. È consentito non avere operands.
CompositeCall
Vedi anche
XlaBuilder::CompositeCall.
Incapsula un'operazione composta da altre operazioni StableHLO, che accetta input e composite_attributes e produce risultati. La semantica dell'operazione viene implementata dall'attributo di decomposizione. L'operazione composita può essere sostituita dalla sua decomposizione senza modificare la semantica del programma. Nei casi in cui l'incorporamento della scomposizione non fornisce la stessa semantica dell'operazione, preferisci utilizzare custom_call.
Il campo della versione (il valore predefinito è 0) viene utilizzato per indicare quando la semantica di un composito cambia.
Questa operazione viene implementata come kCall con l'attributo is_composite=true. Il campo
decomposition è specificato dall'attributo computation. Gli attributi
frontend memorizzano gli attributi rimanenti con il prefisso composite..
Esempio di operazione CompositeCall:
f32[] call(f32[] %cst), to_apply=%computation, is_composite=true,
frontend_attributes = {
composite.name="foo.bar",
composite.attributes={n = 1 : i32, tensor = dense<1> : tensor<i32>},
composite.version="1"
}
CompositeCall(computation, operands..., name, attributes, version)
| Argomenti | Tipo | Semantica |
|---|---|---|
computation
|
XlaComputation
|
calcolo di tipo T_0, T_1, ...,
T_{N-1} -> S con N parametri di
tipo arbitrario |
operands |
sequenza di N XlaOp |
numero variabile di valori |
name |
string |
nome del composito |
attributes
|
facoltativo string
|
dizionario facoltativo di attributi in formato stringa |
version
|
facoltativo int64
|
number to version updates to semantics of the composite op |
L'operazione decomposition non è un campo chiamato, ma viene visualizzata come attributo to_apply
che punta alla funzione che contiene l'implementazione
di livello inferiore, ovvero to_apply=%funcname
Per ulteriori informazioni su composizione e scomposizione, consulta la specifica StableHLO.
Cbrt
Vedi anche
XlaBuilder::Cbrt.
Operazione di radice cubica elemento per elemento x -> cbrt(x).
Cbrt(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Cbrt supporta anche l'argomento facoltativo result_accuracy:
Cbrt(operand, result_accuracy)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
result_accuracy
|
facoltativo ResultAccuracy
|
I tipi di precisione che l'utente può richiedere per le operazioni unarie con più implementazioni |
Per ulteriori informazioni su result_accuracy, consulta
Accuratezza dei risultati.
Per informazioni su StableHLO, vedi StableHLO - cbrt.
Ceil
Vedi anche
XlaBuilder::Ceil.
Element-wise ceil x -> ⌈x⌉.
Ceil(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Per informazioni su StableHLO, consulta StableHLO - ceil.
Cholesky
Vedi anche
XlaBuilder::Cholesky.
Calcola la decomposizione di Cholesky di un batch di matrici definite positive simmetriche (hermitiane).
Cholesky(a, lower)
| Argomenti | Tipo | Semantica |
|---|---|---|
a
|
XlaOp
|
un array di tipo complesso o in virgola mobile con più di due dimensioni. |
lower |
bool |
se utilizzare il triangolo superiore o inferiore di a. |
Se lower è true, calcola le matrici triangolari inferiori l in modo che $a = l .
l^T$. Se lower è false, calcola le matrici triangolari superiori u in modo che
\(a = u^T . u\).
I dati di input vengono letti solo dal triangolo inferiore/superiore di a, a seconda del
valore di lower. I valori dell'altro triangolo vengono ignorati. I dati di output vengono restituiti nello stesso triangolo; i valori nell'altro triangolo sono definiti dall'implementazione e possono essere qualsiasi valore.
Se a ha più di 2 dimensioni, a viene trattato come un batch di matrici,
in cui tutte le dimensioni, tranne le due minori, sono dimensioni batch.
Se a non è simmetrica (hermitiana) definita positiva, il risultato è
definito dall'implementazione.
Per informazioni su StableHLO, vedi StableHLO - cholesky.
Clamp
Vedi anche
XlaBuilder::Clamp.
Limita un operando all'intervallo compreso tra un valore minimo e uno massimo.
Clamp(min, operand, max)
| Argomenti | Tipo | Semantica |
|---|---|---|
min |
XlaOp |
array di tipo T |
operand |
XlaOp |
array di tipo T |
max |
XlaOp |
array di tipo T |
Dato un operando e i valori minimo e massimo, restituisce l'operando se rientra nell'intervallo tra il minimo e il massimo, altrimenti restituisce il valore minimo se l'operando è inferiore a questo intervallo o il valore massimo se l'operando è superiore a questo intervallo. ovvero clamp(a, x, b) = min(max(a, x), b).
Tutti e tre gli array devono avere la stessa forma. In alternativa, in quanto forma limitata di trasmissione, min e/o max possono essere uno scalare di tipo T.
Esempio con scalari min e max:
let operand: s32[3] = {-1, 5, 9};
let min: s32 = 0;
let max: s32 = 6;
==>
Clamp(min, operand, max) = s32[3]{0, 5, 6};
Per informazioni su StableHLO, vedi StableHLO - clamp.
Comprimi
Vedi anche
XlaBuilder::Collapse.
e l'operazione tf.reshape.
Comprime le dimensioni di un array in una sola dimensione.
Collapse(operand, dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
array di tipo T |
dimensions |
int64 vector |
sottoinsieme consecutivo e in ordine delle dimensioni di T. |
Collapse sostituisce il sottoinsieme specificato delle dimensioni dell'operando con una singola
dimensione. Gli argomenti di input sono un array arbitrario di tipo T e un
vettore costante in fase di compilazione di indici di dimensione. Gli indici delle dimensioni devono essere
un sottoinsieme consecutivo e in ordine (numeri delle dimensioni dal più basso al più alto) delle dimensioni di T. Pertanto, {0, 1, 2}, {0, 1} o {1, 2} sono tutti set di dimensioni validi, ma
{1, 0} o {0, 2} non lo sono. Vengono sostituite da una singola nuova dimensione, nella
stessa posizione nella sequenza delle dimensioni di quelle che sostituiscono, con la nuova
dimensione uguale al prodotto delle dimensioni originali. Il numero di dimensione più basso in dimensions è la dimensione con la variazione più lenta (la più importante) nel nido di cicli che comprime queste dimensioni, mentre il numero di dimensione più alto è la dimensione con la variazione più rapida (la meno importante). Consulta l'operatore tf.reshape se è necessario un ordinamento
di compressione più generale.
Ad esempio, sia v un array di 24 elementi:
let v = f32[4x2x3] { { {10, 11, 12}, {15, 16, 17} },
{ {20, 21, 22}, {25, 26, 27} },
{ {30, 31, 32}, {35, 36, 37} },
{ {40, 41, 42}, {45, 46, 47} } };
// Collapse to a single dimension, leaving one dimension.
let v012 = Collapse(v, {0,1,2});
then v012 == f32[24] {10, 11, 12, 15, 16, 17,
20, 21, 22, 25, 26, 27,
30, 31, 32, 35, 36, 37,
40, 41, 42, 45, 46, 47};
// Collapse the two lower dimensions, leaving two dimensions.
let v01 = Collapse(v, {0,1});
then v01 == f32[4x6] { {10, 11, 12, 15, 16, 17},
{20, 21, 22, 25, 26, 27},
{30, 31, 32, 35, 36, 37},
{40, 41, 42, 45, 46, 47} };
// Collapse the two higher dimensions, leaving two dimensions.
let v12 = Collapse(v, {1,2});
then v12 == f32[8x3] { {10, 11, 12},
{15, 16, 17},
{20, 21, 22},
{25, 26, 27},
{30, 31, 32},
{35, 36, 37},
{40, 41, 42},
{45, 46, 47} };
Clz
Vedi anche
XlaBuilder::Clz.
Conteggio elemento per elemento degli zeri iniziali.
Clz(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
CollectiveBroadcast
Vedi anche
XlaBuilder::CollectiveBroadcast.
Trasmette i dati tra le repliche. I dati vengono inviati dal primo ID replica di ogni gruppo agli altri ID dello stesso gruppo. Se un ID replica non si trova in alcun gruppo di repliche, l'output della replica è un tensore composto da 0 in shape.
CollectiveBroadcast(operand, replica_groups, channel_id)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
replica_groups
|
ReplicaGroupvettore
|
Ogni gruppo contiene un elenco di ID replica |
channel_id
|
facoltativo ChannelHandle
|
identificatore univoco per ogni coppia invio/ricezione |
Per informazioni su StableHLO, vedi StableHLO - collective_broadcast.
CollectivePermute
Vedi anche
XlaBuilder::CollectivePermute.
CollectivePermute è un'operazione collettiva che invia e riceve dati tra le repliche.
CollectivePermute(operand, source_target_pairs, channel_id, inplace)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
array di input n-dimensionale |
source_target_pairs
|
Vettore <int64, int64>
|
Un elenco di coppie (source_replica_id, target_replica_id). Per ogni coppia, l'operando viene inviato dalla replica di origine alla replica di destinazione. |
channel_id
|
facoltativo ChannelHandle
|
ID canale facoltativo per la comunicazione tra moduli |
inplace
|
facoltativo bool
|
flag che indica se la permutazione deve essere eseguita sul posto |
Tieni presente che esistono le seguenti limitazioni per source_target_pairs:
- Due coppie non devono avere lo stesso ID replica di destinazione e non devono avere lo stesso ID replica di origine.
- Se un ID replica non è una destinazione in nessuna coppia, l'output sulla replica è un tensore composto da 0 con la stessa forma dell'input.
L'API dell'operazione CollectivePermute viene scomposta internamente in due istruzioni HLO (CollectivePermuteStart e CollectivePermuteDone).
Vedi anche
HloInstruction::CreateCollectivePermuteStart.
CollectivePermuteStart e CollectivePermuteDone fungono da primitive in HLO.
Queste operazioni potrebbero essere visualizzate nei dump HLO, ma non sono destinate a essere create
manualmente dagli utenti finali.
Per informazioni su StableHLO, vedi StableHLO - collective_permute.
Confronta
Vedi anche
XlaBuilder::Compare.
Esegue il confronto elemento per elemento di lhs e rhs di quanto segue:
Eq
Vedi anche
XlaBuilder::Eq.
Esegue il confronto uguale a elemento per elemento di lhs e rhs.
\(lhs = rhs\)
Eq(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto di trasmissione di dimensioni diverse per Eq:
Eq(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Supporta un ordine totale superiore ai numeri in virgola mobile per Eq, applicando:
\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]
EqTotalOrder(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Per informazioni su StableHLO, vedi StableHLO - confronta.
Ne
Vedi anche
XlaBuilder::Ne.
Esegue il confronto diverso da elemento per elemento di lhs e rhs.
\(lhs != rhs\)
Ne(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto della trasmissione in dimensioni diverse per Ne:
Ne(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Supporta un ordine totale superiore ai numeri in virgola mobile per Ne, by imponendo:
\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]
NeTotalOrder(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Per informazioni su StableHLO, vedi StableHLO - confronta.
Ge
Vedi anche
XlaBuilder::Ge.
Esegue il confronto greater-or-equal-than elemento per elemento di lhs e rhs.
\(lhs >= rhs\)
Ge(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto di trasmissione di dimensioni diverse per Ge:
Ge(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Supporta un ordine totale superiore ai numeri in virgola mobile per Gt, by imponendo:
\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]
GtTotalOrder(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Per informazioni su StableHLO, vedi StableHLO - confronta.
Gt
Vedi anche
XlaBuilder::Gt.
Esegue il confronto maggiore di elemento per elemento di lhs e rhs.
\(lhs > rhs\)
Gt(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto della trasmissione in dimensioni diverse per Gt:
Gt(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, vedi StableHLO - confronta.
Le
Vedi anche
XlaBuilder::Le.
Esegue il confronto less-or-equal-than elemento per elemento di lhs e rhs.
\(lhs <= rhs\)
Le(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto di trasmissione di dimensioni diverse per Le:
Le(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Supporta un ordine totale superiore ai numeri con rappresentazione in virgola mobile esistenti per Le, by enforcing:
\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]
LeTotalOrder(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Per informazioni su StableHLO, vedi StableHLO - confronta.
Lt
Vedi anche
XlaBuilder::Lt.
Esegue il confronto minore di elemento per elemento di lhs e rhs.
\(lhs < rhs\)
Lt(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto di trasmissione di dimensioni diverse per Lt:
Lt(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Supporta un ordine totale superiore ai numeri in virgola mobile per Lt, by imponendo:
\[-NaN < -Inf < -Finite < -0 < +0 < +Finite < +Inf < +NaN.\]
LtTotalOrder(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Per informazioni su StableHLO, vedi StableHLO - confronta.
Complesso
Vedi anche
XlaBuilder::Complex.
Esegue la conversione elemento per elemento in un valore complesso da una coppia di valori reali e
immaginari, lhs e rhs.
Complex(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto della trasmissione multidimensionale per Complex:
Complex(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, vedi StableHLO - complex.
ConcatInDim (Concatenate)
Vedi anche
XlaBuilder::ConcatInDim.
Concatenate crea un array da più operandi array. L'array ha lo stesso numero di dimensioni di ciascuno degli operandi dell'array di input (che devono avere lo stesso numero di dimensioni tra loro) e contiene gli argomenti nell'ordine in cui sono stati specificati.
Concatenate(operands..., dimension)
| Argomenti | Tipo | Semantica |
|---|---|---|
operands
|
sequenza di N XlaOp
|
N array di tipo T con dimensioni [L0, L1, ...]. Richiede N >= 1. |
dimension
|
int64
|
Un valore nell'intervallo [0, N) che
indica la dimensione da concatenare
tra operands. |
Ad eccezione di dimension, tutte le dimensioni devono essere uguali. Questo perché XLA non supporta gli array "irregolari". Tieni presente inoltre che i valori
a zero dimensioni non possono essere concatenati (in quanto è impossibile denominare la dimensione lungo
la quale avviene la concatenazione).
Esempio unidimensionale:
Concat({ {2, 3}, {4, 5}, {6, 7} }, 0)
//Output: {2, 3, 4, 5, 6, 7}
Esempio bidimensionale:
let a = { {1, 2},
{3, 4},
{5, 6} };
let b = { {7, 8} };
Concat({a, b}, 0)
//Output: { {1, 2},
// {3, 4},
// {5, 6},
// {7, 8} }
Diagramma:

Per informazioni su StableHLO, vedi StableHLO - concatenate.
Condizionale
Vedi anche
XlaBuilder::Conditional.
Conditional(predicate, true_operand, true_computation, false_operand,
false_computation)
| Argomenti | Tipo | Semantica |
|---|---|---|
predicate |
XlaOp |
Scalare di tipo PRED |
true_operand |
XlaOp |
Argomento di tipo \(T_0\) |
true_computation |
XlaComputation |
XlaComputation di tipo \(T_0 \to S\) |
false_operand |
XlaOp |
Argomento di tipo \(T_1\) |
false_computation |
XlaComputation |
XlaComputation di tipo \(T_1 \to S\) |
Esegue true_computation se predicate è true, false_computation se
predicate è false e restituisce il risultato.
true_computation deve accettare un singolo argomento di tipo \(T_0\) e verrà
richiamato con true_operand, che deve essere dello stesso tipo. false_computation deve accettare un singolo argomento di tipo \(T_1\) e verrà richiamato con false_operand, che deve essere dello stesso tipo. Il tipo di valore restituito di true_computation e false_computation deve essere lo stesso.
Tieni presente che verrà eseguito solo uno dei due valori true_computation e false_computation a seconda del valore di predicate.
Conditional(branch_index, branch_computations, branch_operands)
| Argomenti | Tipo | Semantica |
|---|---|---|
branch_index |
XlaOp |
Scalare di tipo S32 |
branch_computations |
sequenza di N XlaComputation |
XlaComputations di tipo \(T_0 \to S , T_1 \to S , ..., T_{N-1} \to S\) |
branch_operands |
sequenza di N XlaOp |
Argomenti di tipo \(T_0 , T_1 , ..., T_{N-1}\) |
Esegue branch_computations[branch_index] e restituisce il risultato. Se
branch_index è un S32 che è < 0 o >= N, allora branch_computations[N-1]
viene eseguito come ramo predefinito.
Ogni branch_computations[b] deve accettare un singolo argomento di tipo \(T_b\) e
verrà richiamato con branch_operands[b], che deve essere dello stesso tipo. Il tipo di valore restituito di ogni branch_computations[b] deve essere lo stesso.
Tieni presente che verrà eseguito solo uno dei branch_computations a seconda
del valore di branch_index.
Per informazioni su StableHLO, vedi StableHLO - if.
Costante
Vedi anche
XlaBuilder::ConstantLiteral.
Produce un output da una costante literal.
Constant(literal)
| Argomenti | Tipo | Semantica |
|---|---|---|
literal |
LiteralSlice |
visualizzazione costante di un Literal esistente |
Per informazioni su StableHLO, vedi StableHLO - constant.
ConvertElementType
Vedi anche
XlaBuilder::ConvertElementType.
Simile a un'operazione static_cast elemento per elemento in C++, ConvertElementType esegue
una conversione elemento per elemento da una forma dei dati a una forma di destinazione. Le
dimensioni devono corrispondere e la conversione è elemento per elemento; ad esempio, gli elementi s32
diventano elementi f32 tramite una routine di conversione da s32 a f32.
ConvertElementType(operand, new_element_type)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
array di tipo T con dimensioni D |
new_element_type |
PrimitiveType |
tipo U |
Le dimensioni dell'operando e della forma di destinazione devono corrispondere. I tipi di elementi di origine e destinazione non devono essere tuple.
Una conversione come T=s32 in U=f32 eseguirà una routine di conversione int-to-float di normalizzazione, ad esempio round-to-nearest-even.
let a: s32[3] = {0, 1, 2};
let b: f32[3] = convert(a, f32);
then b == f32[3]{0.0, 1.0, 2.0}
Per informazioni su StableHLO, vedi StableHLO - convert.
Conv (convoluzione)
Vedi anche
XlaBuilder::Conv.
Calcola una convoluzione del tipo utilizzato nelle reti neurali. In questo caso, una convoluzione può essere considerata una finestra n-dimensionale che si sposta su un'area di base n-dimensionale e viene eseguito un calcolo per ogni posizione possibile della finestra.
Conv Inserisce un'istruzione di convoluzione nel calcolo, che utilizza i
numeri di dimensione di convoluzione predefiniti senza dilatazione.
Il padding viene specificato in modo abbreviato come SAME o VALID. SAME
il padding riempie l'input (lhs) con zeri in modo che l'output abbia la stessa forma
dell'input quando non si tiene conto dello striding. Il riempimento VALID significa semplicemente
nessun riempimento.
Conv(lhs, rhs, window_strides, padding, feature_group_count,
batch_group_count, precision_config, preferred_element_type)
| Argomenti | Tipo | Semantica |
|---|---|---|
lhs
|
XlaOp
|
Array (n+2)-dimensionale di input |
rhs
|
XlaOp
|
Array (n+2)-dimensionale di pesi del kernel |
window_strides |
ArraySlice<int64> |
array n-dimensionale di passi del kernel |
padding |
Padding |
enum of padding |
feature_group_count
|
int64 | il numero di gruppi di funzionalità |
batch_group_count |
int64 | il numero di gruppi di batch |
precision_config
|
facoltativo
PrecisionConfig |
enum per il livello di precisione |
preferred_element_type
|
facoltativo
PrimitiveType |
enum del tipo di elemento scalare |
Per Conv sono disponibili livelli di controllo crescenti:
Sia n il numero di dimensioni spaziali. L'argomento lhs è un
array (n+2)-dimensionale che descrive l'area di base. Questo è chiamato input,
anche se ovviamente anche il lato destro è un input. In una rete neurale, queste sono
le attivazioni di input. Le dimensioni n+2 sono, in questo ordine:
batch: ogni coordinata in questa dimensione rappresenta un input indipendente per il quale viene eseguita la convoluzione.z/depth/features: a ogni posizione (y,x) nell'area di base è associato un vettore che rientra in questa dimensione.spatial_dims: descrive le dimensioni spazialinche definiscono l'area di base in cui si sposta la finestra.
L'argomento rhs è un array (n+2) dimensionale che descrive il filtro/kernel/finestra
convoluzionale. Le dimensioni sono, in questo ordine:
output-z: la dimensionezdell'output.input-z: le dimensioni di questa dimensione moltiplicate perfeature_group_countdevono essere uguali alle dimensioni della dimensioneznella parte sinistra.spatial_dims: descrive le dimensioni spazialinche definiscono la finestra n-dimensionale che si sposta nell'area di base.
L'argomento window_strides specifica lo stride della finestra convoluzionale
nelle dimensioni spaziali. Ad esempio, se lo stride nella prima dimensione spaziale è 3, la finestra può essere posizionata solo in corrispondenza di coordinate in cui il primo indice spaziale è divisibile per 3.
L'argomento padding specifica la quantità di padding zero da applicare all'area di base. La quantità di padding può essere negativa. Il valore assoluto del padding negativo indica il numero di elementi da rimuovere dalla dimensione specificata prima di eseguire la convoluzione. padding[0] specifica il padding per
la dimensione y e padding[1] specifica il padding per la dimensione x. Ogni
coppia ha il padding basso come primo elemento e il padding alto come secondo
elemento. Il riempimento basso viene applicato nella direzione degli indici più bassi, mentre il riempimento alto viene applicato nella direzione degli indici più alti. Ad esempio, se
padding[1] è (2,3), nella seconda dimensione spaziale verrà aggiunto un riempimento di due zeri a sinistra e
di tre zeri a destra. L'utilizzo del padding
equivale a inserire gli stessi valori zero nell'input (lhs) prima
di eseguire la convoluzione.
Gli argomenti lhs_dilation e rhs_dilation specificano il fattore di dilatazione da
applicare rispettivamente al lato sinistro e destro in ogni dimensione spaziale. Se il
fattore di dilatazione in una dimensione spaziale è d, vengono inseriti implicitamente d-1 fori
tra ogni voce di quella dimensione, aumentando le dimensioni dell'
array. I fori vengono riempiti con un valore no-op, che per la convoluzione significa
zeri.
La dilatazione del lato destro è anche chiamata convoluzione atrous. Per maggiori dettagli, vedi
tf.nn.atrous_conv2d. L'espansione del lato sinistro è anche chiamata convoluzione trasposta. Per maggiori dettagli, vedi tf.nn.conv2d_transpose.
L'argomento feature_group_count (valore predefinito 1) può essere utilizzato per le convoluzioni
raggruppate. feature_group_count deve essere un divisore sia della dimensione della funzionalità di input sia di quella di output. Se feature_group_count è maggiore di 1, significa che concettualmente la dimensione della funzionalità di input e output e la dimensione della funzionalità di output rhs sono suddivise equamente in molti gruppi feature_group_count, ciascuno costituito da una sottosequenza consecutiva di funzionalità. La dimensione
della funzionalità di input di rhs deve essere uguale alla dimensione della funzionalità di input lhs
divisa per feature_group_count (quindi ha già le dimensioni di un
gruppo di funzionalità di input). Gli i-esimi gruppi vengono utilizzati insieme per calcolare
feature_group_count per molte convoluzioni separate. I risultati di queste
convoluzioni vengono concatenati nella dimensione della funzionalità di output.
Per la convoluzione depthwise, l'argomento feature_group_count verrà impostato sulla
dimensione della funzionalità di input e il filtro verrà rimodellato da
[filter_height, filter_width, in_channels, channel_multiplier] a
[filter_height, filter_width, 1, in_channels * channel_multiplier]. Per maggiori
dettagli, vedi tf.nn.depthwise_conv2d.
L'argomento batch_group_count (valore predefinito 1) può essere utilizzato per i filtri
raggruppati durante la retropropagazione. batch_group_count deve essere un divisore della
dimensione del batch lhs (input). Se batch_group_count è maggiore
di 1, significa che la dimensione del batch di output deve essere input batch
/ batch_group_count. batch_group_count deve essere un divisore della dimensione della funzionalità di output.
La forma di output ha queste dimensioni, in questo ordine:
batch: le dimensioni di questa dimensione moltiplicate perbatch_group_countdevono essere uguali alle dimensioni della dimensionebatchnel lato sinistro.z: Le stesse dimensioni dioutput-zsul kernel (rhs).spatial_dims: Un valore per ogni posizionamento valido della finestra convoluzionale.
La figura sopra mostra come funziona il campo batch_group_count. In pratica, dividiamo ogni batch lhs in batch_group_count gruppi e facciamo lo stesso per le funzionalità di output. Quindi, per ciascuno di questi gruppi eseguiamo convoluzioni a coppie e concateniamo l'output lungo la dimensione della funzionalità di output. La semantica
operativa di tutte le altre dimensioni (funzionalità e spaziali) rimane invariata.
I posizionamenti validi della finestra convoluzionale sono determinati dagli stride e dalle dimensioni dell'area di base dopo il padding.
Per descrivere cosa fa una convoluzione, considera una convoluzione 2D e scegli alcune coordinate batch, z, y, x fisse nell'output. (y,x) è una
posizione di un angolo della finestra all'interno dell'area di base (ad es. l'angolo in alto a sinistra, a seconda di come interpreti le dimensioni spaziali). Ora abbiamo una finestra 2D, presa dall'area di base, in cui ogni punto 2D è associato a un vettore 1D, quindi otteniamo una scatola 3D. Dal kernel convoluzionale, poiché abbiamo corretto la
coordinata di output z, abbiamo anche una casella 3D. Le due caselle hanno le stesse
dimensioni, quindi possiamo calcolare la somma dei prodotti elemento per elemento tra le due
caselle (in modo simile a un prodotto scalare). Questo è il valore di output.
Tieni presente che se output-z è, ad esempio, 5, quindi ogni posizione della finestra produce 5 valori nell'output nella dimensione z dell'output. Questi valori differiscono
nella parte del kernel convoluzionale utilizzata: esiste una casella 3D separata di
valori utilizzati per ogni coordinata output-z. Puoi quindi considerarlo come 5
convoluzioni separate con un filtro diverso per ciascuna.
Ecco il pseudocodice per una convoluzione 2D con padding e striding:
for (b, oz, oy, ox) { // output coordinates
value = 0;
for (iz, ky, kx) { // kernel coordinates and input z
iy = oy*stride_y + ky - pad_low_y;
ix = ox*stride_x + kx - pad_low_x;
if ((iy, ix) inside the base area considered without padding) {
value += input(b, iz, iy, ix) * kernel(oz, iz, ky, kx);
}
}
output(b, oz, oy, ox) = value;
}
precision_config viene utilizzato per indicare la configurazione della precisione. Il livello
determina se l'hardware deve tentare di generare più istruzioni
di codice macchina per fornire un'emulazione del tipo di dati più accurata quando necessario (ad es.
emulazione di f32 su una TPU che supporta solo matmul bf16). I valori possono essere
DEFAULT, HIGH, HIGHEST. Ulteriori dettagli
nelle sezioni MXU.
preferred_element_type è un elemento scalare di tipi di output con precisione maggiore/minore
utilizzati per l'accumulo. preferred_element_type consiglia il tipo di accumulo per l'operazione specificata, ma non è garantito. Ciò
consente ad alcuni backend hardware di accumularsi in un tipo diverso e
di essere convertiti nel tipo di output preferito.
Per informazioni su StableHLO, vedi StableHLO - convoluzione.
ConvWithGeneralPadding
Vedi anche
XlaBuilder::ConvWithGeneralPadding.
ConvWithGeneralPadding(lhs, rhs, window_strides, padding,
feature_group_count, batch_group_count, precision_config,
preferred_element_type)
Come Conv, dove la configurazione del padding è esplicita.
| Argomenti | Tipo | Semantica |
|---|---|---|
lhs
|
XlaOp
|
Array (n+2)-dimensionale di input |
rhs
|
XlaOp
|
Array (n+2)-dimensionale di pesi del kernel |
window_strides |
ArraySlice<int64> |
array n-dimensionale di passi del kernel |
padding
|
ArraySlice<
pair<int64,int64>> |
array n-dimensionale di (low, high) padding |
feature_group_count
|
int64 | il numero di gruppi di funzionalità |
batch_group_count |
int64 | il numero di gruppi di batch |
precision_config
|
facoltativo
PrecisionConfig |
enum per il livello di precisione |
preferred_element_type
|
facoltativo
PrimitiveType |
enum del tipo di elemento scalare |
ConvWithGeneralDimensions
Vedi anche
XlaBuilder::ConvWithGeneralDimensions.
ConvWithGeneralDimensions(lhs, rhs, window_strides, padding,
dimension_numbers, feature_group_count, batch_group_count, precision_config,
preferred_element_type)
Uguale a Conv, dove i numeri delle dimensioni sono espliciti.
| Argomenti | Tipo | Semantica |
|---|---|---|
lhs
|
XlaOp
|
Array di input a (n+2) dimensioni |
rhs
|
XlaOp
|
array di pesi del kernel di dimensione (n+2) |
window_strides
|
ArraySlice<int64>
|
Array n-dimensionale di passi del kernel |
padding |
Padding |
enum of padding |
dimension_numbers
|
ConvolutionDimensionNumbers
|
il numero di dimensioni |
feature_group_count
|
int64 | il numero di gruppi di funzionalità |
batch_group_count
|
int64 | il numero di gruppi di batch |
precision_config
|
facoltativo PrecisionConfig
|
enum per il livello di precisione |
preferred_element_type
|
facoltativo PrimitiveType
|
enum of scalar element type |
ConvGeneral
Vedi anche
XlaBuilder::ConvGeneral.
ConvGeneral(lhs, rhs, window_strides, padding, dimension_numbers,
feature_group_count, batch_group_count, precision_config,
preferred_element_type)
Come Conv, dove i numeri delle dimensioni e la configurazione
del padding sono espliciti
| Argomenti | Tipo | Semantica |
|---|---|---|
lhs
|
XlaOp
|
Array di input a (n+2) dimensioni |
rhs
|
XlaOp
|
array di pesi del kernel di dimensione (n+2) |
window_strides
|
ArraySlice<int64>
|
Array n-dimensionale di passi del kernel |
padding
|
ArraySlice<
pair<int64,int64>>
|
Array n-dimensionale di (low, high) padding |
dimension_numbers
|
ConvolutionDimensionNumbers
|
il numero di dimensioni |
feature_group_count
|
int64 | il numero di gruppi di funzionalità |
batch_group_count
|
int64 | il numero di gruppi di batch |
precision_config
|
facoltativo PrecisionConfig
|
enum per il livello di precisione |
preferred_element_type
|
facoltativo PrimitiveType
|
enum of scalar element type |
ConvGeneralDilated
Vedi anche
XlaBuilder::ConvGeneralDilated.
ConvGeneralDilated(lhs, rhs, window_strides, padding, lhs_dilation,
rhs_dilation, dimension_numbers, feature_group_count, batch_group_count,
precision_config, preferred_element_type, window_reversal)
Uguale a Conv in cui la configurazione del padding, i fattori di dilatazione e i numeri delle dimensioni sono espliciti.
| Argomenti | Tipo | Semantica |
|---|---|---|
lhs
|
XlaOp
|
Array di input a (n+2) dimensioni |
rhs
|
XlaOp
|
array di pesi del kernel di dimensione (n+2) |
window_strides
|
ArraySlice<int64>
|
Array n-dimensionale di passi del kernel |
padding
|
ArraySlice<
pair<int64,int64>>
|
Array n-dimensionale di (low, high) padding |
lhs_dilation
|
ArraySlice<int64>
|
Array di fattori di dilatazione lhs n-d |
rhs_dilation
|
ArraySlice<int64>
|
array di fattori di dilatazione RHS n-dimensionale |
dimension_numbers
|
ConvolutionDimensionNumbers
|
il numero di dimensioni |
feature_group_count
|
int64 | il numero di gruppi di funzionalità |
batch_group_count
|
int64 | il numero di gruppi di batch |
precision_config
|
facoltativo PrecisionConfig
|
enum per il livello di precisione |
preferred_element_type
|
facoltativo PrimitiveType
|
enum of scalar element type |
window_reversal
|
facoltativo vector<bool>
|
flag utilizzato per invertire logicamente la dimensione prima di applicare la convoluzione |
Copia
Vedi anche
HloInstruction::CreateCopyStart.
Copy viene scomposto internamente in due istruzioni HLO CopyStart e
CopyDone. Copy insieme a CopyStart e CopyDone fungono da primitive in
HLO. Queste operazioni potrebbero essere visualizzate nei dump HLO, ma non sono destinate a essere
create manualmente dagli utenti finali.
Cos
Vedi
ancheXlaBuilder::Cos.
Coseno elemento per elemento x -> cos(x).
Cos(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Cos supporta anche l'argomento facoltativo result_accuracy:
Cos(operand, result_accuracy)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
result_accuracy
|
facoltativo ResultAccuracy
|
I tipi di precisione che l'utente può richiedere per le operazioni unarie con più implementazioni |
Per ulteriori informazioni su result_accuracy, consulta
Accuratezza dei risultati.
Per informazioni su StableHLO, vedi StableHLO - cosine.
Cosh
Vedi anche
XlaBuilder::Cosh.
Coseno iperbolico elemento per elemento x -> cosh(x).
Cosh(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Cosh supporta anche l'argomento facoltativo result_accuracy:
Cosh(operand, result_accuracy)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
result_accuracy
|
facoltativo ResultAccuracy
|
I tipi di precisione che l'utente può richiedere per le operazioni unarie con più implementazioni |
Per ulteriori informazioni su result_accuracy, consulta
Accuratezza dei risultati.
CustomCall
Vedi anche
XlaBuilder::CustomCall.
Chiama una funzione fornita dall'utente all'interno di un calcolo.
La documentazione di CustomCall è fornita in Dettagli per gli sviluppatori - CustomCall XLA
Per informazioni su StableHLO, vedi StableHLO - custom_call.
Div
Vedi anche
XlaBuilder::Div.
Esegue la divisione elemento per elemento del dividendo lhs e del divisore rhs.
Div(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
L'overflow della divisione intera (divisione/resto con o senza segno per zero o divisione/resto con segno di INT_SMIN con -1) produce un valore definito dall'implementazione.
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto della trasmissione di dimensioni diverse per Div:
Div(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, vedi StableHLO - divide.
Dominio
Vedi anche
HloInstruction::CreateDomain.
Domain può essere visualizzato nei dump HLO, ma non è destinato a essere creato
manualmente dagli utenti finali.
Punto
Vedi anche
XlaBuilder::Dot.
Dot(lhs, rhs, precision_config, preferred_element_type)
| Argomenti | Tipo | Semantica |
|---|---|---|
lhs |
XlaOp |
array di tipo T |
rhs |
XlaOp |
array di tipo T |
precision_config
|
facoltativo
PrecisionConfig |
enum per il livello di precisione |
preferred_element_type
|
facoltativo
PrimitiveType |
enum del tipo di elemento scalare |
La semantica esatta di questa operazione dipende dai ranghi degli operandi:
| Input | Output | Semantica |
|---|---|---|
vettore [n] dot vettore [n] |
scalare | prodotto scalare vettoriale |
matrice [m x k] dot vector
[k] |
vettore [m] | moltiplicazione matrice-vettore |
matrice [m x k] dot matrice
[k x n] |
matrice [m x n] | moltiplicazione matrice-matrice |
L'operazione esegue la somma dei prodotti sulla seconda dimensione di lhs (o
la prima se ha una dimensione) e sulla prima dimensione di rhs. Queste sono le dimensioni
"contratte". Le dimensioni contratte di lhs e rhs devono essere
le stesse. In pratica, può essere utilizzato per eseguire prodotti scalari tra vettori, moltiplicazioni vettore/matrice o moltiplicazioni matrice/matrice.
precision_config viene utilizzato per indicare la configurazione della precisione. Il livello
determina se l'hardware deve tentare di generare più istruzioni
di codice macchina per fornire un'emulazione del tipo di dati più accurata quando necessario (ad es.
emulazione di f32 su una TPU che supporta solo matmul bf16). I valori possono essere
DEFAULT, HIGH, HIGHEST. Ulteriori dettagli
nelle sezioni MXU.
preferred_element_type è un elemento scalare di tipi di output con precisione maggiore/minore
utilizzati per l'accumulo. preferred_element_type consiglia il tipo di accumulo per l'operazione specificata, ma non è garantito. Ciò
consente ad alcuni backend hardware di accumularsi in un tipo diverso e
di essere convertiti nel tipo di output preferito.
Per informazioni su StableHLO, vedi StableHLO - dot.
DotGeneral
Vedi anche
XlaBuilder::DotGeneral.
DotGeneral(lhs, rhs, dimension_numbers, precision_config,
preferred_element_type)
| Argomenti | Tipo | Semantica |
|---|---|---|
lhs |
XlaOp |
array di tipo T |
rhs |
XlaOp |
array di tipo T |
dimension_numbers
|
DotDimensionNumbers
|
numeri di dimensioni di contrazione e batch |
precision_config
|
facoltativo
PrecisionConfig |
enum per il livello di precisione |
preferred_element_type
|
facoltativo
PrimitiveType |
enum of scalar element type |
Simile a Punto, ma consente di specificare i numeri di dimensione di contrazione e batch sia per lhs che per rhs.
| Campi DotDimensionNumbers | Tipo | Semantica |
|---|---|---|
lhs_contracting_dimensions
|
repeated int64 | lhs numeri della dimensione
del contratto |
rhs_contracting_dimensions
|
repeated int64 | rhs numeri della dimensione
del contratto |
lhs_batch_dimensions
|
repeated int64 | lhs numeri di dimensioni
batch |
rhs_batch_dimensions
|
repeated int64 | rhs numeri di dimensioni
batch |
DotGeneral esegue la somma dei prodotti nelle dimensioni di contrazione specificate in
dimension_numbers.
I numeri delle dimensioni di contratto associate di lhs e rhs non devono
essere uguali, ma devono avere le stesse dimensioni.
Esempio con numeri di dimensioni che si riducono:
lhs = { {1.0, 2.0, 3.0},
{4.0, 5.0, 6.0} }
rhs = { {1.0, 1.0, 1.0},
{2.0, 2.0, 2.0} }
DotDimensionNumbers dnums;
dnums.add_lhs_contracting_dimensions(1);
dnums.add_rhs_contracting_dimensions(1);
DotGeneral(lhs, rhs, dnums) -> { { 6.0, 12.0},
{15.0, 30.0} }
I numeri delle dimensioni del batch associati di lhs e rhs devono avere le stesse dimensioni.
Esempio con numeri di dimensioni batch (dimensione batch 2, matrici 2x2):
lhs = { { {1.0, 2.0},
{3.0, 4.0} },
{ {5.0, 6.0},
{7.0, 8.0} } }
rhs = { { {1.0, 0.0},
{0.0, 1.0} },
{ {1.0, 0.0},
{0.0, 1.0} } }
DotDimensionNumbers dnums;
dnums.add_lhs_contracting_dimensions(2);
dnums.add_rhs_contracting_dimensions(1);
dnums.add_lhs_batch_dimensions(0);
dnums.add_rhs_batch_dimensions(0);
DotGeneral(lhs, rhs, dnums) -> {
{ {1.0, 2.0},
{3.0, 4.0} },
{ {5.0, 6.0},
{7.0, 8.0} } }
| Input | Output | Semantica |
|---|---|---|
[b0, m, k] dot [b0, k, n] |
[b0, m, n] | batch matmul |
[b0, b1, m, k] dot [b0, b1, k, n] |
[b0, b1, m, n] | batch matmul |
Di conseguenza, il numero della dimensione risultante inizia con la dimensione batch, poi con la dimensione lhs non contrattuale/non batch e infine con la dimensione rhs
non contrattuale/non batch.
precision_config viene utilizzato per indicare la configurazione della precisione. Il livello
determina se l'hardware deve tentare di generare più istruzioni
di codice macchina per fornire un'emulazione del tipo di dati più accurata quando necessario (ad es.
emulazione di f32 su una TPU che supporta solo matmul bf16). I valori possono essere
DEFAULT, HIGH, HIGHEST. Ulteriori dettagli
sono disponibili nelle sezioni relative alle unità MXU.
preferred_element_type è un elemento scalare di tipi di output con precisione maggiore/minore
utilizzati per l'accumulo. preferred_element_type consiglia il tipo di accumulo per l'operazione specificata, ma non è garantito. Ciò
consente ad alcuni backend hardware di accumularsi in un tipo diverso e
di essere convertiti nel tipo di output preferito.
Per informazioni su StableHLO, vedi StableHLO - dot_general.
ScaledDot
Vedi anche
XlaBuilder::ScaledDot.
ScaledDot(lhs, lhs_scale, rhs, rhs_scale, dimension_number,
precision_config,preferred_element_type)
| Argomenti | Tipo | Semantica |
|---|---|---|
lhs |
XlaOp |
array di tipo T |
rhs |
XlaOp |
array di tipo T |
lhs_scale |
XlaOp |
array di tipo T |
rhs_scale |
XlaOp |
array di tipo T |
dimension_number
|
ScatterDimensionNumbers
|
Numeri di dimensione per l'operazione di dispersione |
precision_config
|
PrecisionConfig
|
enum per il livello di precisione |
preferred_element_type
|
facoltativo PrimitiveType
|
enum of scalar element type |
Simile a DotGeneral.
Crea un'operazione di prodotto scalare con gli operandi "lhs", "lhs_scale", "rhs" e "rhs_scale", con le dimensioni di contrazione e batch specificate in "dimension_numbers".
RaggedDot
Vedi anche
XlaBuilder::RaggedDot.
Per un'analisi dettagliata del calcolo di RaggedDot, vedi
StableHLO - chlo.ragged_dot
DynamicReshape
Vedi anche
XlaBuilder::DynamicReshape.
Questa operazione è funzionalmente identica a reshape, ma la forma del risultato viene specificata dinamicamente tramite output_shape.
DynamicReshape(operand, dim_sizes, new_size_bounds, dims_are_dynamic)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
Array N-dimensionale di tipo T |
dim_sizes |
vettore di XlaOP |
Dimensioni dei vettori N dimensionali |
new_size_bounds |
vettore di int63 |
Vettore di limiti N-dimensionale |
dims_are_dynamic |
vettore di bool |
N dimensional dynamic dim |
Per informazioni su StableHLO, vedi StableHLO - dynamic_reshape.
DynamicSlice
Vedi anche
XlaBuilder::DynamicSlice.
DynamicSlice estrae un sottoarray dall'array di input in dynamic
start_indices. La dimensione della sezione in ogni dimensione viene passata in
size_indices, che specifica il punto finale degli intervalli di sezioni esclusivi in ogni
dimensione: [start, start + size). La forma di start_indices deve essere
unidimensionale, con dimensioni pari al numero di dimensioni di
operand.
DynamicSlice(operand, start_indices, slice_sizes)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
Array N-dimensionale di tipo T |
start_indices
|
sequenza di N XlaOp
|
Elenco di N numeri interi scalari contenenti gli indici iniziali della sezione per ogni dimensione. Il valore deve essere maggiore o uguale a zero. |
size_indices
|
ArraySlice<int64>
|
Elenco di N numeri interi contenenti le dimensioni della sezione per ogni dimensione. Ogni valore deve essere strettamente maggiore di zero e start + size deve essere minore o uguale a la dimensione della dimensione per evitare il wrapping della dimensione modulo. |
Gli indici delle sezioni effettivi vengono calcolati applicando la seguente
trasformazione per ogni indice i in [1, N) prima di eseguire la sezione:
start_indices[i] = clamp(start_indices[i], 0, operand.dimension_size[i] - slice_sizes[i])
In questo modo, la sezione estratta è sempre nei limiti rispetto all'array dell'operando. Se la sezione è all'interno dei limiti prima dell'applicazione della trasformazione, la trasformazione non ha alcun effetto.
Esempio unidimensionale:
let a = {0.0, 1.0, 2.0, 3.0, 4.0};
let s = {2};
DynamicSlice(a, s, {2});
// Result: {2.0, 3.0}
Esempio bidimensionale:
let b =
{ {0.0, 1.0, 2.0},
{3.0, 4.0, 5.0},
{6.0, 7.0, 8.0},
{9.0, 10.0, 11.0} }
let s = {2, 1}
DynamicSlice(b, s, {2, 2});
//Result:
// { { 7.0, 8.0},
// {10.0, 11.0} }
Per informazioni su StableHLO, vedi StableHLO - dynamic_slice.
DynamicUpdateSlice
Vedi anche
XlaBuilder::DynamicUpdateSlice.
DynamicUpdateSlice genera un risultato che è il valore dell'array di input
operand, con una sezione update sovrascritta in start_indices.
La forma di update determina la forma della matrice secondaria del risultato che
viene aggiornata.
La forma di start_indices deve essere unidimensionale, con dimensioni pari al numero di dimensioni di operand.
DynamicUpdateSlice(operand, update, start_indices)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
Array N-dimensionale di tipo T |
update
|
XlaOp
|
Array N-dimensionale di tipo T contenente l'aggiornamento della sezione. Ogni dimensione della forma di aggiornamento deve essere strettamente maggiore di zero e start + update deve essere minore o uguale alla dimensione dell'operando per ogni dimensione per evitare di generare indici di aggiornamento fuori dai limiti. |
start_indices
|
sequenza di N XlaOp
|
Elenco di N numeri interi scalari contenenti gli indici iniziali della sezione per ogni dimensione. Il valore deve essere maggiore o uguale a zero. |
Gli indici delle sezioni effettivi vengono calcolati applicando la seguente
trasformazione per ogni indice i in [1, N) prima di eseguire la sezione:
start_indices[i] = clamp(start_indices[i], 0, operand.dimension_size[i] - update.dimension_size[i])
In questo modo, la sezione aggiornata è sempre nei limiti rispetto all'array di operandi. Se la sezione è all'interno dei limiti prima dell'applicazione della trasformazione, la trasformazione non ha alcun effetto.
Esempio unidimensionale:
let a = {0.0, 1.0, 2.0, 3.0, 4.0}
let u = {5.0, 6.0}
let s = {2}
DynamicUpdateSlice(a, u, s)
// Result: {0.0, 1.0, 5.0, 6.0, 4.0}
Esempio bidimensionale:
let b =
{ {0.0, 1.0, 2.0},
{3.0, 4.0, 5.0},
{6.0, 7.0, 8.0},
{9.0, 10.0, 11.0} }
let u =
{ {12.0, 13.0},
{14.0, 15.0},
{16.0, 17.0} }
let s = {1, 1}
DynamicUpdateSlice(b, u, s)
// Result:
// { {0.0, 1.0, 2.0},
// {3.0, 12.0, 13.0},
// {6.0, 14.0, 15.0},
// {9.0, 16.0, 17.0} }
Per informazioni su StableHLO, consulta StableHLO - dynamic_update_slice.
Erf
Vedi anche
XlaBuilder::Erf.
Funzione di errore elemento per elemento x -> erf(x), dove:
\(\text{erf}(x) = \frac{2}{\sqrt{\pi} }\int_0^x e^{-t^2} \, dt\).
Erf(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Erf supporta anche l'argomento facoltativo result_accuracy:
Erf(operand, result_accuracy)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
result_accuracy
|
facoltativo ResultAccuracy
|
I tipi di precisione che l'utente può richiedere per le operazioni unarie con più implementazioni |
Per ulteriori informazioni su result_accuracy, consulta
Accuratezza dei risultati.
Exp
Vedi anche
XlaBuilder::Exp.
Esponenziale naturale elemento per elemento x -> e^x.
Exp(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Exp supporta anche l'argomento facoltativo result_accuracy:
Exp(operand, result_accuracy)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
result_accuracy
|
facoltativo ResultAccuracy
|
I tipi di precisione che l'utente può richiedere per le operazioni unarie con più implementazioni |
Per ulteriori informazioni su result_accuracy, consulta
Accuratezza dei risultati.
Per informazioni su StableHLO, vedi StableHLO - exponential.
Expm1
Vedi anche
XlaBuilder::Expm1.
Esponenziale naturale meno uno elemento per elemento x -> e^x - 1.
Expm1(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Expm1 supporta anche l'argomento facoltativo result_accuracy:
Expm1(operand, result_accuracy)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
result_accuracy
|
facoltativo ResultAccuracy
|
I tipi di precisione che l'utente può richiedere per le operazioni unarie con più implementazioni |
Per ulteriori informazioni su result_accuracy, consulta
Accuratezza dei risultati.
Per informazioni su StableHLO, vedi StableHLO - exponential_minus_one.
Fft
Vedi anche
XlaBuilder::Fft.
L'operazione XLA FFT implementa le trasformate di Fourier diretta e inversa per input/output reali e complessi. Sono supportate le FFT multidimensionali su un massimo di tre assi.
Fft(operand, ftt_type, fft_length)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand
|
XlaOp
|
L'array a cui applichiamo la trasformata di Fourier. |
fft_type |
FftType |
Consulta la tabella riportata di seguito. |
fft_length
|
ArraySlice<int64>
|
Le lunghezze del dominio temporale
degli assi da
trasformare. Questo è
necessario in particolare per
IRFFT per dimensionare
correttamente l'asse
più interno, poiché
RFFT(fft_length=[16])
ha la stessa forma
di output di
RFFT(fft_length=[17]). |
FftType |
Semantica |
|---|---|
FFT |
Esegue la trasformazione FFT da complesso a complesso. La forma non è stata modificata. |
IFFT |
FFT da complesso a complesso inversa. La forma non è stata modificata. |
RFFT
|
Trasforma FFT da reale a complesso. La forma dell'asse più interno viene
ridotta a fft_length[-1] // 2 + 1 se fft_length[-1] è un
valore diverso da zero, omettendo la parte coniugata invertita del
segnale trasformato oltre la frequenza di Nyquist. |
IRFFT
|
FFT reale-complessa inversa (ovvero prende un numero complesso e restituisce un numero reale).
La forma dell'asse più interno viene espansa a fft_length[-1] se
fft_length[-1] è un valore diverso da zero, deducendo la parte del
segnale trasformato oltre la frequenza di Nyquist dal coniugato
inverso delle voci da 1 a fft_length[-1] // 2 + 1. |
Per informazioni su StableHLO, vedi StableHLO - fft.
FFT multidimensionale
Se viene fornito più di un fft_length, ciò equivale ad applicare una
cascata di operazioni FFT a ciascuno degli assi più interni. Tieni presente che per i casi
reale->complesso e complesso->reale, la trasformazione dell'asse più interno viene
eseguita (in modo efficace) per prima (RFFT; per ultima per IRFFT), motivo per cui l'asse più interno
è quello che cambia dimensione. Le altre trasformazioni degli assi saranno
da complesso a complesso.
Dettagli di implementazione
La FFT della CPU è supportata da TensorFFT di Eigen. La FFT della GPU utilizza cuFFT.
Piano
Vedi anche
XlaBuilder::Floor.
Element-wise floor x -> ⌊x⌋.
Floor(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Per informazioni su StableHLO, vedi StableHLO - floor.
Fusione
Vedi anche
HloInstruction::CreateFusion.
L'operazione Fusion rappresenta le istruzioni HLO e funge da primitiva in HLO.
Questa operazione potrebbe essere visualizzata nei dump HLO, ma non è pensata per essere creata manualmente
dagli utenti finali.
Raccogli
L'operazione di raccolta XLA unisce diverse sezioni (ciascuna con un offset di runtime potenzialmente diverso) di un array di input.
Per informazioni su StableHLO, vedi StableHLO - gather.
Semantica generale
Vedi anche
XlaBuilder::Gather.
Per una descrizione più intuitiva, consulta la sezione "Descrizione informale" di seguito.
gather(operand, start_indices, dimension_numbers, slice_sizes,
indices_are_sorted)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand
|
XlaOp
|
L'array da cui stiamo raccogliendo i dati. |
start_indices
|
XlaOp
|
Array contenente gli indici iniziali delle sezioni che raccogliamo. |
dimension_numbers
|
GatherDimensionNumbers
|
La dimensione in
start_indices che
"contiene" gli indici
iniziali. Di seguito è riportata una
descrizione dettagliata. |
slice_sizes
|
ArraySlice<int64>
|
slice_sizes[i] sono i
limiti della sezione
nella dimensione i. |
indices_are_sorted
|
bool
|
Indica se gli indici sono garantiti per essere ordinati dal chiamante. |
Per comodità, etichettiamo le dimensioni nell'array di output non in offset_dims
come batch_dims.
L'output è un array con batch_dims.size + offset_dims.size dimensioni.
operand.rank deve essere uguale alla somma di offset_dims.size e
collapsed_slice_dims.size. Inoltre, slice_sizes.size deve essere uguale a
operand.rank.
Se index_vector_dim è uguale a start_indices.rank, consideriamo implicitamente
che start_indices abbia una dimensione finale 1 (ovvero, se start_indices aveva
forma [6,7] e index_vector_dim è 2, consideriamo implicitamente la
forma di start_indices come [6,7,1]).
I limiti per l'array di output lungo la dimensione i vengono calcolati come segue:
Se
iè presente inbatch_dims(ovvero è uguale abatch_dims[k]per alcunik), scegliamo i limiti della dimensione corrispondente dastart_indices.shape, saltandoindex_vector_dim(ovvero scegliamostart_indices.shape.dims[k] sek<index_vector_dimestart_indices.shape.dims[k+1] altrimenti).Se
iè presente inoffset_dims(ovvero è uguale aoffset_dims[k] per alcunik), scegliamo il limite corrispondente daslice_sizesdopo aver tenuto conto dicollapsed_slice_dims(ovvero scegliamoadjusted_slice_sizes[k], doveadjusted_slice_sizesèslice_sizescon i limiti agli indicicollapsed_slice_dimsrimossi).
Formalmente, l'indice dell'operando In corrispondente a un determinato indice di output Out viene calcolato come segue:
Sia
G= {Out[k] perkinbatch_dims}. UtilizzaGper estrarre un vettoreSin modo cheS[i] =start_indices[Combine(G,i)] dove Combine(A, b) inserisce b nella posizioneindex_vector_dimdi A. Tieni presente che questa operazione è ben definita anche seGè vuoto: seGè vuoto,S=start_indices.Crea un indice iniziale,
Sin, inoperandutilizzandoSspargendoSutilizzandostart_index_map. Più precisamente:Sin[start_index_map[k]] =S[k] sek<start_index_map.size.Sin[_] =0altrimenti.
Crea un indice
Oininoperanddistribuendo gli indici nelle dimensioni di offset inOutin base al setcollapsed_slice_dims. Più precisamente:Oin[remapped_offset_dims(k)] =Out[offset_dims[k]] ifk<offset_dims.size(remapped_offset_dimsis defined below).Oin[_] =0altrimenti.
InèOin+Sin, dove + è l'addizione elemento per elemento.
remapped_offset_dims è una funzione monotona con dominio [0,
offset_dims.size) e intervallo [0, operand.rank) \ collapsed_slice_dims. Quindi,
se, ad esempio, offset_dims.size è 4, operand.rank è 6 e
collapsed_slice_dims è {0, 2}, allora remapped_offset_dims è {0→1,
1→3, 2→4, 3→5}.
Se indices_are_sorted è impostato su true, XLA può presupporre che start_indices
siano ordinati (in ordine crescente, dopo aver distribuito i valori in base a
start_index_map) dall'utente. In caso contrario, la semantica è
definita dall'implementazione.
Descrizione informale ed esempi
Informalmente, ogni indice Out nell'array di output corrisponde a un elemento E
nell'array operando, calcolato come segue:
Utilizziamo le dimensioni batch in
Outper cercare un indice iniziale dastart_indices.Utilizziamo
start_index_mapper mappare l'indice iniziale (la cui dimensione potrebbe essere inferiore a operand.rank) a un indice iniziale "completo" inoperand.Estraiamo dinamicamente una sezione di dimensioni
slice_sizesutilizzando l'indice iniziale completo.Rimodelliamo la sezione comprimendo le dimensioni
collapsed_slice_dims. Poiché tutte le dimensioni della sezione compressa devono avere un limite di 1, questo rimodellamento è sempre legale.Utilizziamo le dimensioni dell'offset in
Outper indicizzare questa sezione e ottenere l'elemento di input,E, corrispondente all'indice di outputOut.
index_vector_dim è impostato su start_indices.rank - 1 in tutti gli esempi
che seguono. Valori più interessanti per index_vector_dim non modificano
l'operazione in modo sostanziale, ma rendono la rappresentazione visiva più complessa.
Per capire come si combinano tutti gli elementi precedenti, esaminiamo un esempio che raccoglie 5 sezioni della forma [8,6] da un array [16,11]. La posizione di una sezione nell'array [16,11] può essere rappresentata come un vettore di indici di forma S64[2], quindi l'insieme di 5 posizioni può essere rappresentato come un array S64[5,2].
Il comportamento dell'operazione di raccolta può quindi essere rappresentato come una trasformazione dell'indice che prende [G,O0,O1], un indice nella forma di output e lo mappa a un elemento nell'array di input nel seguente modo:
Innanzitutto, selezioniamo un vettore (X,Y) dall'array di indici di raccolta utilizzando G.
L'elemento nell'array di output all'indice
[G,O0,O1] è quindi l'elemento nell'array
di input all'indice [X+O0,Y+O1].
slice_sizes è [8,6], che determina l'intervallo di O0 e
O1, che a sua volta determina i limiti della sezione.
Questa operazione di raccolta funge da slice dinamica batch con G come dimensione batch.
Gli indici di raccolta possono essere multidimensionali. Ad esempio, una versione più generale
dell'esempio precedente che utilizza un array "gather indices" di forma [4,5,2]
tradurrebbe gli indici in questo modo:
Anche in questo caso, funge da slice dinamico batch G0 e
G1 come dimensioni batch. La dimensione della sezione è ancora [8,6].
L'operazione di raccolta in XLA generalizza la semantica informale descritta sopra nei seguenti modi:
Possiamo configurare quali dimensioni nella forma di output sono le dimensioni di offset (dimensioni contenenti
O0,O1nell'ultimo esempio). Le dimensioni del batch di output (dimensioni contenentiG0,G1nell'ultimo esempio) sono definite come le dimensioni di output che non sono dimensioni di offset.Il numero di dimensioni di offset di output presenti esplicitamente nella forma di output potrebbe essere inferiore al numero di dimensioni di input. Queste dimensioni "mancanti", elencate esplicitamente come
collapsed_slice_dims, devono avere una dimensione della sezione di1. Poiché hanno una dimensione della sezione di1, l'unico indice valido è0e la loro eliminazione non introduce ambiguità.La sezione estratta dall'array "Gather Indices" ((
X,Y) nell'ultimo esempio) potrebbe avere meno elementi del numero di dimensioni dell'array di input e una mappatura esplicita determina in che modo l'indice deve essere espanso per avere lo stesso numero di dimensioni dell'input.
Come ultimo esempio, utilizziamo (2) e (3) per implementare tf.gather_nd:
G0 e G1 vengono utilizzati per estrarre un indice iniziale dall'array di indici di raccolta come di consueto, tranne per il fatto che l'indice iniziale ha un solo elemento, X. Analogamente, esiste un solo indice di offset di output con il valore
O0. Tuttavia, prima di essere utilizzati come indici nell'array di input,
questi vengono espansi in base a "Gather Index Mapping" (start_index_map nella
descrizione formale) e "Offset Mapping" (remapped_offset_dims nella
descrizione formale) in [X,0] e [0,O0] rispettivamente,
sommando fino a [X,O0]. In altre parole, l'indice di output
[G0,G1,O0] viene mappato all'indice di input
[GatherIndices[G0,G1,0],O0]
che ci fornisce la semantica per tf.gather_nd.
slice_sizes per questa richiesta è [1,11]. Intuitivamente, ciò significa che ogni
indice X nell'array di indici di raccolta seleziona un'intera riga e il risultato è la
concatenazione di tutte queste righe.
GetDimensionSize
Vedi anche
XlaBuilder::GetDimensionSize.
Restituisce la dimensione della dimensione specificata dell'operando. L'operando deve avere la forma di un array.
GetDimensionSize(operand, dimension)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
array di input n-dimensionale |
dimension
|
int64
|
Un valore nell'intervallo [0, n) che specifica la
dimensione |
Per informazioni su StableHLO, vedi StableHLO - get_dimension_size.
GetTupleElement
Vedi anche
XlaBuilder::GetTupleElement.
Indici in una tupla con un valore costante in fase di compilazione.
Il valore deve essere una costante in fase di compilazione in modo che l'inferenza della forma possa determinare il tipo del valore risultante.
È analogo a std::get<int N>(t) in C++. Concettualmente:
let v: f32[10] = f32[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
let s: s32 = 5;
let t: (f32[10], s32) = tuple(v, s);
let element_1: s32 = gettupleelement(t, 1); // Inferred shape matches s32.
Vedi anche tf.tuple.
GetTupleElement(tuple_data, index)
| Argomento | Tipo | Semantica |
|---|---|---|
tuple_data |
XlaOP |
La tupla |
index |
int64 |
Indice della forma della tupla |
Per informazioni su StableHLO, vedi StableHLO - get_tuple_element.
Imag
Vedi anche
XlaBuilder::Imag.
Parte immaginaria elemento per elemento di una forma complessa (o reale). x -> imag(x). Se l'operando è un tipo a virgola mobile, restituisce 0.
Imag(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Per informazioni su StableHLO, consulta StableHLO - imag.
Infeed
Vedi anche
XlaBuilder::Infeed.
Infeed(shape, config)
| Argomento | Tipo | Semantica |
|---|---|---|
shape
|
Shape
|
Forma dei dati letti dall'interfaccia Infeed. Il campo del layout della forma deve essere impostato in modo che corrisponda al layout dei dati inviati al dispositivo; in caso contrario, il suo comportamento è indefinito. |
config |
facoltativo string |
Configurazione dell'operazione. |
Legge un singolo elemento di dati dall'interfaccia di streaming infeed implicita del
dispositivo, interpretando i dati come la forma e il layout specificati e restituisce un
XlaOp dei dati. Sono consentite più operazioni Infeed in un calcolo,
ma deve esistere un ordine totale tra le operazioni Infeed. Ad esempio, due
Infeed nel codice riportato di seguito hanno un ordine totale perché esiste una dipendenza
tra i cicli while.
result1 = while (condition, init = init_value) {
Infeed(shape)
}
result2 = while (condition, init = result1) {
Infeed(shape)
}
Le forme di tuple nidificate non sono supportate. Per una forma di tupla vuota, l'operazione Infeed è effettivamente un'operazione no-op e procede senza leggere alcun dato dall'Infeed del dispositivo.
Per informazioni su StableHLO, vedi StableHLO - infeed.
Iota
Vedi anche
XlaBuilder::Iota.
Iota(shape, iota_dimension)
Crea una costante letterale sul dispositivo anziché un trasferimento host potenzialmente di grandi dimensioni. Crea un array con la forma specificata e contiene valori che iniziano da zero e aumentano di uno lungo la dimensione specificata. Per i tipi
in virgola mobile, l'array prodotto è equivalente a ConvertElementType(Iota(...)) dove
Iota è di tipo integrale e la conversione è al tipo in virgola mobile.
| Argomenti | Tipo | Semantica |
|---|---|---|
shape |
Shape |
Forma dell'array creato da Iota() |
iota_dimension |
int64 |
La dimensione da incrementare. |
Ad esempio, Iota(s32[4, 8], 0) restituisce
[[0, 0, 0, 0, 0, 0, 0, 0 ],
[1, 1, 1, 1, 1, 1, 1, 1 ],
[2, 2, 2, 2, 2, 2, 2, 2 ],
[3, 3, 3, 3, 3, 3, 3, 3 ]]
Resi a Iota(s32[4, 8], 1)
[[0, 1, 2, 3, 4, 5, 6, 7 ],
[0, 1, 2, 3, 4, 5, 6, 7 ],
[0, 1, 2, 3, 4, 5, 6, 7 ],
[0, 1, 2, 3, 4, 5, 6, 7 ]]
Per informazioni su StableHLO, consulta StableHLO - iota.
IsFinite
Vedi anche
XlaBuilder::IsFinite.
Verifica se ogni elemento di operand è finito, ovvero non è infinito positivo o
negativo e non è NaN. Restituisce un array di valori PRED con la
stessa forma dell'input, dove ogni elemento è true se e solo se
l'elemento di input corrispondente è finito.
IsFinite(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Per informazioni su StableHLO, vedi StableHLO - is_finite.
Log
Vedi anche
XlaBuilder::Log.
Logaritmo naturale elemento per elemento x -> ln(x).
Log(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Il log supporta anche l'argomento facoltativo result_accuracy:
Log(operand, result_accuracy)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
result_accuracy
|
facoltativo ResultAccuracy
|
I tipi di precisione che l'utente può richiedere per le operazioni unarie con più implementazioni |
Per ulteriori informazioni su result_accuracy, consulta
Accuratezza dei risultati.
Per informazioni su StableHLO, vedi StableHLO - log.
Log1p
Vedi anche
XlaBuilder::Log1p.
Logaritmo naturale traslato elemento per elemento x -> ln(1+x).
Log1p(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Log1p supporta anche l'argomento facoltativo result_accuracy:
Log1p(operand, result_accuracy)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
result_accuracy
|
facoltativo ResultAccuracy
|
I tipi di precisione che l'utente può richiedere per le operazioni unarie con più implementazioni |
Per ulteriori informazioni su result_accuracy, consulta
Accuratezza dei risultati.
Per informazioni su StableHLO, vedi StableHLO - log_plus_one.
Logistica
Vedi anche
XlaBuilder::Logistic.
Calcolo della funzione logistica elemento per elemento x -> logistic(x).
Logistic(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
La logistica supporta anche l'argomento facoltativo result_accuracy:
Logistic(operand, result_accuracy)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
result_accuracy
|
facoltativo ResultAccuracy
|
I tipi di precisione che l'utente può richiedere per le operazioni unarie con più implementazioni |
Per ulteriori informazioni su result_accuracy, consulta
Accuratezza dei risultati.
Per informazioni su StableHLO, vedi StableHLO - logistic.
Mappa
Vedi anche
XlaBuilder::Map.
Map(operands..., computation, dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
operands |
sequenza di N XlaOp |
Array N di tipi T0..T{N-1} |
computation
|
XlaComputation
|
Calcolo di tipo T_0, T_1,
.., T_{N + M -1} -> S con N
parametri di tipo T e M di
tipo arbitrario. |
dimensions |
int64 array |
Array delle dimensioni della mappa |
static_operands
|
sequenza di N XlaOp
|
Operazioni statiche per l'operazione della mappa |
Applica una funzione scalare agli array operands specificati, producendo un array
delle stesse dimensioni in cui ogni elemento è il risultato della funzione mappata
applicata agli elementi corrispondenti negli array di input.
La funzione mappata è un calcolo arbitrario con la limitazione di avere
N input di tipo scalare T e un singolo output di tipo S. L'output ha
le stesse dimensioni degli operandi, tranne per il fatto che il tipo di elemento T viene sostituito
con S.
Ad esempio, Map(op1, op2, op3, computation, par1) mappa elem_out <-
computation(elem1, elem2, elem3, par1) in ogni indice (multidimensionale) degli array di input per produrre l'array di output.
Per informazioni su StableHLO, vedi StableHLO - map.
Max
Vedi anche
XlaBuilder::Max.
Esegue l'operazione max elemento per elemento sui tensori lhs e rhs.
Max(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto di trasmissione in dimensioni diverse per Max:
Max(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, consulta StableHLO - massimo.
Min
Vedi anche
XlaBuilder::Min.
Esegue l'operazione min elemento per elemento su lhs e rhs.
Min(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto della trasmissione multidimensionale per Min:
Min(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, vedi StableHLO - minimo.
Mul
Vedi anche
XlaBuilder::Mul.
Esegue il prodotto elemento per elemento di lhs e rhs.
Mul(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto per la trasmissione multidimensionale per Mul:
Mul(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, vedi StableHLO - multiply.
Neg
Vedi anche
XlaBuilder::Neg.
Negazione elemento per elemento x -> -x.
Neg(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Per informazioni su StableHLO, vedi StableHLO - negate
No
Vedi anche
XlaBuilder::Not.
Negazione logica elemento per elemento x -> !(x).
Not(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Per informazioni su StableHLO, vedi StableHLO - not.
OptimizationBarrier
Vedi anche
XlaBuilder::OptimizationBarrier.
Impedisce a qualsiasi passaggio di ottimizzazione di spostare i calcoli oltre la barriera.
OptimizationBarrier(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Garantisce che tutti gli input vengano valutati prima di qualsiasi operatore che dipende dagli output della barriera.
Per informazioni su StableHLO, vedi StableHLO - optimization_barrier.
Oppure
Vedi anche
XlaBuilder::Or.
Esegue l'operazione OR elemento per elemento di lhs e rhs .
Or(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto per la trasmissione in diverse dimensioni per Or:
Or(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, vedi StableHLO - or.
Uscita
Vedi anche
XlaBuilder::Outfeed.
Scrive gli input nel feed di output.
Outfeed(operand, shape_with_layout, outfeed_config)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
array di tipo T |
shape_with_layout |
Shape |
Definisce il layout dei dati trasferiti |
outfeed_config |
string |
Costante di configurazione per l'istruzione Outfeed |
shape_with_layout comunica la forma disposta che vogliamo estrarre.
Per informazioni su StableHLO, consulta StableHLO - outfeed.
Pad
Vedi anche
XlaBuilder::Pad.
Pad(operand, padding_value, padding_config)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
array di tipo T |
padding_value
|
XlaOp
|
scalare di tipo T per riempire il padding aggiunto |
padding_config
|
PaddingConfig
|
quantità di spaziatura interna su entrambi i bordi (bassa, alta) e tra gli elementi di ciascuna dimensione |
Espande l'array operand specificato aggiungendo un riempimento intorno all'array e tra gli elementi dell'array con il valore padding_value specificato. padding_config
specifica la quantità di spaziatura interna del bordo e la spaziatura interna per ogni
dimensione.
PaddingConfig è un campo ripetuto di PaddingConfigDimension, che contiene
tre campi per ogni dimensione: edge_padding_low, edge_padding_high e
interior_padding.
edge_padding_low e edge_padding_high specificano la quantità di spaziatura interna aggiunta
all'estremità inferiore (accanto all'indice 0) e all'estremità superiore (accanto all'indice più alto) di
ogni dimensione rispettivamente. L'importo del padding del bordo può essere negativo. Il valore assoluto del padding negativo indica il numero di elementi da rimuovere dalla dimensione specificata.
interior_padding specifica la quantità di spaziatura interna aggiunta tra due elementi
in ogni dimensione; non può essere negativa. Il padding interno viene applicato
logicamente prima del padding dei bordi, quindi in caso di padding dei bordi negativo, gli elementi
vengono rimossi dall'operando con padding interno.
Questa operazione è un'operazione no-op se tutte le coppie di padding dei bordi sono (0, 0) e tutti i valori di padding interni sono 0. La figura seguente mostra esempi di diversi valori di edge_padding e interior_padding per un array bidimensionale.

Per informazioni su StableHLO, vedi StableHLO - pad.
Parametro
Vedi anche
XlaBuilder::Parameter.
Parameter rappresenta un input di argomento per un calcolo.
PartitionID
Vedi anche
XlaBuilder::BuildPartitionId.
Produce partition_id del processo corrente.
PartitionID(shape)
| Argomenti | Tipo | Semantica |
|---|---|---|
shape |
Shape |
Forma dei dati |
PartitionID può essere visualizzato nei dump HLO, ma non è destinato a essere creato
manualmente dagli utenti finali.
Per informazioni su StableHLO, vedi StableHLO - partition_id.
PopulationCount
Vedi anche
XlaBuilder::PopulationCount.
Calcola il numero di bit impostati in ogni elemento di operand.
PopulationCount(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Per informazioni su StableHLO, vedi StableHLO - popcnt.
Pow
Vedi anche
XlaBuilder::Pow.
Esegue l'elevamento a potenza elemento per elemento di lhs per rhs.
Pow(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto di trasmissione di dimensioni diverse per Pow:
Pow(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, vedi StableHLO - power.
Reale
Vedi anche
XlaBuilder::Real.
Parte reale elemento per elemento di una forma complessa (o reale). x -> real(x). Se l'operando è un tipo con virgola mobile, Real restituisce lo stesso valore.
Real(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Per informazioni su StableHLO, vedi StableHLO - real.
Ricevuto
Vedi anche
XlaBuilder::Recv.
Recv, RecvWithTokens e RecvToHost sono operazioni che fungono da
primitive di comunicazione in HLO. Queste operazioni in genere vengono visualizzate nei dump HLO come parte
di input/output di basso livello o trasferimento tra dispositivi, ma non sono destinate a
essere create manualmente dagli utenti finali.
Recv(shape, handle)
| Argomenti | Tipo | Semantica |
|---|---|---|
shape |
Shape |
forma dei dati da ricevere |
handle |
ChannelHandle |
identificatore univoco per ogni coppia di invio/ricezione |
Riceve i dati della forma specificata da un'istruzione Send in un altro
calcolo che condivide lo stesso handle del canale. Restituisce un
XlaOp per i dati ricevuti.
Per informazioni su StableHLO, vedi StableHLO - recv.
RecvDone
Vedi anche
HloInstruction::CreateRecv e HloInstruction::CreateRecvDone.
Analogamente a Send, l'API client dell'operazione Recv rappresenta
la comunicazione sincrona. Tuttavia, l'istruzione viene scomposta internamente
in due istruzioni HLO (Recv e RecvDone) per consentire i trasferimenti
di dati asincroni.
Recv(const Shape& shape, int64 channel_id)
Alloca le risorse necessarie per ricevere i dati da un'istruzione Send
con lo stesso channel_id. Restituisce un contesto per le risorse allocate, che
viene utilizzato da un'istruzione RecvDone successiva per attendere il completamento del
trasferimento dei dati. Il contesto è una tupla di {buffer di ricezione (forma), identificatore
della richiesta (U32)} e può essere utilizzato solo da un'istruzione RecvDone.
Dato un contesto creato da un'istruzione Recv, attende il completamento del trasferimento dei dati e restituisce i dati ricevuti.
Riduci
Vedi anche
XlaBuilder::Reduce.
Applica una funzione di riduzione a uno o più array in parallelo.
Reduce(operands..., init_values..., computation, dimensions_to_reduce)
| Argomenti | Tipo | Semantica |
|---|---|---|
operands
|
Sequenza di N XlaOp
|
N array di tipo T_0,...,
T_{N-1}. |
init_values
|
Sequenza di N XlaOp
|
N scalari di tipo
T_0,..., T_{N-1}. |
computation
|
XlaComputation
|
calcolo del tipo
T_0,..., T_{N-1}, T_0,
...,T_{N-1} ->
Collate(T_0,...,
T_{N-1}). |
dimensions_to_reduce
|
int64 array
|
array non ordinato di dimensioni da ridurre. |
Dove:
- N deve essere maggiore o uguale a 1.
- Il calcolo deve essere "approssimativamente" associativo (vedi sotto).
- Tutti gli array di input devono avere le stesse dimensioni.
- Tutti i valori iniziali devono formare un'identità in
computation. - Se
N = 1,Collate(T)èT. - Se
N > 1,Collate(T_0, ..., T_{N-1})è una tupla diNelementi di tipoT.
Questa operazione riduce una o più dimensioni di ogni array di input in scalari.
Il numero di dimensioni di ogni matrice restituita è
number_of_dimensions(operand) - len(dimensions). L'output dell'operazione è
Collate(Q_0, ..., Q_N), dove Q_i è un array di tipo T_i, le cui
dimensioni sono descritte di seguito.
A diversi backend è consentito riassociare il calcolo della riduzione. Ciò può portare a differenze numeriche, poiché alcune funzioni di riduzione come l'addizione non sono associative per i numeri in virgola mobile. Tuttavia, se l'intervallo dei dati è limitato, l'addizione in virgola mobile è sufficientemente associativa per la maggior parte degli usi pratici.
Per informazioni su StableHLO, vedi StableHLO - reduce.
Esempi
Quando si riduce una dimensione in un singolo array 1D con valori [10, 11,
12, 13], con la funzione di riduzione f (ovvero computation), il risultato può essere
calcolato come
f(10, f(11, f(12, f(init_value, 13)))
ma ci sono anche molte altre possibilità, ad esempio:
f(init_value, f(f(10, f(init_value, 11)), f(f(init_value, 12), f(init_value, 13))))
Di seguito è riportato un esempio di pseudo-codice approssimativo di come potrebbe essere implementata la riduzione, utilizzando la somma come calcolo della riduzione con un valore iniziale di 0.
result_shape <- remove all dims in dimensions from operand_shape
# Iterate over all elements in result_shape. The number of r's here is equal
# to the number of dimensions of the result.
for r0 in range(result_shape[0]), r1 in range(result_shape[1]), ...:
# Initialize this result element
result[r0, r1...] <- 0
# Iterate over all the reduction dimensions
for d0 in range(dimensions[0]), d1 in range(dimensions[1]), ...:
# Increment the result element with the value of the operand's element.
# The index of the operand's element is constructed from all ri's and di's
# in the right order (by construction ri's and di's together index over the
# whole operand shape).
result[r0, r1...] += operand[ri... di]
Ecco un esempio di riduzione di un array bidimensionale (matrice). La forma ha 2 dimensioni, la dimensione 0 di dimensione 2 e la dimensione 1 di dimensione 3:

Risultati della riduzione delle dimensioni 0 o 1 con una funzione "add":

Tieni presente che entrambi i risultati della riduzione sono array 1D. Il diagramma mostra una come colonna e l'altra come riga solo per comodità visiva.
Per un esempio più complesso, ecco un array 3D. Il numero di dimensioni è 3, la dimensione 0 è di 4, la dimensione 1 è di 2 e la dimensione 2 è di 3. Per semplicità, i valori da 1 a 6 vengono replicati nella dimensione 0.

Analogamente all'esempio 2D, possiamo ridurre una sola dimensione. Se riduciamo la dimensione 0, ad esempio, otteniamo un array bidimensionale in cui tutti i valori della dimensione 0 sono stati ripiegati in uno scalare:
| 4 8 12 |
| 16 20 24 |
Se riduciamo la dimensione 2, otteniamo anche un array bidimensionale in cui tutti i valori della dimensione 2 sono stati ripiegati in uno scalare:
| 6 15 |
| 6 15 |
| 6 15 |
| 6 15 |
Tieni presente che l'ordine relativo tra le dimensioni rimanenti nell'input viene mantenuto nell'output, ma ad alcune dimensioni potrebbero essere assegnati nuovi numeri (poiché il numero di dimensioni cambia).
Possiamo anche ridurre più dimensioni. L'aggiunta delle dimensioni 0 e 1 produce
l'array 1D [20, 28, 36].
La riduzione dell'array 3D in tutte le sue dimensioni produce lo scalare 84.
Variadic Reduce
Quando N > 1, la riduzione dell'applicazione della funzione è leggermente più complessa, in quanto viene
applicata contemporaneamente a tutti gli input. Gli operandi vengono forniti al
calcolo nel seguente ordine:
- Esecuzione del valore ridotto per il primo operando
- …
- Esecuzione del valore ridotto per l'ennesimo operando
- Valore di input per il primo operando
- …
- Valore di input per l'ennesimo operando
Ad esempio, considera la seguente funzione di riduzione, che può essere utilizzata per calcolare il massimo e l'argmax di un array 1D in parallelo:
f: (Float, Int, Float, Int) -> Float, Int
f(max, argmax, value, index):
if value >= max:
return (value, index)
else:
return (max, argmax)
Per gli array di input 1D V = Float[N], K = Int[N] e i valori iniziali
I_V = Float, I_K = Int, il risultato f_(N-1) della riduzione nell'unica
dimensione di input è equivalente alla seguente applicazione ricorsiva:
f_0 = f(I_V, I_K, V_0, K_0)
f_1 = f(f_0.first, f_0.second, V_1, K_1)
...
f_(N-1) = f(f_(N-2).first, f_(N-2).second, V_(N-1), K_(N-1))
Se applichi questa riduzione a un array di valori e a un array di indici sequenziali (ad es. iota), gli array verranno iterati congiuntamente e verrà restituita una tupla contenente il valore massimo e l'indice corrispondente.
ReducePrecision
Vedi anche
XlaBuilder::ReducePrecision.
Modella l'effetto della conversione dei valori in virgola mobile in un formato a precisione inferiore (ad esempio IEEE-FP16) e di nuovo nel formato originale. Il numero di bit di esponente e mantissa nel formato a precisione inferiore può essere specificato arbitrariamente, anche se tutte le dimensioni dei bit potrebbero non essere supportate in tutte le implementazioni hardware.
ReducePrecision(operand, exponent_bits, mantissa_bits)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
array di tipo virgola mobile T. |
exponent_bits |
int32 |
numero di bit dell'esponente nel formato a precisione inferiore |
mantissa_bits |
int32 |
numero di bit della mantissa nel formato a precisione inferiore |
Il risultato è un array di tipo T. I valori di input vengono arrotondati al valore
rappresentabile più vicino con il numero specificato di bit della mantissa (utilizzando la semantica "ties to even"), e tutti i valori che superano l'intervallo specificato dal numero di bit dell'esponente vengono bloccati su infinito positivo o negativo. NaN vengono conservati, anche se potrebbero essere convertiti in valori NaN canonici.
Il formato a precisione inferiore deve avere almeno un bit esponente (per
distinguere un valore zero da un valore infinito, poiché entrambi hanno una mantissa zero) e
deve avere un numero non negativo di bit mantissa. Il numero di bit dell'esponente o
della mantissa potrebbe superare il valore corrispondente per il tipo T; la parte
corrispondente della conversione è quindi semplicemente un'operazione no-op.
Per informazioni su StableHLO, vedi StableHLO - reduce_precision.
ReduceScatter
Vedi anche
XlaBuilder::ReduceScatter.
ReduceScatter è un'operazione collettiva che esegue in modo efficace un'operazione AllReduce e
poi distribuisce il risultato dividendolo in shard_count blocchi lungo
scatter_dimension e la replica i nel gruppo di repliche riceve lo shard ith.
ReduceScatter(operand, computation, scatter_dimension, shard_count,
replica_groups, channel_id, layout, use_global_device_ids)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand
|
XlaOp
|
Matrice o tupla non vuota di matrici da ridurre tra le repliche. |
computation |
XlaComputation |
Calcolo della riduzione |
scatter_dimension |
int64 |
Dimensione da distribuire. |
shard_count
|
int64
|
Numero di blocchi da dividere
scatter_dimension |
replica_groups
|
Vettore ReplicaGroup
|
Gruppi tra cui vengono eseguite le riduzioni |
channel_id
|
facoltativo
ChannelHandle |
ID canale facoltativo per la comunicazione tra moduli |
layout
|
facoltativo Layout
|
layout della memoria specificato dall'utente |
use_global_device_ids |
facoltativo bool |
flag specificato dall'utente |
- Quando
operandè una tupla di array, la riduzione e la dispersione vengono eseguite su ciascun elemento della tupla. replica_groupsè un elenco di gruppi di repliche tra cui viene eseguita la riduzione (l'ID replica per la replica corrente può essere recuperato utilizzandoReplicaId). L'ordine delle repliche in ogni gruppo determina l'ordine in cui verrà distribuito il risultato di all-reduce.replica_groupsdeve essere vuoto (nel qual caso tutte le repliche appartengono a un unico gruppo) o contenere lo stesso numero di elementi del numero di repliche. Quando sono presenti più gruppi di repliche, devono avere tutti le stesse dimensioni. Ad esempio,replica_groups = {0, 2}, {1, 3}esegue la riduzione tra le repliche0e2e1e3, quindi distribuisce il risultato.shard_countè la dimensione di ogni gruppo di repliche. Ciò è necessario nei casi in cuireplica_groupssono vuoti. Sereplica_groupsnon è vuoto,shard_countdeve essere uguale alla dimensione di ogni gruppo di repliche.channel_idviene utilizzato per la comunicazione tra moduli: solo le operazionireduce-scattercon lo stessochannel_idpossono comunicare tra loro.layoutPer saperne di più sui layout, consulta xla::shapes.use_global_device_idsè un flag specificato dall'utente. Quandofalse(impostazione predefinita) i numeri inreplica_groupssonoReplicaIdquandotruereplica_groupsrappresentano un ID globale di (ReplicaID*partition_count+partition_id). Ad esempio:- Con 2 repliche e 4 partizioni,
- replica_groups={ {0,1,4,5},{2,3,6,7} } and use_global_device_ids=true
- group[0] = (0,0), (0,1), (1,0), (1,1)
- group[1] = (0,2), (0,3), (1,2), (1,3)
- dove ogni coppia è (replica_id, partition_id).
La forma di output è la forma di input con il scatter_dimension reso
shard_count volte più piccolo. Ad esempio, se ci sono due repliche e l'operando ha rispettivamente i valori [1.0, 2.25] e [3.0, 5.25] nelle due repliche, il valore di output di questa operazione in cui scatter_dim è 0 sarà [4.0] per la prima replica e [7.5] per la seconda replica.
Per informazioni su StableHLO, vedi StableHLO - reduce_scatter.
ReduceScatter - Example 1 - StableHLO
Nell'esempio precedente, ci sono due repliche che partecipano a ReduceScatter. Su ogni replica, l'operando ha forma f32[2,4]. Viene eseguita una riduzione totale (somma) tra le repliche, producendo un valore ridotto di forma f32[2,4] su ogni replica. Questo valore ridotto viene poi suddiviso in due parti lungo la dimensione 1, quindi ogni parte ha forma f32[2,2]. Ogni replica all'interno del gruppo di processi riceve la parte corrispondente alla sua posizione nel gruppo. Di conseguenza, l'output di ogni replica ha forma f32[2,2].
ReduceWindow
Vedi anche
XlaBuilder::ReduceWindow.
Applica una funzione di riduzione a tutti gli elementi di ogni finestra di una sequenza di array multidimensionali N, producendo come output un singolo array multidimensionale o una tupla di array multidimensionali N. Ogni array di output ha lo stesso numero di elementi del numero di posizioni valide della finestra. Un livello di pooling può essere espresso come
ReduceWindow. Analogamente a Reduce, l'computation applicato viene
sempre passato all'init_values sul lato sinistro.
ReduceWindow(operands..., init_values..., computation, window_dimensions,
window_strides, padding)
| Argomenti | Tipo | Semantica |
|---|---|---|
operands
|
N XlaOps
|
Una sequenza di N array multidimensionali di tipi T_0,..., T_{N-1}, ognuno dei quali rappresenta l'area di base su cui viene posizionata la finestra. |
init_values
|
N XlaOps
|
Gli N valori iniziali per la riduzione, uno per ciascuno degli N operandi. Per i dettagli, consulta la sezione Ridurre. |
computation
|
XlaComputation
|
Funzione di riduzione di tipo T_0,
..., T_{N-1}, T_0, ..., T_{N-1}
-> Collate(T_0, ..., T_{N-1}),
da applicare agli elementi di ogni
finestra di tutti gli operandi
di input. |
window_dimensions
|
ArraySlice<int64>
|
array di numeri interi per i valori della dimensione della finestra |
window_strides
|
ArraySlice<int64>
|
array di numeri interi per i valori di stride della finestra |
base_dilations
|
ArraySlice<int64>
|
array di numeri interi per i valori di dilatazione di base |
window_dilations
|
ArraySlice<int64>
|
array di numeri interi per i valori di dilatazione della finestra |
padding
|
Padding
|
tipo di spaziatura interna per la finestra (Padding::kSame, che aggiunge spaziatura interna in modo da avere la stessa forma di output dell'input se lo stride è 1, oppure Padding::kValid, che non utilizza spaziatura interna e "interrompe" la finestra quando non rientra più) |
Dove:
- N deve essere maggiore o uguale a 1.
- Tutti gli array di input devono avere le stesse dimensioni.
- Se
N = 1,Collate(T)èT. - Se
N > 1,Collate(T_0, ..., T_{N-1})è una tupla diNelementi di tipo(T0,...T{N-1}).
Per informazioni su StableHLO, vedi StableHLO - reduce_window.
ReduceWindow - Example 1
L'input è una matrice di dimensioni [4x6] e sia window_dimensions che window_stride_dimensions sono [2x3].
// Create a computation for the reduction (maximum).
XlaComputation max;
{
XlaBuilder builder(client_, "max");
auto y = builder.Parameter(0, ShapeUtil::MakeShape(F32, {}), "y");
auto x = builder.Parameter(1, ShapeUtil::MakeShape(F32, {}), "x");
builder.Max(y, x);
max = builder.Build().value();
}
// Create a ReduceWindow computation with the max reduction computation.
XlaBuilder builder(client_, "reduce_window_2x3");
auto shape = ShapeUtil::MakeShape(F32, {4, 6});
auto input = builder.Parameter(0, shape, "input");
builder.ReduceWindow(
input,
/*init_val=*/builder.ConstantLiteral(LiteralUtil::MinValue(F32)),
*max,
/*window_dimensions=*/{2, 3},
/*window_stride_dimensions=*/{2, 3},
Padding::kValid);

Un passo di 1 in una dimensione specifica che la posizione di una finestra nella dimensione è a un elemento di distanza dalla finestra adiacente. Per specificare che le finestre non si sovrappongono tra loro, window_stride_dimensions deve essere uguale a window_dimensions. La figura seguente illustra l'utilizzo di due diversi valori di falcata. Il padding viene applicato a ogni dimensione dell'input e i calcoli sono gli stessi di quando l'input è stato inserito con le dimensioni che ha dopo il padding.

Per un esempio di padding non banale, considera il calcolo del minimo di riduzione della finestra
(il valore iniziale è MAX_FLOAT) con dimensione 3 e passo 2 sull'array di input
[10000, 1000, 100, 10, 1]. Il riempimento kValid calcola i valori minimi su due finestre
valide: [10000, 1000, 100] e [100, 10, 1], generando l'output
[100, 1]. Il padding kSame esegue prima il padding dell'array in modo che la forma dopo
la finestra di riduzione sia uguale all'input per lo stride 1 aggiungendo elementi
iniziali su entrambi i lati, ottenendo [MAX_VALUE, 10000, 1000, 100, 10, 1,
MAX_VALUE]. L'esecuzione di reduce-window sull'array con padding opera su tre finestre [MAX_VALUE, 10000, 1000], [1000, 100, 10], [10, 1, MAX_VALUE] e produce [1000, 10, 1].
L'ordine di valutazione della funzione di riduzione è arbitrario e potrebbe essere
non deterministico. Pertanto, la funzione di riduzione non deve essere eccessivamente
sensibile alla riassociazione. Per maggiori dettagli, consulta la discussione sull'associatività nel
contesto di Reduce.
ReduceWindow - Example 2 - StableHLO
Nell'esempio riportato sopra:
Input) L'operando ha una forma di input S32[3,2]. Con i valori
[[1,2],[3,4],[5,6]]
Passaggio 1) La dilatazione di base con fattore 2 lungo la dimensione della riga inserisce dei fori tra ogni riga dell'operando. Dopo l'espansione, viene applicato un riempimento di 2 righe in alto e 1 riga in basso. Di conseguenza, il tensore diventa più alto.
Passaggio 2) Viene definita una finestra di forma [2,1], con dilatazione della finestra [3,1]. Ciò significa che ogni finestra seleziona due elementi della stessa colonna, ma il secondo elemento viene preso tre righe sotto il primo anziché direttamente sotto.
Passaggio 3) Le finestre vengono quindi fatte scorrere sull'operando con passo [4,1]. In questo modo, la finestra si sposta verso il basso di quattro righe alla volta, mentre si sposta orizzontalmente di una colonna alla volta. Le celle di riempimento vengono riempite con il valore init_value (in questo
caso init_value = 0). I valori che "rientrano" nelle celle di dilatazione vengono ignorati.
A causa del passo e del riempimento, alcune finestre si sovrappongono solo a zeri e fori,
mentre altre si sovrappongono a valori di input reali.
Passaggio 4) All'interno di ogni finestra, gli elementi vengono combinati utilizzando la funzione di riduzione (a, b) → a + b, a partire da un valore iniziale di 0. Le prime due finestre mostrano solo imbottitura e fori, quindi i loro risultati sono 0. Le finestre in basso acquisiscono i valori 3 e 4 dall'input e li restituiscono come risultati.
Risultati) L'output finale ha forma S32[2,2], con valori: [[0,0],[3,4]]
Rem
Vedi anche
XlaBuilder::Rem.
Esegue il resto elemento per elemento del dividendo lhs e del divisore rhs.
Il segno del risultato viene preso dal dividendo e il valore assoluto del risultato è sempre inferiore al valore assoluto del divisore.
Rem(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto della trasmissione in diverse dimensioni per Rem:
Rem(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, vedi StableHLO - remainder.
ReplicaId
Vedi anche
XlaBuilder::ReplicaId.
Restituisce l'ID univoco (scalare U32) della replica.
ReplicaId()
L'ID univoco di ogni replica è un numero intero senza segno nell'intervallo [0, N),
dove N è il numero di repliche. Poiché tutte le repliche eseguono lo stesso
programma, una chiamata ReplicaId() nel programma restituirà un valore diverso su
ogni replica.
Per informazioni su StableHLO, vedi StableHLO - replica_id.
Rimodella
Vedi anche
XlaBuilder::Reshape.
e l'operazione Collapse.
Rimodella le dimensioni di un array in una nuova configurazione.
Reshape(operand, dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
array di tipo T |
dimensions |
int64 vector |
vettore delle dimensioni delle nuove dimensioni |
A livello concettuale, la rimodellazione appiattisce prima una matrice in un vettore unidimensionale di valori di dati, per poi perfezionare questo vettore in una nuova forma. Gli argomenti di input
sono un array arbitrario di tipo T, un vettore costante in fase di compilazione di indici di dimensione
e un vettore costante in fase di compilazione di dimensioni per il risultato.
Il vettore dimensions determina la dimensione dell'array di output. Il valore all'indice 0 di dimensions è la dimensione della dimensione 0, il valore all'indice 1 è la dimensione della dimensione 1 e così via. Il prodotto delle dimensioni dimensions deve
essere uguale al prodotto delle dimensioni dell'operando. Quando perfezioni l'array compresso
nell'array multidimensionale definito da dimensions, le dimensioni in
dimensions sono ordinate dalla variazione più lenta (più importante) a quella più veloce (meno importante).
Ad esempio, sia v un array di 24 elementi:
let v = f32[4x2x3] { { {10, 11, 12}, {15, 16, 17} },
{ {20, 21, 22}, {25, 26, 27} },
{ {30, 31, 32}, {35, 36, 37} },
{ {40, 41, 42}, {45, 46, 47} } };
let v012_24 = Reshape(v, {24});
then v012_24 == f32[24] {10, 11, 12, 15, 16, 17, 20, 21, 22, 25, 26, 27,
30, 31, 32, 35, 36, 37, 40, 41, 42, 45, 46, 47};
let v012_83 = Reshape(v, {8,3});
then v012_83 == f32[8x3] { {10, 11, 12}, {15, 16, 17},
{20, 21, 22}, {25, 26, 27},
{30, 31, 32}, {35, 36, 37},
{40, 41, 42}, {45, 46, 47} };
Come caso speciale, reshape può trasformare un array a un solo elemento in uno scalare e viceversa. Ad esempio,
Reshape(f32[1x1] { {5} }, {}) == 5;
Reshape(5, {1,1}) == f32[1x1] { {5} };
Per informazioni su StableHLO, vedi StableHLO - reshape.
Rimodella (esplicito)
Vedi anche
XlaBuilder::Reshape.
Reshape(shape, operand)
Operazione di rimodellamento che utilizza una forma target esplicita.
| Argomenti | Tipo | Semantica |
|---|---|---|
shape |
Shape |
Forma di output di tipo T |
operand |
XlaOp |
array di tipo T |
Rev (inversione)
Vedi anche
XlaBuilder::Rev.
Rev(operand, dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
array di tipo T |
dimensions |
ArraySlice<int64> |
dimensioni da invertire |
Inverte l'ordine degli elementi nell'array operand lungo l'dimensions specificato, generando un array di output della stessa forma. Ogni elemento dell'array
di operandi in un indice multidimensionale viene memorizzato nell'array di output in un
indice trasformato. L'indice multidimensionale viene trasformato invertendo l'indice in ogni dimensione da invertire (ad esempio, se una dimensione di dimensione N è una delle dimensioni di inversione, il suo indice i viene trasformato in N - 1 - i).
Un utilizzo dell'operazione Rev è quello di invertire l'array dei pesi di convoluzione lungo le due dimensioni della finestra durante il calcolo del gradiente nelle reti neurali.
Per informazioni su StableHLO, vedi StableHLO - reverse.
RngNormal
Vedi anche
XlaBuilder::RngNormal.
Costruisce un output di una determinata forma con numeri casuali generati seguendo la distribuzione normale \(N(\mu, \sigma)\) . I parametri \(\mu\) e \(\sigma\)e la forma di output devono avere un tipo elementare a virgola mobile. Inoltre, i parametri devono essere scalari.
RngNormal(mu, sigma, shape)
| Argomenti | Tipo | Semantica |
|---|---|---|
mu |
XlaOp |
Scalare di tipo T che specifica la media dei numeri generati |
sigma
|
XlaOp
|
Scalare di tipo T che specifica la deviazione standard di generato |
shape |
Shape |
Forma di output di tipo T |
Per informazioni su StableHLO, vedi StableHLO - rng.
RngUniform
Vedi anche
XlaBuilder::RngUniform.
Costruisce un output di una determinata forma con numeri casuali generati seguendo la distribuzione uniforme sull'intervallo \([a,b)\). I parametri e il tipo di elemento di output devono essere di tipo booleano, integrale o a virgola mobile e i tipi devono essere coerenti. I backend CPU e GPU attualmente supportano solo F64, F32, F16, BF16, S64, U64, S32 e U32. Inoltre, i parametri devono essere scalari. Se \(b <= a\) il risultato è definito dall'implementazione.
RngUniform(a, b, shape)
| Argomenti | Tipo | Semantica |
|---|---|---|
a |
XlaOp |
Scalare di tipo T che specifica il limite inferiore dell'intervallo |
b |
XlaOp |
Scalare di tipo T che specifica il limite superiore dell'intervallo |
shape |
Shape |
Forma di output di tipo T |
Per informazioni su StableHLO, vedi StableHLO - rng.
RngBitGenerator
Vedi anche
XlaBuilder::RngBitGenerator.
Genera un output con una determinata forma riempita con bit casuali uniformi utilizzando l'algoritmo specificato (o il backend predefinito) e restituisce uno stato aggiornato (con la stessa forma dello stato iniziale) e i dati casuali generati.
Lo stato iniziale è lo stato iniziale della generazione di numeri casuali corrente. e la forma richiesta e i valori validi dipendono dall'algoritmo utilizzato.
L'output è garantito per essere una funzione deterministica dello stato iniziale, ma non è garantito che sia deterministico tra i backend e le diverse versioni del compilatore.
RngBitGenerator(algorithm, initial_state, shape)
| Argomenti | Tipo | Semantica |
|---|---|---|
algorithm |
RandomAlgorithm |
L'algoritmo PRNG da utilizzare. |
initial_state |
XlaOp |
Stato iniziale per l'algoritmo PRNG. |
shape |
Shape |
Forma di output per i dati generati. |
Valori disponibili per algorithm:
rng_default: Algoritmo specifico per il backend con requisiti di forma specifici per il backend.rng_three_fry: Algoritmo PRNG basato sul contatore ThreeFry. La formainitial_stateèu64[2]con valori arbitrari. Salmon et al. SC 2011. Numeri casuali paralleli: semplice come contare fino a 3.rng_philox: Algoritmo Philox per generare numeri casuali in parallelo. La formainitial_stateèu64[3]con valori arbitrari. Salmon et al. SC 2011. Numeri casuali paralleli: semplice come contare fino a 3.
Per informazioni su StableHLO, vedi StableHLO - rng_bit_generator.
RngGetAndUpdateState
Vedi anche
HloInstruction::CreateRngGetAndUpdateState.
L'API delle varie operazioni Rng viene scomposta internamente in istruzioni HLO, tra cui RngGetAndUpdateState.
RngGetAndUpdateState funge da primitiva in HLO. Questa operazione potrebbe essere visualizzata nei dump HLO, ma non è destinata a essere creata manualmente dagli utenti finali.
Serie
Vedi anche
XlaBuilder::Round.
Arrotondamento elemento per elemento, i valori pari vengono arrotondati lontano da zero.
Round(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
RoundNearestAfz
Vedi anche
XlaBuilder::RoundNearestAfz.
Esegue l'arrotondamento elemento per elemento verso l'intero più vicino, interrompendo i pareggi allontanandosi da zero.
RoundNearestAfz(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Per informazioni su StableHLO, vedi StableHLO - round_nearest_afz.
RoundNearestEven
Vedi anche
XlaBuilder::RoundNearestEven.
Arrotondamento elemento per elemento, i valori pari vengono arrotondati al numero pari più vicino.
RoundNearestEven(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Per informazioni su StableHLO, vedi StableHLO - round_nearest_even.
Rsqrt
Vedi anche
XlaBuilder::Rsqrt.
Reciproco elemento per elemento dell'operazione di radice quadrata x -> 1.0 / sqrt(x).
Rsqrt(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Rsqrt supporta anche l'argomento facoltativo result_accuracy:
Rsqrt(operand, result_accuracy)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
result_accuracy
|
facoltativo ResultAccuracy
|
I tipi di precisione che l'utente può richiedere per le operazioni unarie con più implementazioni |
Per ulteriori informazioni su result_accuracy, consulta
Accuratezza dei risultati.
Per informazioni su StableHLO, vedi StableHLO - rsqrt.
Scansione
Vedi anche
XlaBuilder::Scan.
Applica una funzione di riduzione a una matrice in una determinata dimensione, producendo uno stato finale e una matrice di valori intermedi.
Scan(inputs..., inits..., to_apply, scan_dimension,
is_reverse, is_associative)
| Argomenti | Tipo | Semantica |
|---|---|---|
inputs |
Sequenza di m XlaOp |
Le matrici da analizzare. |
inits |
Sequenza di k XlaOp |
Trasporti iniziali. |
to_apply |
XlaComputation |
Calcolo di tipo i_0, ..., i_{m-1}, c_0, ..., c_{k-1} -> (o_0, ..., o_{n-1}, c'_0, ..., c'_{k-1}). |
scan_dimension |
int64 |
La dimensione da analizzare. |
is_reverse |
bool |
Se è true, esegui la scansione in ordine inverso. |
is_associative |
bool (tri-state) |
Se il valore è true, l'operazione è associativa. |
La funzione to_apply viene applicata in sequenza agli elementi di inputs lungo
scan_dimension. Se is_reverse è false, gli elementi vengono elaborati in ordine
0 a N-1, dove N è la dimensione di scan_dimension. Se is_reverse è
true, gli elementi vengono elaborati da N-1 a 0.
La funzione to_apply accetta m + k operandi:
melementi attuali diinputs.kriporta i valori del passaggio precedente (oinitsper il primo elemento).
La funzione to_apply restituisce una tupla di valori n + k:
nelementi dioutputs.knuovi valori di riporto.
L'operazione Scan produce una tupla di valori n + k:
- Gli array di output
n, contenenti i valori di output per ogni passaggio. - I valori di riporto finali di
kdopo l'elaborazione di tutti gli elementi.
I tipi di input m devono corrispondere ai tipi dei primi parametri m di
to_apply con una dimensione di scansione aggiuntiva. I tipi degli output n devono corrispondere
ai tipi dei primi valori restituiti n di to_apply con una dimensione
di scansione aggiuntiva. La dimensione di scansione aggiuntiva tra tutti gli input e gli output deve avere
le stesse dimensioni N. I tipi degli ultimi k parametri e i valori restituiti di
to_apply, nonché le inizializzazioni k devono corrispondere.
Ad esempio (m, n, k == 1, N == 3), per il riporto iniziale i, inserisci [a, b, c], la funzione f(x, c) -> (y, c') e scan_dimension=0, is_reverse=false:
- Passaggio 0:
f(a, i) -> (y0, c0) - Passaggio 1:
f(b, c0) -> (y1, c1) - Passaggio 2:
f(c, c1) -> (y2, c2)
L'output di Scan è ([y0, y1, y2], c2).
A dispersione
Vedi anche
XlaBuilder::Scatter.
L'operazione di dispersione XLA genera una sequenza di risultati che sono i valori
dell'array di input operands, con diverse sezioni (agli indici specificati da
scatter_indices) aggiornate con la sequenza di valori in updates utilizzando
update_computation.
Scatter(operands..., scatter_indices, updates..., update_computation,
dimension_numbers, indices_are_sorted, unique_indices)
| Argomenti | Tipo | Semantica |
|---|---|---|
operands |
Sequenza di N XlaOp |
N array di tipo T_0, ..., T_N in cui distribuire i dati. |
scatter_indices |
XlaOp |
Array contenente gli indici iniziali delle sezioni da distribuire. |
updates |
Sequenza di N XlaOp |
N array di tipo T_0, ..., T_N. updates[i] contiene i valori da utilizzare per la dispersione di operands[i]. |
update_computation |
XlaComputation |
Calcolo da utilizzare per combinare i valori esistenti nell'array di input e gli aggiornamenti durante la distribuzione. Questo calcolo deve essere di tipo T_0, ..., T_N, T_0, ..., T_N -> Collate(T_0, ..., T_N). |
index_vector_dim |
int64 |
La dimensione in scatter_indices che contiene gli indici iniziali. |
update_window_dims |
ArraySlice<int64> |
L'insieme di dimensioni nella forma updates che sono dimensioni della finestra. |
inserted_window_dims |
ArraySlice<int64> |
Il set di dimensioni della finestra da inserire nella forma updates. |
scatter_dims_to_operand_dims |
ArraySlice<int64> |
Una mappa delle dimensioni dagli indici di dispersione allo spazio degli indici degli operandi. Questo array viene interpretato come mappatura di i a scatter_dims_to_operand_dims[i] . Deve essere uno a uno e totale. |
dimension_number |
ScatterDimensionNumbers |
Numeri delle dimensioni per l'operazione di dispersione |
indices_are_sorted |
bool |
Indica se è garantito che gli indici siano ordinati dal chiamante. |
unique_indices |
bool |
Indica se gli indici sono garantiti come univoci dal chiamante. |
Dove:
- N deve essere maggiore o uguale a 1.
operands[0], ...,operands[N-1] devono avere tutti le stesse dimensioni.updates[0], ...,updates[N-1] devono avere tutti le stesse dimensioni.- Se
N = 1,Collate(T)èT. - Se
N > 1,Collate(T_0, ..., T_N)è una tupla diNelementi di tipoT.
Se index_vector_dim è uguale a scatter_indices.rank, consideriamo implicitamente
che scatter_indices abbia una dimensione 1 finale.
Definiamo update_scatter_dims di tipo ArraySlice<int64> come l'insieme di
dimensioni nella forma updates che non sono in update_window_dims, in ordine
crescente.
Gli argomenti di scatter devono rispettare questi vincoli:
Ogni array
updatesdeve avereupdate_window_dims.size + scatter_indices.rank - 1dimensioni.I limiti della dimensione
iin ogni arrayupdatesdevono rispettare quanto segue:- Se
iè presente inupdate_window_dims(ovvero è uguale aupdate_window_dims[k] per qualchek), il limite della dimensioneiinupdatesnon deve superare il limite corrispondente dioperanddopo aver tenuto conto diinserted_window_dims(ovveroadjusted_window_bounds[k], doveadjusted_window_boundscontiene i limiti dioperandcon i limiti agli indiciinserted_window_dimsrimossi). - Se
iè presente inupdate_scatter_dims(ovvero è uguale aupdate_scatter_dims[k] per qualchek), allora il limite della dimensioneiinupdatesdeve essere uguale al limite corrispondente discatter_indices, saltandoindex_vector_dim(ovveroscatter_indices.shape.dims[k], sek<index_vector_dimescatter_indices.shape.dims[k+1] altrimenti).
- Se
update_window_dimsdeve essere in ordine crescente, non deve contenere numeri di dimensioni ripetuti e deve essere compreso nell'intervallo[0, updates.rank).inserted_window_dimsdeve essere in ordine crescente, non deve contenere numeri di dimensioni ripetuti e deve essere compreso nell'intervallo[0, operand.rank).operand.rankdeve essere uguale alla somma diupdate_window_dims.sizeeinserted_window_dims.size.scatter_dims_to_operand_dims.sizedeve essere uguale ascatter_indices.shape.dims[index_vector_dim] e i suoi valori devono essere compresi nell'intervallo[0, operand.rank).
Per un determinato indice U in ogni array updates, l'indice corrispondente I nell'array operands corrispondente in cui deve essere applicato questo aggiornamento viene calcolato come segue:
- Sia
G= {U[k] forkinupdate_scatter_dims}. UtilizzaGper cercare un vettore di indiceSnell'arrayscatter_indicesin modo cheS[i] =scatter_indices[Combine(G,i)] dove Combine(A, b) inserisce b nelle posizioniindex_vector_dimin A. - Crea un indice
SininoperandutilizzandoSspargendoSutilizzando la mappascatter_dims_to_operand_dims. In termini più formali:Sin[scatter_dims_to_operand_dims[k]] =S[k] sek<scatter_dims_to_operand_dims.size.Sin[_] =0altrimenti.
- Crea un indice
Winin ogni arrayoperandsdistribuendo gli indici inupdate_window_dimsinUin base ainserted_window_dims. In termini più formali:Win[window_dims_to_operand_dims(k)] =U[k] sekè inupdate_window_dims, dovewindow_dims_to_operand_dimsè la funzione monotona con dominio [0,update_window_dims.size) e intervallo [0,operand.rank) \inserted_window_dims. Ad esempio, seupdate_window_dims.sizeè4,operand.rankè6einserted_window_dimsè {0,2}, allorawindow_dims_to_operand_dimsè {0→1,1→3,2→4,3→5}).Win[_] =0altrimenti.
IèWin+Sin, dove + è l'addizione elemento per elemento.
In sintesi, l'operazione di dispersione può essere definita come segue.
- Inizializza
outputconoperands, ovvero per tutti gli indiciJ, per tutti gli indiciOnell'arrayoperands[J]:
output[J][O] =operands[J][O] - Per ogni indice
Unell'arrayupdates[J] e l'indice corrispondenteOnell'arrayoperand[J], seOè un indice valido peroutput:
(output[0][O], ...,output[N-1][O]) =update_computation(output[0][O], ..., ,output[N-1][O],updates[0][U], ...,updates[N-1][U])
L'ordine in cui vengono applicati gli aggiornamenti non è deterministico. Pertanto, quando più indici in updates fanno riferimento allo stesso indice in operands, il valore corrispondente in output sarà non deterministico.
Tieni presente che il primo parametro passato a update_computation sarà
sempre il valore corrente dell'array output e il secondo parametro
sarà sempre il valore dell'array updates. Questo è importante
soprattutto per i casi in cui update_computation non è commutativo.
Se indices_are_sorted è impostato su true, XLA può presupporre che
scatter_indices siano ordinati (in ordine crescente, dopo aver distribuito i relativi valori
in base a scatter_dims_to_operand_dims) dall'utente. In caso contrario, la semantica è definita dall'implementazione.
Se unique_indices è impostato su true, XLA può presupporre che tutti gli elementi
distribuiti siano unici. Pertanto, XLA potrebbe utilizzare operazioni non atomiche. Se
unique_indices è impostato su true e gli indici a cui vengono distribuiti non sono
univoci, la semantica è definita dall'implementazione.
Informalmente, l'operazione di dispersione può essere considerata l'inversa dell'operazione di raccolta, ovvero l'operazione di dispersione aggiorna gli elementi nell'input estratti dall'operazione di raccolta corrispondente.
Per una descrizione informale dettagliata ed esempi, consulta la sezione
"Descrizione informale" in Gather.
Per informazioni su StableHLO, vedi StableHLO - scatter.
Scatter - Example 1 - StableHLO
Nell'immagine sopra, ogni riga della tabella è un esempio di un indice di aggiornamento. Esaminiamo passo passo da sinistra(Aggiorna indice) a destra(Indice risultati):
Input) input ha forma S32[2,3,4,2]. scatter_indices ha forma
S64[2,2,3,2]. updates ha forma S32[2,2,3,1,2].
Aggiorna indice) Nell'ambito dell'input ci viene fornito update_window_dims:[3,4]. Questo
ci dice che la dimensione 3 e la dimensione 4 di updates sono le dimensioni della finestra, evidenziate in
giallo. Ciò ci consente di dedurre che update_scatter_dims = [0,1,2].
Aggiorna indice di dispersione) Mostra il valore updated_scatter_dims estratto per ciascuno.
(Il non giallo della colonna Aggiorna indice)
Indice iniziale) Se osserviamo il tensore immagine scatter_indices, possiamo vedere che i valori del passaggio precedente (Aggiorna indice di dispersione) ci forniscono la posizione dell'indice iniziale. Da index_vector_dim ci viene comunicata anche la dimensione di
starting_indices che contiene gli indici iniziali, che per
scatter_indices è la dimensione 3 con una dimensione 2.
Full Start Index) scatter_dims_to_operand_dims = [2,1] indica che il primo
elemento del vettore indice va alla dimensione dell'operando 2. Il secondo elemento del
vettore indice va alla dimensione 1 dell'operando. Le dimensioni rimanenti dell'operando vengono riempite
con 0.
Indice di batch completo) Possiamo vedere l'area evidenziata in viola in questa colonna(indice di batch completo), nella colonna Indice di dispersione aggiornamento e nella colonna Indice di aggiornamento.
Indice della finestra completa) calcolato a partire da update_window_dimensions [3,4].
Indice dei risultati) L'aggiunta di Indice iniziale completo, Indice di batching completo e Indice di finestra completo nel tensore operand. Nota che le regioni evidenziate in verde
corrispondono anche alla cifra operand. L'ultima riga viene ignorata perché
non rientra nel tensore operand.
Seleziona
Vedi anche
XlaBuilder::Select.
Costruisce un array di output dagli elementi di due array di input, in base ai valori di un array di predicati.
Select(pred, on_true, on_false)
| Argomenti | Tipo | Semantica |
|---|---|---|
pred |
XlaOp |
array di tipo PRED |
on_true |
XlaOp |
array di tipo T |
on_false |
XlaOp |
array di tipo T |
Gli array on_true e on_false devono avere la stessa forma. Questa è anche la forma dell'array di output. L'array pred deve avere la stessa dimensionalità di on_true e on_false, con il tipo di elemento PRED.
Per ogni elemento P di pred, l'elemento corrispondente dell'array di output viene
estratto da on_true se il valore di P è true e da on_false se il
valore di P è false. In quanto forma limitata di trasmissione,
pred può essere uno scalare di tipo PRED. In questo caso, l'array di output viene preso
interamente da on_true se pred è true e da on_false se pred è
false.
Esempio con pred non scalare:
let pred: PRED[4] = {true, false, false, true};
let v1: s32[4] = {1, 2, 3, 4};
let v2: s32[4] = {100, 200, 300, 400};
==>
Select(pred, v1, v2) = s32[4]{1, 200, 300, 4};
Esempio con scalare pred:
let pred: PRED = true;
let v1: s32[4] = {1, 2, 3, 4};
let v2: s32[4] = {100, 200, 300, 400};
==>
Select(pred, v1, v2) = s32[4]{1, 2, 3, 4};
Sono supportate le selezioni tra le tuple. A questo scopo, le tuple sono considerate tipi scalari. Se on_true e on_false sono tuple (che devono avere
la stessa forma), pred deve essere uno scalare di tipo PRED.
Per informazioni su StableHLO, vedi StableHLO - select
SelectAndScatter
Vedi anche
XlaBuilder::SelectAndScatter.
Questa operazione può essere considerata un'operazione composita che calcola innanzitutto
ReduceWindow sull'array operand per selezionare un elemento da ogni finestra e
poi distribuisce l'array source agli indici degli elementi selezionati per
costruire un array di output con la stessa forma dell'array operando. La funzione binaria
select viene utilizzata per selezionare un elemento da ogni finestra applicandolo
a ogni finestra e viene chiamata con la proprietà che il primo
vettore di indici del parametro è lessicograficamente inferiore al secondo
vettore di indici del parametro. La funzione select restituisce true se il primo parametro è
selezionato e restituisce false se il secondo parametro è selezionato. La
funzione deve mantenere la transitività (ovvero, se select(a, b) e select(b, c) sono
true, anche select(a, c) è true) in modo che l'elemento selezionato non
dipenda dall'ordine degli elementi attraversati per una determinata finestra.
La funzione scatter viene applicata a ogni indice selezionato nell'array di output. Richiede
due parametri scalari:
- Valore corrente all'indice selezionato nell'array di output
- Il valore di dispersione di
sourceche si applica all'indice selezionato
Combina i due parametri e restituisce un valore scalare utilizzato per aggiornare
il valore all'indice selezionato nell'array di output. Inizialmente, tutti gli indici dell'array di output sono impostati su init_value.
L'array di output ha la stessa forma dell'array operand e l'array source
deve avere la stessa forma del risultato dell'applicazione di un'operazione ReduceWindow
all'array operand. SelectAndScatter può essere utilizzato per
propagare a ritroso i valori del gradiente per un livello di pooling in una rete neurale.
SelectAndScatter(operand, select, window_dimensions, window_strides, padding,
source, init_value, scatter)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand
|
XlaOp
|
array di tipo T su cui scorrono le finestre |
select
|
XlaComputation
|
calcolo binario di tipo T, T
-> PRED, da applicare a tutti
gli elementi di ogni finestra; restituisce
true se è selezionato il primo parametro e restituisce false se
è selezionato il secondo parametro |
window_dimensions
|
ArraySlice<int64>
|
array di numeri interi per i valori della dimensione della finestra |
window_strides
|
ArraySlice<int64>
|
array di numeri interi per i valori di stride della finestra |
padding
|
Padding
|
tipo di padding per la finestra (Padding::kSame o Padding::kValid) |
source
|
XlaOp
|
array di tipo T con i valori da distribuire |
init_value
|
XlaOp
|
valore scalare di tipo T per il valore iniziale dell'array di output |
scatter
|
XlaComputation
|
calcolo binario di tipo T, T
-> T, per applicare ogni elemento di origine
di dispersione con il relativo
elemento di destinazione |
La figura seguente mostra esempi di utilizzo di SelectAndScatter, con la funzione select
che calcola il valore massimo tra i suoi parametri. Tieni presente che quando le finestre si sovrappongono, come nella figura (2) di seguito, un indice dell'array operand può essere selezionato più volte da finestre diverse. Nella figura, l'elemento di valore 9 è selezionato da entrambe le finestre in alto (blu e rossa) e la funzione di addizione binaria scatter produce l'elemento di output di valore 8 (2 + 6).

L'ordine di valutazione della funzione scatter è arbitrario e potrebbe
non essere deterministico. Pertanto, la funzione scatter non deve essere eccessivamente
sensibile alla riassociazione. Per maggiori dettagli, consulta la discussione sull'associatività nel
contesto di Reduce.
Per informazioni su StableHLO, vedi StableHLO - select_and_scatter.
Invia
Vedi anche
XlaBuilder::Send.
Send, SendWithTokens e SendToHost sono operazioni che fungono da
primitive di comunicazione in HLO. Queste operazioni in genere vengono visualizzate nei dump HLO come parte
di input/output di basso livello o trasferimento tra dispositivi, ma non sono destinate a
essere create manualmente dagli utenti finali.
Send(operand, handle)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
data to send (array of type T) |
handle |
ChannelHandle |
identificatore univoco per ogni coppia di invio/ricezione |
Invia i dati dell'operando specificato a un'istruzione Recv in un altro
calcolo che condivide lo stesso handle del canale. Non restituisce alcun dato.
Analogamente all'operazione Recv, l'API client dell'operazione Send
rappresenta la comunicazione sincrona ed è scomposta internamente in due istruzioni HLO (Send e SendDone) per consentire i trasferimenti di dati asincroni. Vedi
anche
HloInstruction::CreateSend e HloInstruction::CreateSendDone.
Send(HloInstruction operand, int64 channel_id)
Avvia un trasferimento asincrono dell'operando alle risorse allocate dall'istruzione Recv con lo stesso ID canale. Restituisce un contesto, che viene utilizzato da un'istruzione SendDone successiva per attendere il completamento del trasferimento dei dati. Il contesto è una tupla di {operando (forma), identificatore della richiesta
(U32)} e può essere utilizzato solo da un'istruzione SendDone.
Per informazioni su StableHLO, vedi StableHLO - send.
SendDone
Vedi anche
HloInstruction::CreateSendDone.
SendDone(HloInstruction context)
Dato un contesto creato da un'istruzione Send, attende il completamento del trasferimento dei dati. L'istruzione non restituisce dati.
Pianificazione delle istruzioni del canale
L'ordine di esecuzione delle quattro istruzioni per ogni canale (Recv, RecvDone,
Send, SendDone) è il seguente.

Recvsi verifica prima diSendSendsi verifica prima diRecvDoneRecvsi verifica prima diRecvDoneSendsi verifica prima diSendDone
Quando i compilatori di backend generano una pianificazione lineare per ogni calcolo che comunica tramite istruzioni del canale, non devono esserci cicli tra i calcoli. Ad esempio, le pianificazioni riportate di seguito causano deadlock.

SetDimensionSize
Vedi anche
XlaBuilder::SetDimensionSize.
Imposta la dimensione dinamica della dimensione specificata di XlaOp. L'operando deve essere un array con una forma.
SetDimensionSize(operand, val, dimension)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
Array di input n-dimensionale. |
val |
XlaOp |
int32 che rappresenta la dimensione dinamica del runtime. |
dimension
|
int64
|
Un valore nell'intervallo [0, n) che specifica la
dimensione. |
Passa l'operando come risultato, con la dimensione dinamica monitorata dal compilatore.
I valori di riempimento verranno ignorati dalle operazioni di riduzione downstream.
let v: f32[10] = f32[10]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
let five: s32 = 5;
let six: s32 = 6;
// Setting dynamic dimension size doesn't change the upper bound of the static
// shape.
let padded_v_five: f32[10] = set_dimension_size(v, five, /*dimension=*/0);
let padded_v_six: f32[10] = set_dimension_size(v, six, /*dimension=*/0);
// sum == 1 + 2 + 3 + 4 + 5
let sum:f32[] = reduce_sum(padded_v_five);
// product == 1 * 2 * 3 * 4 * 5
let product:f32[] = reduce_product(padded_v_five);
// Changing padding size will yield different result.
// sum == 1 + 2 + 3 + 4 + 5 + 6
let sum:f32[] = reduce_sum(padded_v_six);
ShiftLeft
Vedi anche
XlaBuilder::ShiftLeft.
Esegue l'operazione di spostamento a sinistra elemento per elemento su lhs di rhs bit.
ShiftLeft(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto per la trasmissione in diverse dimensioni per ShiftLeft:
ShiftLeft(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, vedi StableHLO - shift_left.
ShiftRightArithmetic
Vedi anche
XlaBuilder::ShiftRightArithmetic.
Esegue l'operazione di spostamento a destra aritmetico elemento per elemento su lhs di rhs bit.
ShiftRightArithmetic(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto di trasmissione multidimensionale per ShiftRightArithmetic:
ShiftRightArithmetic(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, vedi StableHLO - shift_right_arithmetic.
ShiftRightLogical
Vedi anche
XlaBuilder::ShiftRightLogical.
Esegue l'operazione di spostamento logico a destra elemento per elemento su lhs di rhs bit.
ShiftRightLogical(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto della trasmissione multidimensionale per ShiftRightLogical:
ShiftRightLogical(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, vedi StableHLO - shift_right_logical.
Firma
Vedi anche
XlaBuilder::Sign.
Sign(operand) Operazione di segno elemento per elemento x -> sgn(x) dove
\[\text{sgn}(x) = \begin{cases} -1 & x < 0\\ -0 & x = -0\\ NaN & x = NaN\\ +0 & x = +0\\ 1 & x > 0 \end{cases}\]
utilizzando l'operatore di confronto del tipo di elemento operand.
Sign(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Per informazioni su StableHLO, consulta StableHLO - sign.
Sin
Sin(operand) Seno per elemento x -> sin(x).
Vedi anche
XlaBuilder::Sin.
Sin(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Sin supporta anche l'argomento facoltativo result_accuracy:
Sin(operand, result_accuracy)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
result_accuracy
|
facoltativo ResultAccuracy
|
I tipi di precisione che l'utente può richiedere per le operazioni unarie con più implementazioni |
Per ulteriori informazioni su result_accuracy, consulta
Accuratezza dei risultati.
Per informazioni su StableHLO, vedi StableHLO - seno.
Sezione
Vedi anche
XlaBuilder::Slice.
Lo slicing estrae un sottoarray dall'array di input. La matrice secondaria ha lo stesso numero di dimensioni dell'input e contiene i valori all'interno di un riquadro di selezione nella matrice di input in cui le dimensioni e gli indici del riquadro di selezione sono forniti come argomenti all'operazione di sezionamento.
Slice(operand, start_indices, limit_indices, strides)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
Array N-dimensionale di tipo T |
start_indices
|
ArraySlice<int64>
|
Elenco di N numeri interi contenenti gli indici iniziali della sezione per ogni dimensione. I valori devono essere maggiori o uguali a zero. |
limit_indices
|
ArraySlice<int64>
|
Elenco di N numeri interi contenenti gli
indici finali (esclusi) della
sezione per ogni dimensione. Ogni valore
deve essere maggiore o uguale al
rispettivo valore start_indices per
la dimensione e minore o uguale
alla dimensione della dimensione. |
strides
|
ArraySlice<int64>
|
Elenco di N numeri interi che determina
il passo di input della sezione. La sezione
seleziona ogni elemento strides[d] nella
dimensione d. |
Esempio unidimensionale:
let a = {0.0, 1.0, 2.0, 3.0, 4.0}
Slice(a, {2}, {4})
// Result: {2.0, 3.0}
Esempio bidimensionale:
let b =
{ {0.0, 1.0, 2.0},
{3.0, 4.0, 5.0},
{6.0, 7.0, 8.0},
{9.0, 10.0, 11.0} }
Slice(b, {2, 1}, {4, 3})
// Result:
// { { 7.0, 8.0},
// {10.0, 11.0} }
Per informazioni su StableHLO, vedi StableHLO - slice.
Ordina
Vedi anche
XlaBuilder::Sort.
Sort(operands, comparator, dimension, is_stable)
| Argomenti | Tipo | Semantica |
|---|---|---|
operands |
ArraySlice<XlaOp> |
Gli operandi da ordinare. |
comparator |
XlaComputation |
Il calcolo del comparatore da utilizzare. |
dimension |
int64 |
La dimensione in base a cui ordinare. |
is_stable |
bool |
Indica se deve essere utilizzato l'ordinamento stabile. |
Se viene fornito un solo operando:
Se l'operando è un tensore unidimensionale (un array), il risultato è un array ordinato. Se vuoi ordinare l'array in ordine crescente, il comparatore deve eseguire un confronto minore di. Formalmente, dopo l'ordinamento dell'array, vale per tutte le posizioni di indice
i, jconi < jchecomparator(value[i], value[j]) = comparator(value[j], value[i]) = falseocomparator(value[i], value[j]) = true.Se l'operando ha un numero maggiore di dimensioni, viene ordinato in base alla dimensione fornita. Ad esempio, per un tensore bidimensionale (una matrice), un valore di dimensione pari a
0ordinerà in modo indipendente ogni colonna, mentre un valore di dimensione pari a1ordinerà in modo indipendente ogni riga. Se non viene fornito alcun numero di dimensione, viene scelta l'ultima dimensione per impostazione predefinita. Per la dimensione ordinata, viene applicato lo stesso ordine di ordinamento del caso unidimensionale.
Se vengono forniti operandi n > 1:
Tutti gli operandi
ndevono essere tensori con le stesse dimensioni. I tipi di elementi dei tensori potrebbero essere diversi.Tutti gli operandi vengono ordinati insieme, non singolarmente. A livello concettuale, gli operandi vengono trattati come una tupla. Quando viene verificato se gli elementi di ogni operando nelle posizioni dell'indice
iejdevono essere scambiati, il comparatore viene chiamato con2 * nparametri scalari, dove il parametro2 * kcorrisponde al valore nella posizioneidell'operandok-the il parametro2 * k + 1corrisponde al valore nella posizionejdell'operandok-th. In genere, il comparatore confronta quindi i parametri2 * ke2 * k + 1tra loro e potrebbe utilizzare altre coppie di parametri come criteri di spareggio.Il risultato è una tupla costituita dagli operandi in ordine ordinato (lungo la dimensione fornita, come sopra). L'operando
i-thdella tupla corrisponde all'operandoi-thdi Sort.
Ad esempio, se ci sono tre operandi operand0 = [3, 1], operand1 = [42, 50], operand2 = [-3.0, 1.1] e il comparatore confronta solo i valori di operand0 con "minore di", l'output dell'ordinamento è la tupla ([1, 3], [50, 42], [1.1, -3.0]).
Se is_stable è impostato su true, l'ordinamento è garantito per essere stabile, ovvero se
ci sono elementi considerati uguali dal comparatore, l'ordine
relativo dei valori uguali viene mantenuto. Due elementi e1 e e2 sono
uguali se e solo se comparator(e1, e2) = comparator(e2, e1) = false. Per
impostazione predefinita, is_stable è impostato su false.
Per informazioni su StableHLO, vedi StableHLO - sort.
Radq
Vedi anche
XlaBuilder::Sqrt.
Operazione di radice quadrata elemento per elemento x -> sqrt(x).
Sqrt(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Sqrt supporta anche l'argomento facoltativo result_accuracy:
Sqrt(operand, result_accuracy)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
result_accuracy
|
facoltativo ResultAccuracy
|
I tipi di precisione che l'utente può richiedere per le operazioni unarie con più implementazioni |
Per ulteriori informazioni su result_accuracy, consulta
Accuratezza dei risultati.
Per informazioni su StableHLO, vedi StableHLO - sqrt.
Sub
Vedi anche
XlaBuilder::Sub.
Esegue la sottrazione elemento per elemento di lhs e rhs.
Sub(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto della trasmissione multidimensionale per Sub:
Sub(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, vedi StableHLO - subtract.
Marrone chiaro
Vedi anche
XlaBuilder::Tan.
Tangente elemento per elemento x -> tan(x).
Tan(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Tan supporta anche l'argomento facoltativo result_accuracy:
Tan(operand, result_accuracy)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
result_accuracy
|
facoltativo ResultAccuracy
|
I tipi di precisione che l'utente può richiedere per le operazioni unarie con più implementazioni |
Per ulteriori informazioni su result_accuracy, consulta
Accuratezza dei risultati.
Per informazioni su StableHLO, vedi StableHLO - tan.
Tanh
Vedi anche
XlaBuilder::Tanh.
Tangente iperbolica elemento per elemento x -> tanh(x).
Tanh(operand)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
Tanh supporta anche l'argomento facoltativo result_accuracy:
Tanh(operand, result_accuracy)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando della funzione |
result_accuracy
|
facoltativo ResultAccuracy
|
I tipi di precisione che l'utente può richiedere per le operazioni unarie con più implementazioni |
Per ulteriori informazioni su result_accuracy, consulta
Accuratezza dei risultati.
Per informazioni su StableHLO, vedi StableHLO - tanh.
TopK
Vedi anche
XlaBuilder::TopK.
TopK trova i valori e gli indici dei k elementi più grandi o più piccoli per
l'ultima dimensione del tensore specificato.
TopK(operand, k, largest)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand
|
XlaOp
|
Il tensore da cui estrarre i primi k elementi.
Il tensore deve avere una o più dimensioni. La dimensione dell'ultima dimensione del
tensore deve essere maggiore o uguale a k. |
k |
int64 |
Il numero di elementi da estrarre. |
largest
|
bool
|
Indica se estrarre gli elementi k
più grandi o più piccoli. |
Per un tensore di input unidimensionale (un array), trova le voci kpiù grandi o più piccole
nell'array e restituisce una tupla di due array (values, indices). Pertanto, values[j] è la j-esima voce più grande/piccola in operand e il suo indice è
indices[j].
Per un tensore di input con più di una dimensione, calcola le prime k voci
lungo l'ultima dimensione, conservando tutte le altre dimensioni (righe) nell'output.
Pertanto, per un operando di forma [A, B, ..., P, Q] dove Q >= k l'output è
una tupla (values, indices) dove:
values.shape = indices.shape = [A, B, ..., P, k]
Se due elementi all'interno di una riga sono uguali, viene visualizzato per primo l'elemento con indice inferiore.
Transpose
Vedi anche l'operazione tf.reshape.
Transpose(operand, permutation)
| Argomenti | Tipo | Semantica |
|---|---|---|
operand |
XlaOp |
L'operando da trasporre. |
permutation |
ArraySlice<int64> |
Come permutare le dimensioni. |
Permuta le dimensioni dell'operando con la permutazione specificata, in modo che
∀ i . 0 ≤ i < number of dimensions ⇒
input_dimensions[permutation[i]] = output_dimensions[i].
Equivale a Reshape(operand, permutation, Permute(permutation, operand.shape.dimensions)).
Per informazioni su StableHLO, vedi StableHLO - transpose.
TriangularSolve
Vedi anche
XlaBuilder::TriangularSolve.
Risolve sistemi di equazioni lineari con matrici dei coefficienti triangolari inferiori o superiori mediante sostituzione in avanti o all'indietro. Eseguendo la trasmissione lungo le dimensioni principali, questa routine risolve uno dei sistemi di matrici op(a) * x =
b o x * op(a) = b per la variabile x, dati a e b, dove op(a)
è op(a) = a, op(a) = Transpose(a) o
op(a) = Conj(Transpose(a)).
TriangularSolve(a, b, left_side, lower, unit_diagonal, transpose_a)
| Argomenti | Tipo | Semantica |
|---|---|---|
a
|
XlaOp
|
un array bidimensionale di tipo complesso o
in virgola mobile con forma [..., M,
M]. |
b
|
XlaOp
|
a > Array bidimensionale dello stesso tipo
con forma [..., M, K] se left_side è
true, [..., K, M] altrimenti. |
left_side
|
bool
|
indica se risolvere un sistema della forma op(a) * x = b (true) o x *
op(a) = b (false). |
lower
|
bool
|
se utilizzare il triangolo superiore o inferiore
di a. |
unit_diagonal
|
bool
|
Se true, gli elementi diagonali di a vengono
considerati 1 e non vengono accessibili. |
transpose_a
|
Transpose
|
indica se utilizzare a così com'è, trasporlo o
calcolarne la trasposizione coniugata. |
I dati di input vengono letti solo dal triangolo inferiore/superiore di a, a seconda del
valore di lower. I valori dell'altro triangolo vengono ignorati. I dati di output vengono restituiti nello stesso triangolo; i valori nell'altro triangolo sono definiti dall'implementazione e possono essere qualsiasi valore.
Se il numero di dimensioni di a e b è maggiore di 2, vengono trattate
come batch di matrici, in cui tutte tranne le due dimensioni secondarie sono dimensioni
batch. a e b devono avere dimensioni del batch uguali.
Per informazioni su StableHLO, vedi StableHLO - triangular_solve.
Tupla
Vedi anche
XlaBuilder::Tuple.
Una tupla contenente un numero variabile di handle di dati, ognuno dei quali ha una propria forma.
Tuple(elements)
| Argomenti | Tipo | Semantica |
|---|---|---|
elements |
vettore di XlaOp |
Array N di tipo T |
È analogo a std::tuple in C++. Concettualmente:
let v: f32[10] = f32[10]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
let s: s32 = 5;
let t: (f32[10], s32) = tuple(v, s);
È possibile decostruire le tuple (accedervi) tramite l'operazione GetTupleElement.
Per informazioni su StableHLO, vedi StableHLO - tupla.
La funzione
Vedi anche
XlaBuilder::While.
While(condition, body, init)
| Argomenti | Tipo | Semantica |
|---|---|---|
condition
|
XlaComputation
|
XlaComputation di tipo T -> PRED che
definisce la condizione di terminazione del
ciclo. |
body
|
XlaComputation
|
XlaComputation di tipo T -> T che
definisce il corpo del ciclo. |
init
|
T
|
Valore iniziale per il parametro di
condition e body. |
Esegue in sequenza body fino a quando condition non va a buon fine. È simile a un tipico ciclo while in molti altri linguaggi, ad eccezione delle differenze e delle limitazioni elencate di seguito.
- Un nodo
Whilerestituisce un valore di tipoT, ovvero il risultato dell'ultima esecuzione dibody. - La forma del tipo
Tè determinata staticamente e deve essere la stessa in tutte le iterazioni.
I parametri T dei calcoli vengono inizializzati con il valore init nella
prima iterazione e vengono aggiornati automaticamente al nuovo risultato di body
in ogni iterazione successiva.
Un caso d'uso principale del nodo While è l'implementazione dell'esecuzione ripetuta dell'addestramento nelle reti neurali. Di seguito è riportato lo pseudocodice semplificato con un grafico
che rappresenta il calcolo. Il codice si trova in
while_test.cc.
Il tipo T in questo esempio è una Tuple costituita da un int32 per il conteggio delle iterazioni e da un vector[10] per l'accumulatore. Per 1000 iterazioni, il
ciclo continua ad aggiungere un vettore costante all'accumulatore.
// Pseudocode for the computation.
init = {0, zero_vector[10]} // Tuple of int32 and float[10].
result = init;
while (result(0) < 1000) {
iteration = result(0) + 1;
new_vector = result(1) + constant_vector[10];
result = {iteration, new_vector};
}

Per informazioni su StableHLO, vedi StableHLO - while.
Xor
Vedi anche
XlaBuilder::Xor.
Esegue l'operazione XOR elemento per elemento di lhs e rhs.
Xor(lhs, rhs)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
Le forme degli argomenti devono essere simili o compatibili. Consulta la documentazione sulla trasmissione per scoprire cosa significa che le forme sono compatibili. Il risultato di un'operazione ha una forma che è il risultato della trasmissione dei due array di input. In questa variante, le operazioni tra array di ranghi diversi non sono supportate, a meno che uno degli operandi non sia uno scalare.
Esiste una variante alternativa con supporto della trasmissione di dimensioni diverse per Xor:
Xor(lhs,rhs, broadcast_dimensions)
| Argomenti | Tipo | Semantica |
|---|---|---|
| lhs | XlaOp | Operando lato sinistro: array di tipo T |
| rhs | XlaOp | Operando lato sinistro: array di tipo T |
| broadcast_dimension | ArraySlice |
A quale dimensione nella forma di destinazione corrisponde ogni dimensione della forma dell'operando |
Questa variante dell'operazione deve essere utilizzata per le operazioni aritmetiche tra array di ranghi diversi (ad esempio l'aggiunta di una matrice a un vettore).
L'operando broadcast_dimensions aggiuntivo è una sezione di numeri interi che specifica le dimensioni da utilizzare per la trasmissione degli operandi. La semantica è descritta in dettaglio nella pagina di trasmissione.
Per informazioni su StableHLO, vedi StableHLO - xor.