Transactional Synchronization Extensions (TSX-NI) è un'estensione all'architettura del set di istruzioni x86 (ISA) che aggiunge il supporto alla memoria transazionale hardware, velocizzando l'esecuzione di software multi-threaded attraverso l'elisione della serratura. In base a diversi benchmark, TSX è in grado di fornire circa il 40% di esecuzione più veloce delle applicazioni in specifici carichi di lavoro, e 4-5 volte di più di transazioni di database al secondo (TPS).[1][2][3]
TSX è stato documentato da Intel nel febbraio 2012, e ha debuttato nel giugno 2013 su microprocessori Intel selezionati basati sulla microarchitettura Haswell.[4][5][6] Nei processori Haswell inferiori a 45xx così come le serie R e K (con moltiplicatore sbloccato) non supportano TSX.[7] Nell'agosto 2014, Intel ha annunciato un bug nell'implementazione del TSX sulle attuali ottimizzazioni di Haswell, Haswell-E, Haswell-EP e delle prime cpu Broadwell, che ha portato alla disabilitazione della funzione TSX sulle cpu interessate tramite un aggiornamento del microcodice.[8][9]
Il supporto per l'emulazione TSX è fornito come parte dell'emulatore di sviluppo software di Intel.[10] C'è anche un supporto sperimentale per l'emulazione TSX in QEMU.[11]
TSX fornisce due interfacce software per la designazione delle regioni di codice per l'esecuzione transazionale. Hardware Lock Elision (HLE) è un'interfaccia basata su prefisso di istruzioni progettata per essere compatibile con i processori senza supporto TSX. Restricted Transactional Memory (RTM) è una nuova interfaccia per set di istruzioni che offre una maggiore flessibilità ai programmatori.[12]
TSX consente l'esecuzione speculativa delle regioni di codice transazionale. L'hardware monitora i thread multipli per rilevare eventuali conflitti di accesso alla memoria, insieme all'interruzione e l'annullamento delle transazioni che non possono essere completate con successo. Sono previsti meccanismi per il software per il rilevamento e la gestione delle transazioni non riuscite.[12]
In altre parole, l'elisione del blocco attraverso l'esecuzione transazionale utilizza le transazioni in memoria come percorso veloce dove possibile, mentre il percorso lento (fallback) è ancora un normale blocco.
Hardware Lock Elision (HLE) aggiunge due nuovi prefissi di istruzioni, XACQUIRE
e XRELEASE
. Questi due prefissi riutilizzano gli opcode dei prefissi REPNE
/ REPE
esistenti (F2H
/ F3H
). Sui processori che non supportano TSX, i prefissi REPNE
/ REPE
vengono ignorati sulle istruzioni per le quali sono validi i prefissi XACQUIRE
/ XRELEASE
, consentendo così una retrocompatibilità.[13]
Il suggerimento del prefisso XACQUIRE
può essere utilizzato solo con le seguenti istruzioni con un esplicito prefisso LOCK
: ADD
, ADC
, AND
, BTC
, BTR
, BTS
, CMPXCHG
, CMPXCHG8B
, DEC
, INC
, NEG
, NOT
, OR
, SBB
, SUB
, XOR
, XADD
e XCHG
. L'istruzione XCHG
può essere utilizzata anche senza il prefisso LOCK
.
Il suggerimento del prefisso XRELEASE
può essere utilizzato sia con le istruzioni sopra elencate, sia con le istruzioni MOV mem, reg
e MOV mem, imm
.
Hardware Lock Elision consente l'esecuzione ottimale di una sezione critica elidendo la scrittura su un lucchetto, in modo che appaia libero ad altri threads. Una transazione fallita comporta il riavvio dell'esecuzione dall'istruzione prefissata XACQUIRE
, trattando l'istruzione come se il prefisso XACQUIRE
non fosse presente.
La Restricted Transactional Memory (RTM) è un'implementazione alternativa a HLE che offre al programmatore la flessibilità di specificare un percorso del codice di riserva che viene eseguito quando una transazione non può essere eseguita correttamente.
RTM aggiunge tre nuove istruzioni: XBEGIN
, XEND
and XABORT
. Le istruzioni XBEGIN
e XEND
segnano l'inizio e la fine di una regione di codice transazionale; l'istruzione XABORT
interrompe esplicitamente una transazione. Il fallimento della transizione reindirizza il processore al percorso del codice di riserva specificato dall'istruzione XBEGIN
, con lo stato di interruzione restituito nel registro EAX
.
Posizione del bit di registro EAX | Significato |
---|---|
0 | Impostato se l'interruzione è causata dall'istruzione XABORT .
|
1 | Se impostato, l'operazione può avere successo in caso di nuovo tentativo. Questo bit è sempre libero se il bit 0 è impostato. |
2 | Impostato se un altro processore logico era in conflitto con un indirizzo di memoria che faceva parte della transazione che ha interrotto. |
3 | Impostato se un buffer interno è eccedente. |
4 | Impostato se il punto di interruzione del debug è stato raggiunto. |
5 | Impostato se si è verificato un annullamento durante l'esecuzione di una transazione annidata. |
23:6 | Riservato. |
31:24 | Argomento XABORT (valido solo se il bit 0 è impostato, altrimenti riservato).
|
XTEST
TSX fornisce una nuova istruzione XTEST
che restituisce se il processore sta eseguendo una regione transazionale.
La specifica TSX di Intel descrive come la memoria transazionale è esposta ai programmatori, ma trattiene i dettagli sull'effettiva implementazione della memoria transazionale.[14] Intel specifica nei suoi manuali di sviluppo e ottimizzazione che Haswell mantiene sia i set di lettura e scrittura alla granularità di una linea di cache, tracciando gli indirizzi nella cache dei dati L1 del processore.[15][16][17][18] Intel afferma inoltre che i conflitti di dati sono rilevati attraverso il protocollo di coerenza della cache.[16]
La cache dati L1 di Haswell ha un'associatività di otto. Questo significa che in questa implementazione, un'esecuzione transazionale che scrive su nove posizioni distinte mappando sullo stesso set di cache si interrompe. Tuttavia, a causa delle implementazioni delle microarchitetture, questo non significa che un minor numero di accessi allo stesso set non sia garantito per non essere mai interrotto. Inoltre, nelle configurazioni cpu con tecnogia Hyper-Threading, la cache L1 è condivisa tra i due thread sullo stesso core, per cui le operazioni in un processore logico dello stesso core possono causare evasioni.[16]
Una ricerca indipendente indica che la memoria transazionale di Haswell è molto probabilmente un sistema di aggiornamento differito che utilizza le cache per-core per i dati transazionali e i checkpoint di registro.[14] In altre parole, Haswell ha maggiori probabilità di utilizzare il sistema di memoria transazionale basato sulla cache, in quanto si tratta di una scelta di implementazione molto meno rischiosa. D'altra parte, i processori Skylake e successivi potrebbero combinare questo approccio basato sulla cache con il memory ordering buffer (MOB) per lo stesso scopo, eventualmente fornendo anche una memoria transazionale multi-versione che è più adatta al multithreading speculativo.[19]
Nell'agosto 2014, Intel ha annunciato l'esistenza di un bug nell'implementazione del TSX su Haswell, Haswell-E, Haswell-EP e le prime cpu Broadwell, che ha portato alla disabilitazione della funzione TSX sulle cpu interessate tramite un aggiornamento del microcodice.[8][9][20] Il bug è stato risolto nello stepping F-0 del vPro abititato sui processori Core M-5Y70 nel novembre 2014.[21]