Procesory
Artykuł
Mateusz Brzostek, Poniedziałek, 11 marca 2013, 07:36

Dekoder rozkazów i jednostki wykonawcze

Najważniejszą zmianą w dekoderze rozkazów jest obsługa zestawu instrukcji AVX2. Przypomnijmy, że AVX (Advanced Vector Extensions) jest obsługiwany przez procesory Sandy Bridge, Ivy Bridge, Bulldozer i Piledriver. To zestaw instrukcji SIMD (jedna instrukcja, wiele danych), który dzięki poszerzeniu wszystkich zmiennoprzecinkowych SSE z 128 b do 256 b pozwala jedną instrukcją przetwarzać dwa razy więcej danych. AVX2 poszerza do 256 b również SSE operujące na liczbach całkowitych. Haswell obsługuje też instrukcje FMA, czyli mnożenie dwóch liczb i dodawanie wyniku do trzeciej, wszystko w jednej instrukcji. Dzięki FMA dwie operacje trwające w sumie osiem cykli można zastąpić jedną. Dodatkowo zyskujemy precyzję, bo zamiast dwóch zaokrągleń (wyniku mnożenia i wyniku dodawania) następuje tylko jedno: końcowego wyniku.

Warto zauważyć, że FMA to operacje żywcem przeniesione ze świata procesorów graficznych do instrukcji x86, a AVX2, jako sposób na wektorowe przetwarzanie danych, jest koncepcyjnie podobny do sposobu, w jaki pracują GPU. Paradoksalnie AVX2 może być dla Intela krokiem w kierunku unifikacji CPU i GPU – oczywiście w odległej przyszłości. Wykorzystanie zalet instrukcji AVX2 i FMA wymaga, rzecz jasna, co najmniej skompilowania od nowa, a najlepiej dokładnej optymalizacji oprogramowania. Sporo czasu upłynie, zanim zauważymy korzyści w popularnych programach.

Obsługa AVX2 wymaga sporych zmian w jednostkach wykonawczych. Dodano nową jednostkę arytmetyki stałoprzecinkowej. Ma ona odciążyć bardziej uniwersalne główne jednostki arytmetyczne, żeby mogły w tym czasie wykonywać operacje wektorowe. 

Jeśli chcemy przetwarzać więcej danych, to trzeba też dostarczyć ich więcej do jednostek wykonawczych. Żeby „nakarmić” je danymi, dodano nową jednostkę generowania adresów do zapisywania danych do pamięci; dzięki temu dwie pozostałe mogą się zająć operacjami pobierania z niej nowych danych. Podwojono przepustowość pamięci podręcznej L1D (przechowującej dane) i L2. Szybsze pobieranie z pamięci podręcznych zwiększy wydajność także w obecnych programach.

TSX – sprzętowa pamięć transakcyjna

Choć już od dawna sprzedaje się praktycznie wyłącznie procesory wielowątkowe, mnóstwo problemów z programowaniem wielowątkowym pozostaje nierozwiązanych. Jednym z nich jest jednoczesny dostęp dwóch wątków do tych samych danych (jednego zakresu adresów w pamięci). Najczęściej w programowaniu stosuje się podejście polegające na tym, że każdy wątek blokuje dane, których używa, od momentu, w którym zaczyna ich potrzebować, do momentu, kiedy skończy wszelkie operacje i zapisze wynik. Takie podejście przy więcej niż jednym wątku może prowadzić do zakleszczeń:

Źródło: Wikipedia

Oczywiście, jest wiele technik pozwalających ominąć te problemy, ale wszystkie wymagają dodatkowych linii kodu, a im więcej wątków, tym trudniej je zastosować. Podobny problem rozwiązano już dawno w bazach danych przy użyciu transakcji; ten sam pomysł od lat jest wykorzystywany w technice STM (Software Transactional Memory – programowa pamięć transakcyjna). W tej koncepcji wszystkie operacje na pamięci są pogrupowane w transakcje, które muszą zostać wykonane w całości: do jednej transakcji może należeć odczytanie z pamięci i (po obliczeniach) zapisanie wyniku. Transakcja musi zostać wykonana w całości, żeby nie było ryzyka błędu, gdyby jakiś wątek nadpisał innemu ważne dane. By uniknąć zakleszczeń, każdemu wątkowi daje się tymczasową kopię danych, która zostanie zapisana do pamięci dopiero po potwierdzeniu, że nie nadpisuje niczego ważnego.

Transakcyjny dostęp do pamięci można zastosować przy użyciu technik programistycznych, ale wiąże się to ze znacznymi (nawet kilkukrotnymi) spadkami wydajności. Aby można było wykorzystać zalety tej techniki,  konieczne jest przyspieszanie sprzętowe. Kilka procesorów miało już taką możliwość. Na przykład IBM BlueGene/Q (używany w 4 z 10 najszybszych superkomputerów) obsługuje sprzętowo pamięć transakcyjną, a Transmeta Crusoe i Efficeon używały tej techniki (w niewidoczny dla programisty sposób) do emulowania zestawu instrukcji x86.

Mikroarchitektura Haswell również umie sprzętowo wspomagać pamięć transakcyjną. Programiści będą mieć dostęp do tej funkcji na dwa sposoby. Pierwszym jest RTM (Restricted Transactional Memory), w którym za pomocą trzech nowych instrukcji można w kodzie programu rozpocząć, zakończyć i przerwać transakcję. RTM jest „tradycyjną” implementacją pamięci transakcyjnej; pozwala programiście na pełną kontrolę nad transakcjami i wymaga napisania wielowątkowych algorytmów od nowa.

Drugim interfejsem jest HLE (Hardware Lock Elision – sprzętowe likwidowanie blokad), technika wykorzystująca możliwości sprzętu związane z pamięcią transakcyjną do przyspieszenia napisanych w tradycyjny sposób programów. HLE pozwala programiście oznaczyć partie kodu, w których między dwoma wątkami może wystąpić konflikt w dostępie do danych. Kiedy procesor napotka „blokadę” danych, optymistycznie zakłada, że nie jest ona potrzebna, i pozwala więcej niż jednemu wątkowi operować na jednych danych. Każdy wątek będzie w rzeczywistości operował na własnej, tymczasowej kopii fragmentu pamięci. Jeżeli zostanie wykryty konflikt, oba wątki zostaną cofnięte do stanu sprzed blokady pamięci i będą wykonywane w tradycyjny sposób.

HLE jest prostym sposobem na przerobienie tradycyjnego, blokującego pamięć programu na transakcyjny. Przede wszystkim nie wymaga pisania programu od zera, a jedynie małych zmian, rekompilacji i dołączenia dodatkowych bibliotek. Jest też kompatybilny z procesorami pozbawionymi jego obsługi: te po prostu zignorują wspomniane znaczniki obejmujące partię kodu. HLE, ponieważ opiera się na prostym sprzętowym wykrywaniu konfliktów, będzie skuteczny w przypadku, gdy program musi zachowawczo, „na wszelki wypadek”, blokować pamięć, żeby zapewnić poprawny wynik. W niektórych przypadkach HLE może nawet obniżać wydajność – ale programiści, którzy chcą użyć tej techniki, i tak muszą zrekompilować program, powinni też sprawdzić wydajność.

Trudno ocenić, w jakim stopniu HLE przyda się w programach użytkowych. Blokowanie dostępu do pamięci to tylko jeden z problemów, z którymi trzeba się zmierzyć w programowaniu wielowątkowym. Myślimy, że na początku sprzętowa pamięć transakcyjna znajdzie zastosowanie w wyspecjalizowanych programach biznesowych i naukowych, a na korzyści dla domowych użytkowników trzeba będzie czekać latami.

Ocena artykułu:
Ocen: 14
Zaloguj się, by móc oceniać
Artykuły spokrewnione
Facebook
Ostatnio komentowane