Rozszerzenia Synchronizacji Transakcyjnej (TSX) to rozszerzenie architektury x86 o zestaw instrukcji (ISA), które dodaje sprzętowe wsparcie pamięci transakcyjnej. Ma to na celu przyspieszenie działania programów wielowątkowych, poprzez pominięcie blokad nałożonych na sekcje krytyczne. Według różnych kryteriów oceniania, TSX może zapewnić około 40% szybsze działanie aplikacji przy szczególnych typach obciążeń i 4–5 razy większą liczbę transakcji na sekundę (TPS) w systemach obsługi baz danych[1][2][3][4].
Przedsiębiorstwo Intel opublikowało dokumentację TSX w lutym 2012 roku, a sama technologia zadebiutowała w czerwcu 2013 dla wybranych modeli procesorów przedsiębiorstwa Intel opartych na mikroarchitekturze Haswell[5][6][7]. Modele procesorów Haswell o numerach poniżej 45xx, jak i serii R oraz K (z odblokowanym mnożnikiem) nie obsługują TSX[8]. W sierpniu 2014 roku przedsiębiorstwo Intel ogłosiło istnienie błędu w implementacji TSX w modelach serii Haswell, Haswell-E, Haswell-EP i wczesnych modelach procesorów o mikroarchitekturze Broadwell, co doprowadziło do wyłączenia obsługi TSX na wadliwych urządzeniach poprzez aktualizację mikrokodu[9][10].
Wsparcie emulacji TSX jest częścią programu Intel Software Development Emulator[11]. Istnieje również eksperymentalne wsparcie dla emulacji TSX w wariancie emulatora QEMU[12].
TSX oferuje dwa interfejsy programistyczne dla oznaczenia fragmentów kodu w którym ma nastąpić wykonanie transakcji.
Sprzętowe pomijanie blokady (ang. Hardware Lock Elision) - to określenie interfejsu opartego na przedrostkach zaprojektowanego tak aby był wstecznie kompatybilny z procesorami bez wsparcia TSX.
Ograniczona Pamięć Transakcyjna (ang. Restricted Transactional Memory) - to nowy zestaw instrukcji, który zapewnia większą swobodę dla programistów[13].
TSX umożliwia wykonanie spekulatywne transakcyjnych fragmentów kodu. Procesor monitoruje kilka wątków w celu wykrycia konfliktujących dostępów do pamięci, przerywając i odwracając transakcje, które nie mają szans na prawidłowe wykonanie. Przewidziano mechanizmy programowe, które wykrywają i obsługują niepowodzenia w wykonaniu transakcji[13].
Innymi słowy, pomijanie blokady przez transakcyjne wykonywanie operacji wykorzystuje transakcje pamięciowe jako szybsze tam gdzie to możliwe, podczas gdy powolny (awaryjny) sposób to wciąż działanie jak przy obecności normalnej blokady.
Sprzętowe Pomijanie Blokady (ang. Hardware Lock Elision) dodaje dwa nowe prefiksy instrukcji: XACQUIRE
i XRELEASE
. Używają one kodów operacji REPNE
/ REPE
już istniejących prefiksów (F2H
/ F3H
). Na procesorach, które nie obsługują TSX, prefiksy REPNE
/ REPE
są ignorowane dla instrukcji, dla których XACQUIRE
/ XRELEASE
są poprawne, zapewniając w ten sposób wsteczną kompatybilność[14].
Prefiks XACQUIRE
może być używany wyłącznie z poniższymi instrukcjami z jednoznacznym zastosowaniem prefiksu LOCK
: ADD
, ADC
, AND
, BTC
, BTR
, BTS
, CMPXCHG
, CMPXCHG8B
, DEC
, INC
, NEG
, NOT
, OR
, SББ
, SUB
, XOR
, XADD
i XCHG
. Instrukcja XCHG
wyjątkowo może być użyta także bez prefiksu LOCK
.
Prefiks XRELEASE
może być używany jak przy instrukcjach wymienionych powyżej, oraz z instrukcjami MOV mem, reg
i MOV mem, imm
.
HLE pozwala na spekulatywne wykonywanie sekcji krytycznych poprzez obejście blokady zapisu tak, że dla innych wątków blokada wydaje się nieaktywna. Nieudana transakcja prowadzi do ponownego uruchomienia instrukcji oznaczonej prefiksem XACQUIRE
, ale traktując instrukcję tak, jakby prefiks XACQUIRE
nie był obecny.
Ograniczona Pamięć Transakcyjna (ang. Restricted Transactional Memory) jest alternatywną implementacją dla HLE, która daje programiście możliwość zdefiniowania kodu, który jest wykonywany, gdy transakcja nie może być pomyślnie zakończona.
RTM dodaje trzy nowe instrukcje: XBEGIN
, XEND
i XABORT
. Instrukcje XBEGIN
oraz XEND
oznaczają początek i koniec transakcyjnego fragmentu kodu. Instrukcja XABORT
jednoznacznie przerywa transakcję. Błąd transakcji przekierowuje procesor na ścieżkę kodu awaryjnego, wyspecyfikowanego jako argument instrukcji XBEGIN
, ze stanem przerwania zwróconym w rejestrze ЕАХ
.
Pozycja bitu w rejestrze EAX | Znaczenie |
---|---|
0 | Ustawiony gdy przerwanie transakcji nastąpiło przez XABORT . |
1 | Gdy jest ustawiony transakcja może się powieść przy ponownej próbie. Ten bit nigdy nie jest ustawiony gdy bit 0 jest. |
2 | Ustawiony jeżeli inny procesor logiczny wykonał kolizję z adresem pamięci, która była częścią transakcji, która została przerwana. |
3 | Ustawiony gdy nastąpiło przepełnienie wewnętrznego bufora. |
4 | Ustawiony jeśli wykonanie natrafiło na breakpoint w trybie wykonania debug. |
5 | Ustawiany jeśli przerwanie nastąpiło podczas wykonana zagnieżdżonej transakcji. |
23:6 | Zarezerwowany. |
31:24 | Argument XABORT (tylko jeżeli bit 0 jest ustawiony, w przeciwnym wypadku zarezerwowane).
|
XTEST
TSX udostępnia instrukcję XTEST
, która zwraca wartość logiczną określającą czy procesor wykonuje transakcyjny fragment kodu.
Specyfikacja TSX przedsiębiorstwa Intel opisuje jak pamięć transakcyjna jest udostępniona programistom. Zachowuje przy tym szczegóły odnośnie do konkretnej implementacji pamięci[15]. Zarówno w swoim przewodniku dla developerów jak i w przewodniku dotyczącym optymalizacji Intel specyfikuje, że Haswell przetrzymuje zarówno zbiory wczytywane i zapisywane na poziomie granularnym linii pamięci podręcznej, monitorując adresy w pamięci podręcznej na dane L1[16][17][18][19]. Intel twierdzi również, że konflikty w danych są wykrywane poprzez protokół spójności pamięci podręcznej (ang. cache coherence protocol)[17].
Pamięć podręczna L1 mikroarchitektury Haswell może zawierać w danej chwili do 8 kopii tej samej pozycji z pamięci głównej. To tak zwana łączność pamięci głównej (ang. associativity). Oznacza to, że w tej implementacji przetwarzanie transakcyjne, które wykonuje zapis do 9 miejsc w pamięci, które są odwzorowywane na tę samą pamięć podręczną, zostanie przerwane. Jednak z uwagi na implementację mikroarchitektoniczną nie oznacza to, że mniejsza liczba odwołań do tej samej pamięci podręcznej gwarantuje powodzenie. Ponadto w przypadku konfiguracji procesora z technologią Hyper-Threading Technology, w których pamięć podręczna L1 jest współdzielona przez dwa wątki działające na tym samym rdzeniu, może nastąpić wyrzucenie części zawartości pamięci podręcznej na rzecz poprawnego działania bliźniaczego rdzenia[17].
Niezależne badania wskazują, że pamięć transakcyjna procesorów Haswell jest najprawdopodobniej produktem pośrednim, używającym pamięci podręcznych poszczególnych rdzeni do przechowywania danych transakcyjnych oraz punktów kontrolnych[15]. Innymi słowy Haswell raczej używa pamięci transakcyjnej zaimplementowanej na pamięci podręcznej, jako że jest to mniej ryzykowna opcja. Z drugiej strony nowsze architektury przedsiębiorstwa Intel (Skylake oraz późniejsze) mogą używać podejścia opartego na pamięci podręcznej razem z buforem organizującym pamięć (ang. memory ordering buffer (MOB)) w tym samym celu, prawdopodobnie zapewniając również pamięć transakcyjną w wielu wersjach, które będą podległe pod spekulatywną wielowątkowość[15].
W sierpniu, 2014 roku Intel ogłosił istnienie błędu w implementacji TSX na procesorach Haswell, Haswell-E, Haswell-EP oraz we wczesnych Broadwell'ach, które zmusiło przedsiębiorstwo do wyłączenia tej funkcjonalności w dotkniętych modelach poprzez aktualizację mikrokodu[9][10][20]. Błąd został naprawiony w listopadzie 2014 roku w serii produkcyjnej F-0 procesora Core M-5Y70 Broadwell z odblokowanym vPro[21].