Wielowątkowość (architektura komputerów)

Wielowątkowość interleaved/Temporal multithreadingEdit

Główny artykuł: Temporal multithreading

Coarse-grained multithreadingEdit

Najprostszy typ wielowątkowości występuje, gdy jeden wątek działa, dopóki nie zostanie zablokowany przez zdarzenie, które normalnie spowodowałoby przeciągnięcie o długim opóźnieniu. Takim przeciągnięciem może być chybienie pamięci podręcznej, które musi uzyskać dostęp do pamięci poza układem, co może zająć setki cykli procesora, aby dane wróciły. Zamiast czekać na rozwiązanie przeciągnięcia, procesor z wątkami przełączyłby wykonywanie na inny wątek, który był gotowy do działania. Dopiero gdy dane dla poprzedniego wątku dotrą, poprzedni wątek zostanie umieszczony z powrotem na liście wątków gotowych do uruchomienia.

Na przykład:

  1. Cykl i: wydana zostaje instrukcja j z wątku A.
  2. Cykl i + 1: wydana zostaje instrukcja j + 1 z wątku A.
  3. Cykl i + 2: wydana zostaje instrukcja j + 2 z wątku A, która jest instrukcją obciążenia, która nie trafia do wszystkich pamięci podręcznych.
  4. Cykl i + 3: wywołanie harmonogramu wątków, przełączenie na wątek B.
  5. Cykl i + 4: wydawana jest instrukcja k z wątku B.
  6. Cykl i + 5: wydawana jest instrukcja k + 1 z wątku B.

Pojęciowo jest to podobne do wielozadaniowości kooperacyjnej stosowanej w systemach operacyjnych czasu rzeczywistego, w której zadania dobrowolnie rezygnują z czasu wykonywania, gdy muszą czekać na jakieś zdarzenie. Ten typ wielowątkowości znany jest jako wielowątkowość blokowa, kooperacyjna lub gruboziarnista.

Celem sprzętowego wsparcia wielowątkowości jest umożliwienie szybkiego przełączania między zablokowanym wątkiem a innym wątkiem gotowym do działania. Aby osiągnąć ten cel, kosztem sprzętowym jest powielenie rejestrów widocznych programu, jak również niektórych rejestrów sterujących procesora (takich jak licznik programu). Przełączanie z jednego wątku do drugiego oznacza, że sprzęt przełącza się z używania jednego zestawu rejestrów na inny; aby efektywnie przełączać się między aktywnymi wątkami, każdy aktywny wątek musi mieć swój własny zestaw rejestrów. Na przykład, aby szybko przełączać się między dwoma wątkami, sprzęt rejestrujący musi być instancjonowany dwukrotnie.

Dodatkowe wsparcie sprzętowe dla wielowątkowości pozwala na przełączanie wątków w jednym cyklu procesora, przynosząc poprawę wydajności. Ponadto, dodatkowy sprzęt pozwala, aby każdy wątek zachowywał się tak, jakby wykonywał się sam i nie dzielił żadnych zasobów sprzętowych z innymi wątkami, minimalizując ilość zmian programowych potrzebnych w aplikacji i systemie operacyjnym do obsługi wielowątkowości.

Wiele rodzin mikrokontrolerów i procesorów wbudowanych posiada wiele banków rejestrów, aby umożliwić szybkie przełączanie kontekstu dla przerwań. Takie schematy można uznać za rodzaj wielowątkowości blokowej pomiędzy wątkiem programu użytkownika a wątkami przerwań.

Wielowątkowość przeplatanaEdit

Główny artykuł: Procesor beczkowy

Celem wielowątkowości przeplatanej jest usunięcie z potoku wykonawczego wszystkich zastojów związanych z zależnością od danych. Ponieważ jeden wątek jest względnie niezależny od innych wątków, istnieje mniejsza szansa, że jedna instrukcja w jednym etapie pipeliningu potrzebuje wyjścia ze starszej instrukcji w rurociągu. Koncepcyjnie jest to podobne do wielozadaniowości z wyprzedzeniem (preemptive multitasking) stosowanej w systemach operacyjnych; analogią byłoby to, że wycinek czasu przyznany każdemu aktywnemu wątkowi to jeden cykl procesora.

Na przykład:

  1. Cykl i + 1: wydawana jest instrukcja z wątku B.
  2. Cykl i + 2: wydawana jest instrukcja z wątku C.

Ten typ wielowątkowości został po raz pierwszy nazwany przetwarzaniem beczkowym, w którym klepki beczki reprezentują etapy potoku i wykonujące je wątki. Interleaved, preemptive, fine-grained lub time-sliced multithreading są bardziej nowoczesną terminologią.

Oprócz kosztów sprzętowych omówionych w blokowym typie wielowątkowości, interleaved multithreading ma dodatkowy koszt każdego etapu rurociągu śledzącego identyfikator wątku instrukcji, którą przetwarza. Ponadto, ponieważ w potoku jest więcej wątków wykonywanych współbieżnie, zasoby współdzielone, takie jak pamięci podręczne i TLB, muszą być większe, aby uniknąć thrashingu między różnymi wątkami.

Wielowątkowość równoczesnaEdit

Główny artykuł: Simultaneous multithreading

Najbardziej zaawansowany typ wielowątkowości dotyczy procesorów superskalarnych. Podczas gdy normalny procesor superskalarny wydaje wiele instrukcji z pojedynczego wątku w każdym cyklu CPU, w przypadku wielowątkowości jednoczesnej (SMT) procesor superskalarny może wydawać instrukcje z wielu wątków w każdym cyklu CPU. Uznając, że każdy pojedynczy wątek ma ograniczoną ilość równoległości na poziomie instrukcji, ten typ wielowątkowości próbuje wykorzystać równoległość dostępną w wielu wątkach, aby zmniejszyć straty związane z niewykorzystanymi gniazdami wydawania.

Na przykład:

  1. Cykl i: instrukcje j i j + 1 z wątku A oraz instrukcja k z wątku B są wydawane jednocześnie.
  2. Cykl i + 1: instrukcja j + 2 z wątku A, instrukcja k + 1 z wątku B oraz instrukcja m z wątku C są wydawane jednocześnie.
  3. Cykl i + 2: instrukcja j + 3 z wątku A oraz instrukcje m + 1 i m + 2 z wątku C są wydawane jednocześnie.

Aby odróżnić inne rodzaje wielowątkowości od SMT, termin „wielowątkowość czasowa” jest używany do określenia sytuacji, w której instrukcje z tylko jednego wątku mogą być wydawane w tym samym czasie.

Oprócz kosztów sprzętowych omówionych dla wielowątkowości z przeplotem, SMT ma dodatkowy koszt każdego etapu potoku śledzącego identyfikator wątku każdej przetwarzanej instrukcji. Ponownie, współdzielone zasoby, takie jak cache i TLB muszą być dostosowane do dużej liczby aktywnie przetwarzanych wątków.

Wdrożenia obejmują DEC (później Compaq) EV8 (nieukończone), Intel Hyper-Threading Technology, IBM POWER5, Sun Microsystems UltraSPARC T2, Cray XMT oraz mikroarchitektury AMD Bulldozer i Zen.