Dzwon.

Są ci, którzy przeczytali tę wiadomość przed tobą.
Subskrybuj odbieranie artykułów świeżych.
E-mail
Nazwa
Nazwisko
Jak chcesz przeczytać dzwonek
Bez spamu

Saul. 9 września 2015 o 13:38

Wdrożenie architektury wielokrotnej silnik gier

  • Blog Intela
  • Produkcja gier
  • Programowanie równoległe
  • Rozwój strony internetowej.
  • Transfer

Wraz z pojawieniem się procesorów wielordzeniowych konieczne było stworzenie silnika do gry na podstawie architektury równoległej. Zastosowanie wszystkich procesorów systemowych - zarówno grafiki (GP), jak i Centralna (CPU) - otwiera znacznie więcej możliwości w porównaniu z silnikiem pojedynczym na podstawie tylko GP. Na przykład, używając więcej rdzeni procesora, możesz poprawić efekty wizualne, zwiększając liczbę obiektów fizycznych używanych w grze, a także osiągnąć bardziej realistyczne zachowanie postaci, wdrażając zaawansowaną sztuczną inteligencję (AI).
Rozważmy cechy wdrożenia wielokrotnej architektury silnika gry.

1. Wstęp

1.1. Przegląd

Multi-gwinted Architecture of Game Silnik umożliwia korzystanie z możliwości wszystkich procesorów platformy do maksimum. Obejmuje równolegle wykonywanie różnych bloków funkcjonalnych na wszystkich dostępnych procesorach. Nie jest to jednak łatwe do wdrożenia podobnego schematu. Oddzielne elementy silnika gry często współdziałają ze sobą, co może prowadzić do wyglądu błędów podczas jednoczesnego wykonania. W celu przetwarzania takich scenariuszy w silniku zapewniają specjalne mechanizmy synchronizacji danych, które wykluczają możliwe blokowanie. Wpisuje się również metody równoczesnej synchronizacji danych, z których można zminimalizować czas wykonania.

Aby zrozumieć reprezentowane materiały, musisz dobrze zrozumieć w nowoczesnych metod tworzenia gier komputerowych, wspieranie multithreading dla silników gry lub poprawy wydajności aplikacji jako całości.

2. Stan wykonania równoległego

Stanem wykonania równoległego jest kluczową koncepcją wielowątkowości. Tylko przez podzielenie silnika gry do indywidualnych systemów, które uruchamiają każdy w swoim trybie i praktycznie nie interakcji z resztą silnika, można osiągnąć największą skuteczność obliczeń równoległych i zmniejszyć czas potrzebny do synchronizacji. W pełni odizoluj poszczególne części silnika, eliminując wszystkie wspólne zasoby, nie jest możliwe. Jednak w przypadku operacji, takich jak uzyskiwanie danych w zakresie pozycji lub orientacji obiektów, indywidualne systemy mogą korzystać z lokalnych kopii danych, a nie wspierane zasoby. Pozwala to zminimalizować zależność danych w różnych częściach silnika. Powiadomienia o zmianach w danych ogólnych wykonanych przez oddzielny system są przekazywane do menedżera stanu, które umieszcza je w kolejce. Nazywa się to trybem wiadomości. Ten tryb zakłada, że \u200b\u200bwykonując wykonanie zadania, system silnika otrzymuje powiadomienia o zmianach i odpowiednio zaktualizować ich wewnętrzne dane. Taki mechanizm pozwala na znacząco zmniejszyć czas synchronizacji i zależność od siebie systemów.

2.1 Stany wydajności

W celu skutecznego działania Menedżer wykonawczych, zaleca się synchronizację operacji na określonym impulsie zegara. Pozwala to na jednoczesne działanie wszystkich systemów. W tym przypadku częstotliwość zegarów nie powinna być koniecznie odpowiada szybkości klatek. Tak, a czas trwania zegara nie może zależeć od częstotliwości. Można go wybrać w taki sposób, że jeden zegar odpowiada czasu wymaganym do przesyłania jednej ramy (niezależnie od jego wielkości). Innymi słowy, częstotliwość lub czas trwania zegarów określa szczególną realizację menedżera państwowego. Rysunek 1 pokazuje "wolny" tryb krok po kroku Praca, w której nie jest wymagane, aby wszystkie systemy zakończyły wykonanie operacji dla tego samego taktu. Tryb, w którym wszystkie systemy zakończają wykonanie operacji dla jednego zegara nazywa się trybem krok po kroku "twardym". Jest schematycznie przedstawiony na rysunku 2.


Rysunek 1. Status wydajności w trybie swobodnego krok po kroku

2.1.1. Darmowy tryb krok po kroku
W trybie swobodnego krok po kroku wszystkie systemy działają w sposób ciągły dla określonego okresu czasu wymaganego do uzupełnienia następnej części obliczeń. Jednak nazwa "wolna" nie powinna być rozumiana dosłownie: systemy są synchronizowane nie w dowolnym momencie czasu, są one tylko "wolni", wybierając liczbę zegarów wymaganych do wykonania następnego etapu.
Z reguły w tym trybie nie wystarczy wysłać proste powiadomienie o zmianie państwa do menedżera państwowego. Musisz także przenieść zaktualizowane dane. Wynika to z faktu, że system, który zmienił ogólne dane, może być w stanie wykonawczym, podczas gdy inny system oczekujący na te dane jest już gotowy do aktualizacji. W takim przypadku wymagana jest więcej pamięci, jak chcesz utworzyć więcej kopii danych. Dlatego "wolny" reżim nie można uznać za uniwersalne rozwiązanie na wszystkie okazje.
2.1.2. Tryb twardy krok po kroku
W tym trybie zadania wszystkich systemów są zakończone w jednym zegarze. Taki mechanizm jest łatwiejszy do wdrożenia i nie wymaga transferu zaktualizowanych danych wraz z powiadomieniem. Rzeczywiście, jeśli to konieczne, jeden system może po prostu poprosić o nowe wartości w innym systemie (oczywiście na końcu cyklu wykonania).
W trybie ciężkim można wdrożyć tryb pracy krok po kroku pseudo, dystrybuując obliczenie między różnymi krokami. W szczególności może być to konieczne do obliczeń AI, gdzie pierwszy takt jest obliczany przez początkowy "wspólny cel", który jest stopniowo określony na następujących etapach.


Rysunek 2. Status wydajności w trybie Hard Step-Step

2.2. Synchronizacja danych.

Zmiana wspólnych danych przez wiele systemów może prowadzić do konfliktu zmian. W tym przypadku, w systemie przesyłania wiadomości konieczne jest dostarczenie algorytmu do wyboru poprawnej wartości końcowej. Istnieją dwa główne podejścia na podstawie następujących kryteriów.
  • Czas: Ostateczna wartość staje się ostatnią zmianą.
  • Priorytet: Ostateczna wartość staje się zmianą dokonaną przez system z największym priorytetem. Jeśli priorytet systemów zbiega się, możesz również wziąć pod uwagę czas wprowadzania zmian.
Wszystkie przestarzałe dane (według dowolnego z kryteriów) mogą być po prostu nadpisywane lub wyłączone z kolejki powiadomień.
Ponieważ ostateczna wartość może zależeć od procedury wprowadzania zmian, względne wartości danych ogólnych mogą być bardzo trudne. W takich przypadkach należy stosować wartości bezwzględne. Następnie podczas aktualizacji lokalnych danych, system może po prostu zastąpić nowe wartości nowe. Optymalne rozwiązanie jest wybór wartości bezwzględnych lub względnych w zależności od konkretnej sytuacji. Na przykład, ogólne dane, takie jak pozycja i orientacja, muszą mieć wartości bezwzględne, ponieważ są ważne dla procedury wprowadzania zmian. Względne wartości względne można stosować, na przykład, do systemu generowania cząstek, ponieważ wszystkie informacje o cząstkach są przechowywane tylko w sobie.

3. Silnik

Podczas opracowywania silnika skupia się na elastyczność wymagana do dalszego rozszerzenia jego funkcjonalności. Zoptymalizuje to do stosowania w warunkach określonych ograniczeń (na przykład pamięci).
Silnik można podzielić na dwie części: ramy i menedżerowie. Ramy (patrz rozdział 3.1) zawiera części gry, które są replikowane podczas procesu wykonania, czyli istnieją w kilku kopiach. Zawiera również elementy związane z wdrażaniem głównego cyklu gry. Menedżerowie (patrz rozdział 3.2) to obiekty Singleton odpowiedzialne za wykonanie logicznego składnika gry.
Poniżej znajduje się schemat silnika do gry.


Rysunek 3. Ogólna architektura silnika

Należy pamiętać, że funkcjonalne moduły do \u200b\u200bgier lub systemy nie są częścią silnika. Silnik łączy je między sobą, działając jako spoiwo. Podobna organizacja modułowa umożliwia przesyłanie i rozładowanie systemów w razie potrzeby.

Interakcja silnika i systemów prowadzona jest za pomocą interfejsów. Są one wdrażane w taki sposób, aby zapewnić dostęp do silnika do funkcji systemowych i systemów - do menedżerów silnika.
Szczegółowy schemat silnika jest przedstawiony w załączniku A, "Schemat ruchu".

W rzeczywistości wszystkie systemy są niezależne od siebie (patrz rozdział 2, "Status jednoczesnego wykonywania"), czyli, mogą one wykonywać działania równolegle bez wpływu na działanie innych systemów. Jednak każda zmiana danych pociąga za sobą pewne trudności, ponieważ systemy będą musiały współdziałać ze sobą. Wymagana jest wymiana informacji między systemami w następujących przypadkach:

  • aby poinformować inny system zmieniających się wspólnych danych (na przykład pozycji lub orientacji obiektów);
  • aby wykonać funkcje, które nie są dostępne dla tego systemu (na przykład system AI odnosi się do systemu obliczania właściwości geometrycznych lub fizycznych obiektu do wykonania testu do przekraczania promieni).
W pierwszym przypadku menedżer statusu opisany w poprzedniej sekcji można wykorzystać do zarządzania informacjami. (Aby uzyskać więcej informacji na temat menedżera stanu, patrz rozdział 3.2.2, "Menedżer państwowy".)
W drugim przypadku konieczne jest wdrożenie specjalnego mechanizmu, który pozwoli na usługi jednego systemu do użycia drugiego. Pełny opis Mechanizm ten podano w sekcji 3.2.3, "Menedżer usług".

3.1. Freymvork.

Ramy służy łączenia wszystkich elementów silnika. Inicjuje silnik, z wyjątkiem menedżerów, których instancje są tworzone na całym świecie. Przechowuje również informacje o scenie. Aby osiągnąć większą elastyczność, scena jest wdrażana jako tak zwana scena uniwersalna, która zawiera obiekty uniwersalne. Są to kontenery, które łączą różne funkcjonalne części sceny. Szczegółowe informacje można znaleźć w rozdziale 3.1.2.
Główny cykl gry jest również wdrażany w ramach. Może być przedkładany schematycznie w następujący sposób.


Rysunek 4. Główny cykl gry

Silnik działa w środowisku okna, więc w pierwszym etapie cyklu gry należy przetwarzać wszystkie niedokończone okna OS. Jeśli tak się nie skończy, silnik nie odpowie na wiadomości systemowe. W drugim kroku Planista przypisuje zadania za pomocą menedżera zadań. Ten proces jest szczegółowo opisany w sekcji 3.1.1 poniżej. Po tym, kierownik państwowy (patrz sekcja 3.2.2) wysyła informacje o zmianach dokonanych przez systemy maszyn, do których może wpływać. W ostatnim kroku, w zależności od statusu wykonania, ramy określa, czy ukończyć lub kontynuować działanie silnika, na przykład, aby przejść do następnej sceny. Informacje o stanie silnika jest przechowywane w średnim menedżerze. Szczegółowe informacje można znaleźć w rozdziale 3.2.4.

3.1.1. Planista
Planista generuje sygnał zegara odniesienia z daną częstotliwością. Jeśli tryb testu odniesienia wymaga, aby następna operacja rozpocznie się natychmiast po zakończeniu poprzedniego, bez czekania na koniec zegara, częstotliwość może być nieograniczona.
Przez sygnał zegara Harmonogram za pomocą Menedżera zadań tłumaczy system do trybu wykonania. W trybie swobodnego krok po kroku (sekcja 2.1.1) Planista ankietuje system, aby określić, ile zegarów będzie potrzebny do wykonania zadania. Zgodnie z wynikami badania harmonogram określa, które systemy są gotowe do wykonania, a które zakończą pracę w określonym zegarze. Harmonogram może zmienić liczbę zegarów, jeśli każdy system wymaga więcej czasu na wykonanie. W trudnym trybie krok po kroku (sekcja 2.1.2) wszystkie systemy rozpoczynają się i zakończają wykonanie tego samego zegara, więc harmonogram czeka, gdy wszystkie systemy są zakończone.
3.1.2. Uniwersalna scena i obiekty
Uniwersalna scena i obiekty są kontenerami dla funkcjonalności wdrażane w innych systemach. Są one przeznaczone wyłącznie do interakcji z silnikiem i nie wykonują żadnych innych funkcji. Jednak można je rozszerzyć, aby korzystać z funkcji dostępnych do innych systemów. Umożliwia to osiągnięcie słabej związku. Rzeczywiście, uniwersalna scena i obiekty mogą korzystać z właściwości innych systemów bez związanych z nimi. Jest to właściwość, która wyklucza zależność od siebie systemów i daje im możliwość pracy jednocześnie.
Poniższy diagram pokazuje rozszerzenie uniwersalnej sceny i obiektu.


Rysunek 5. Rozbudowa uniwersalnej sceny i obiektu

Rozważ zasadę działania rozszerzeń w poniższym przykładzie. Przypuśćmy, że rozszerzenie uniwersalnej uniwersalnej sceny sceny jest rozszerzone, aby korzystać z wykorzystania właściwości graficznych, fizycznych i innych. W tym przypadku "Graficzna" część ekspansji będzie odpowiedzialna za inicjowanie wyświetlacza oraz do wdrożenia przepisów fizycznych dla organów stałych, takich jak grawitacja, jest jego "fizyczna" część. Sceny zawierają obiekty, więc scena uniwersalna będzie również zawierać kilka uniwersalnych obiektów. Obiekty uniwersalne można również rozszerzyć, aby zwiększyć stosowanie właściwości graficznych, fizycznych i innych. Na przykład, rysunek obiektu na ekranie zostanie zaimplementowany przez funkcje rozszerzenia graficznego, a obliczenie interakcji ciał stałych jest fizyczny.

Szczegółowy schemat interakcji silnika i systemów znajduje się w dodatku B, "schematu interakcji silnika".
Należy zauważyć, że scena uniwersalna i obiekt uniwersalny są odpowiedzialne za rejestrację wszystkich "rozszerzeń" w kierownikach państwowych, dzięki czemu wszystkie rozszerzenia mogą otrzymywać powiadomienia o zmianach dokonanych przez inne rozszerzenia (czyli inne systemy). Przykładowo możesz cytować rozszerzenie graficzne zarejestrowane w celu uzyskania powiadomień o zmianach w pozycji i orientacji przeprowadzonej przez ekspansję fizyczną.
Szczegółowe informacje na temat składników systemu można znaleźć w sekcji 5.2, "System Elements" sekcja.

3.2. Menedżerowie

Menedżerowie zarządzają pracą silnika. Są to obiekty Singleton, że menedżer każdego typu jest dostępny tylko w jednej instancji. Jest to konieczne, ponieważ powielanie zasobów menedżerów nieuchronnie prowadzi do redundancji i niekorzystnie wpłynie na wyniki. Ponadto menedżerowie są odpowiedzialni za wdrażanie wspólnych funkcji dla wszystkich systemów.
3.2.1. Menadżer zadań
Menedżer zadań jest odpowiedzialny za zarządzanie zadaniami systemowymi w basenie przepływu. Aby zapewnić optymalne N-wielokrotne skalowanie i zapobiec niepotrzebnym strumieniom, eliminując nieuzasadnione koszty do przełączenia zadań w systemie operacyjnym, pula przepływu tworzy jeden wątek na każdym procesorze.

Harmonogram wysyła listę zadań do Menedżera zadań w celu wykonania, a także informacje o zakończeniu, jakie zadania należy czekać. Otrzymuje te dane z różnych systemów. Każdy system otrzymuje tylko jedno zadanie wykonania. Ta metoda nazywa się funkcjonalną dekompozycją. Jednak w przypadku przetwarzania danych każde takie zadanie można podzielić na dowolną ilość podtasków (rozkład danych).
Poniżej znajduje się przykład dystrybucji zadania między niciami dla układu czterordzeniowego.


Rysunek 6. Przykład puli przepływowej używanej przez Menedżera zadań

Oprócz przetwarzania żądań harmonogramu w celu uzyskania dostępu do głównych zadań, Menedżer zadań może pracować w trybie inicjującym. Konsekwentnie odpytywają systemy z każdego wątku, aby mogli zainicjować lokalne huzyny danych niezbędnych do pracy.
Wskazówki dotyczące wdrażania Menedżera zadań podano w Załączniku D, "Wskazówki dotyczące wdrażania zadań".

3.2.2. State Manager.
Menedżer stanu jest częścią mechanizmu przesyłania wiadomości. Śledzi zmiany i wysyła powiadomienia o nich do wszystkich systemów, które mogą mieć wpływ na wszystkie zmiany. Aby nie wysyłać niepotrzebnych powiadomień, Menedżer statusu przechowuje informacje, na których systemy powiadamiają w konkretnym przypadku. Mechanizm ten jest zaimplementowany na podstawie szablonu "Observer" (patrz Dodatek C, "Obserwator (szablon projektu)"). Jeśli mówisz krótko, ten szablon Zakłada się, że użycie "obserwatora", który jest monitorowany przez wszelkie zmiany w obiekcie, a rola medialna między nimi wykonuje kontroler zmian.

Mechanizm działa w następujący sposób. 1. Obserwator zgłasza kontroler zmian (lub kierownik stanu), zmiany, do których chce śledzić. 2. Temat powiadamia administratora o wszystkich jego zmianach. 3. W sygnale ramowym kontroler powiadamia obserwatora o zmianach w obiekcie. 4. Obserwator wysyła żądanie, aby otrzymywać zaktualizowane dane.

W trybie Wolny tryb wykonania krok po kroku (patrz rozdział 2.1.1), wdrożenie tego mechanizmu jest nieco skomplikowane. Po pierwsze, zaktualizowane dane będą musiały zostać wysłane z powiadomieniem o zmianie. W tym trybie wysyłanie na żądanie nie ma zastosowania. Rzeczywiście, jeśli w momencie otrzymania wniosku, system odpowiedzialny za zmiany nie kończy wykonania, nie będzie w stanie zapewnić zaktualizowanych danych. Po drugie, jeśli niektóre system nie jest jeszcze gotowy, aby uzyskać zmiany na końcu zegara, Menedżer stanu będzie musiał przechowywać zmodyfikowane dane, aż cały system zarejestrowany do uzyskania zostaną osiągnięte do stanu gotowości.

W ramach istnieją dwa kierunki państwowe: do obsługi zmian na poziomie sceny i na poziomie obiektu. Zwykle wiadomości związane z scenami i przedmiotami są niezależne od siebie, więc stosowanie dwóch oddzielnych menedżerów eliminuje potrzebę przetwarzania niepotrzebnych danych. Ale jeśli na scenie konieczne jest uwzględnienie stanu dowolnego obiektu, można go zarejestrować, aby uzyskać otrzymywanie powiadomień o jego zmianach.

Aby nie wykonywać niepotrzebnej synchronizacji, menedżer stanu generuje kolejkę zmian zmiany osobno dla każdego strumienia utworzonego przez Menedżera zadań. Dlatego podczas uzyskiwania dostępu do kolejki nie jest wymagana synchronizacja. Sekcja 2.2 opisuje metodę, która może być używana do łączenia kolejek po wykonaniu.


Rysunek 7. Powiadomienie o zmianach wewnętrznych w obiekcie uniwersalnym

Zmiana powiadomień nie są konieczne do wysyłania sekwencyjnie. Istnieje sposób ich równoległej wysyłki. Wykonywanie zadania, system działa ze wszystkimi jego obiektami. Na przykład, ponieważ obiekty fizyczne współdziałają ze sobą, system fizyczny kontroluje je do poruszania się, obliczanie nowych sił itp. Podczas odbierania powiadomień obiekt system nie wchodzi w interakcję z innymi obiektami jego systemu. Interakuje z nimi z rozszerzeniami. Oznacza to, że obiekty uniwersalne są teraz niezależne od siebie i mogą być aktualizowane jednocześnie. Takie podejście nie wyklucza skrajnych przypadków, które należy wziąć pod uwagę podczas procesu synchronizacji. Jednak pozwala na wykorzystanie równoległego trybu wykonania, gdy wydawało się, że było to możliwe tylko w serii.

3.2.3. Menedżer usług
Menedżer usług świadczy systemy dostępu do funkcji innych systemów, które w przeciwnym razie byłyby niedostępne. Ważne jest, aby zrozumieć, że dostęp do funkcji prowadzi się za pomocą interfejsów, a nie bezpośrednio. Informacje o interfejsach systemowych są również przechowywane w menedżerze usług.
Aby wyeliminować zależności systemów od siebie, każdy z nich ma tylko mały zestaw Usługi. Ponadto możliwość korzystania z usługi nie jest określana przez samego systemu, ale kierownik usług.


Rysunek 8. Przykładowy menedżer usług

Menedżer usług ma inną funkcję. Zapewnia dostępność systemów do właściwości innych systemów. Właściwości nazywane są określonymi wartościami określonych systemów, które nie są przesyłane w systemie wiadomości. Może to być rozdzielczość rozszerzenia ekranu w systemie graficznym lub wartość ciężkości w fizycznym. Menedżer usług otwiera dostęp do takich danych, ale nie pozwala im kontrolować ich bezpośrednio. Miejsca zmienia się w nieruchomościach w specjalnym zakręcie i publikuje je dopiero po spójnej egzekucji. Należy pamiętać, że dostęp do właściwości innego systemu jest wystarczający i nie powinien być nadużywany. Na przykład może być potrzebny do włączenia i odłączenia trybu siatki ramki w systemie graficznym z okna konsoli lub zmienić rozdzielczość ekranu na żądanie odtwarzacza z interfejsu użytkownika. Ta funkcja służy głównie do ustawienia parametrów, które nie zmieniają się z ramki do ramki.

3.2.4. Kierownik środowiska
  • Media Manager zapewnia działanie środowiska wykonania silnika. Jego funkcje można podzielić na następujące grupy.
  • Zmienne: nazwy i wartości zmiennych typowych używanych przez wszystkie części silnika. Zazwyczaj wartości zmienne są zdefiniowane, gdy scena jest ładowana lub niektóre ustawienia niestandardowe. Silnik i różne systemy mogą uzyskać do nich dostęp, wysyłając odpowiedni żądanie.
  • Wykonanie: Dane wykonawcze, takie jak wypełnianie wykonania sceny lub programu. Te parametry można zainstalować i żądać zarówno systemów, jak i silnika.
3.2.5. Menedżer platformy
Menedżer platformy wdraża abstrakcję dla wyzwań systemu operacyjnego, a także zapewnia dodatkową funkcjonalność oprócz prostej abstrakcji. Zaletą tego podejścia jest kapsułkowanie kilku typowych funkcji w jednym połączeniu. Oznacza to, że nie muszą być realizowane oddzielnie dla każdego elementu powodującego, przeciążenie jego szczegółów na temat połączeń operacyjnych.
Rozważmy jako przykład, zadzwoń do Menedżera platformy, aby pobrać dynamiczną bibliotekę systemu. Nie tylko ładuje system, ale także otrzymuje punkty wejścia funkcji i powoduje funkcję inicjalizacji biblioteki. Menedżer przechowuje również deskryptor biblioteki i rozładowuje go po zakończeniu operacji.

Menedżer platformy jest również odpowiedzialny za dostarczanie informacji na temat procesora, takich jak wspierane przez instrukcje SIMD oraz do inicjowania pewnego sposobu działania procesów. Nie można użyć innych funkcji formacji żądań systemowych.

4. Interfejsy

Interfejsy są środkami interakcji między ramami, menedżerami i systemami. Obramianie i menedżerowie są częścią silnika, więc mogą wchodzić w interakcje bezpośrednio ze sobą. Systemy do silnika nie należą. Co więcej, wszyscy wykonują różne funkcje, co prowadzi do konieczności stworzenia jednej metody interakcji z nimi. Ponieważ systemy nie mogą wchodzić w interakcje bezpośrednio z menedżerami, konieczne jest zapewnienie ich metody dostępu dla nich. W tym przypadku nie wszystkie funkcje menedżerów muszą być otwarte na systemy. Niektóre z nich są tylko dostępnymi ramami.

Interfejsy definiują zestaw funkcji wymaganych do użytku metoda standardowa Dostęp. Eliminuje ramy z konieczności poznania szczegółów wdrażania konkretnych systemów, ponieważ może się z nimi wchodzić w interakcje tylko za pomocą pewnego zestawu połączeń.

4.1. Interfejsy podmiot i obserwator

Głównym celem interfejsów obiektu i obserwatorów jest rejestracja obserwatorów do zmiany powiadomień o tym, jakich tematów, a także wysyłanie takich powiadomień. Rejestracja i pęknięcie komunikacji z obserwatorem są standardowe funkcje dla wszystkich przedmiotów uwzględnionych w realizacji ich interfejsu.

4.2. Menedżerowie interfejsów

Menedżerowie, pomimo faktu, że są obiektami Singleton, są bezpośrednio dostępne tylko dla ram. Inne systemy mogą uzyskać dostęp do menedżerów tylko przez interfejsy, które reprezentują tylko część ich ogólnej funkcjonalności. Po inicjalizacji interfejs jest przesyłany do systemu, który używa go do pracy z pewnymi funkcjami menedżerem.
Nie ma pojedynczego interfejsu dla wszystkich menedżerów. Każdy z nich ma własny oddzielny interfejs.

4.3. Interfejsy systemowe.

Aby uzyskać ramy, aby uzyskać dostęp do elementów systemu, potrzebuje interfejsów. Bez ich wspierania każdego nowy system Silnik musiałby zostać zaimplementowany osobno.
Każdy system zawiera cztery elementy, dlatego interfejsy muszą być cztery. Mianowicie: system, scena, obiekt i zadanie. Szczegółowy opis Patrz rozdział 5, "Systemy". Interfejsy to narzędzia do uzyskania dostępu do komponentów. Interfejsy systemowe umożliwiają tworzenie i usuwanie scen. Z kolei interfejsy sceny umożliwiają tworzenie i niszczenie obiektów, a także żądać informacji o głównym zadaniu systemu. Interfejs zadań jest używany głównie przez menedżera zadań podczas ustawiania zadań w puli przepływu.
Ponieważ scena i obiekt, w ramach systemu, musi współdziałać ze sobą iz uniwersalną sceną i obiektem, do którego są związane, ich interfejsy są również tworzone na podstawie interfejsów obiektów i obserwatorów.

4.4. Zmiana interfejsów.

Te interfejsy służą do przesyłania danych między systemami. Wszystkie systemy, które wprowadzają zmiany w określonym typom, muszą wdrożyć taki interfejs. Jako przykład możesz przynieść geometrię. Interfejs geometrii obejmuje metody określania elementu położenia, orientacji i skali. Każdy system, który wprowadza zmiany w geometrii, musi wdrożyć taki interfejs, dzięki czemu nie ma informacji o innych systemach, aby uzyskać dostęp do zmienionych danych.

5. Systemy

Systemy są częścią silnika odpowiedzialnego za wdrożenie funkcjonalności gier. Wykonują wszystkie główne zadania, bez którego silnik nie ma sensu. Interakcja między silnikiem a systemami odbywa się za pomocą interfejsów (patrz punkt 4.3, "Interfejsy systemowe"). Konieczne jest nie przeciążanie informacji o silniku różne rodzaje Systemy. Dzięki interfejsom proces dodawania nowego systemu staje się znacznie łatwiejszy, ponieważ silnik nie musi uwzględniać wszystkich szczegółów wdrożenia.

5.1. Typy

Systemy silnika można podzielić na kilka określonych kategorii odpowiadających standardowych częściach gry. Na przykład: geometria, grafika, fizyka (zderzenie stałych), dźwięk, przetwarzanie wejściowe, AI i animacja.
Systemy z funkcjami niestandardowymi odnoszą się do oddzielnej kategorii. Ważne jest, aby zrozumieć, że każdy system zmienia określone dane kategorii powinny być świadome interfejsu tej kategorii, ponieważ silnik nie dostarcza takich informacji.

5.2. Komponenty systemu.

Dla każdego systemu musisz wdrożyć kilka komponentów. Oto niektóre z nich: system, scena, obiekt i zadanie. Wszystkie te komponenty służą interakcji z różnymi częściami silnika.
Poniższy schemat pokazuje interakcje między różnymi komponentami.


Rysunek 9. Składniki systemu

Szczegółowy obwód łączy pomiędzy systemami silnika podano w dodatku B, "schematu interakcji silnika i systemów".

5.2.1. System
Składnik "System" lub po prostu system, jest odpowiedzialny za inicjowanie zasobów systemowych, które praktycznie nie zmieniają się podczas obsługi silnika. Na przykład, system graficzny analizuje adresy zasobów, aby określić lokalizację i przyspieszenie pobierania podczas korzystania z zasobu. Ustawia również rozdzielczość ekranu.
System jest głównym punktem wejściowym dla ram. Dostarcza informacje o sobie (na przykład typu systemu), a także metodami tworzenia i usuwania scen.
5.2.2. Scena
Składnik "Scena" lub scena systemowa jest odpowiedzialna za zarządzanie zasobami, które odnoszą się do bieżącej sceny. Scena uniwersalna wykorzystuje sceny systemowe do rozszerzenia funkcjonalności poprzez wykorzystanie swoich funkcji. Przykładowo można przynieść scenę fizyczną, która jest używana podczas tworzenia nowego świata gier i przy inicjowaniu sceny, określa w nim siły grawitacyjnego.
Sceny przewidują sposoby tworzenia i niszczenia obiektów, a także komponent "zadania" do przetwarzania sceny i metody dostępu do niego.
5.2.3. Obiekt
Komponent "Obiektowy" lub obiekt systemu, należy do sceny i jest zwykle związany z faktem, że użytkownik widzi na ekranie. Obiekt Universal używa obiektu systemowego do rozszerzenia funkcjonalności, zapewniając własne właściwości.
Przykład może służyć jako geometryczny, graficzny i fizyczny rozszerzenie uniwersalnego obiektu, aby wyświetlić drewnianą wiązkę na ekranie. Właściwości geometryczne będą obejmować pozycję, orientację i skalę obiektu. Aby go wyświetlić, system graficzny będzie używać specjalnej siatki. A system fizyczny da mu właściwości ciała stałego do obliczania interakcji z innymi organami i obecnymi siodami grawitacyjnymi.

W niektórych przypadkach w obiekcie systemowym konieczne jest rozważenie zmian w obiekcie uniwersalnym lub jednym z jego rozszerzeń. W tym celu można utworzyć specjalne połączenie, które pozwoli Ci śledzić wprowadzone zmiany.

5.2.4. Zadanie
Komponent "Zadanie" lub zadanie systemu jest używane do przetwarzania sceny. Zadanie odbiera polecenie, aby zaktualizować scenę z Menedżera zadań. Jest to sygnał startowy. funkcje systemu Na obiektach sceny.
Zadanie ma być wykonane na podtasce, dystrybuując je również za pomocą menedżera zadań do jeszcze większej liczby strumieni. Jest to wygodny sposób na skalowanie silnika na kilka procesorów. Ta metoda nazywa się rozkładu danych.
Informacje o zmianie obiektów w procesie aktualizacji zadań sceny jest przesyłane do menedżera stanu. Szczegółowe informacje na temat menedżera stanu można znaleźć w rozdziale 3.2.2.

6. Połączenie wszystkich komponentów

Wszystkie opisane powyżej elementy są połączone i są częścią jednej całości. Prace silnika można podzielić na kilka kroków opisanych w poniższych sekcjach.

6.1. Inicjalizacja etapu

Praca silnika rozpoczyna się od inicjalizacji menedżerów i ram.
  • Framework wywołuje scenę ładowarkę.
  • Określając, które systemy sceniczne będą korzystać, Downloader wywołuje Menedżer platformy, aby pobrać odpowiednie moduły.
  • Menedżer platformy ładuje odpowiednie moduły i przesyła je do menedżera interfejsu, a następnie wywołuje je do utworzenia nowego systemu.
  • Moduł zwraca wskaźnik ładowania do instancji systemu, który implementuje interfejs systemu.
  • Menedżer usług rejestruje wszystkie usługi, które zapewnia moduł systemowy.


Rysunek 10. Inicjalizacja menedżerów i systemów silnika

6.2. Scena scena pobierania

Kontrola jest zwracana przez ładowacz, który ładuje scenę.
  • Bootloader tworzy uniwersalną scenę. Aby utworzyć instancje sceny systemowej, powoduje interfejsy systemowe, rozszerzając funkcjonalność uniwersalnej sceny.
  • Scena uniwersalna określa, które dane mogą zmienić każdą scenę systemu i alerty dotyczące zmian, jakie zmiany powinny otrzymać.
  • Porównując sceny, które wykonują pewne zmiany i chcą otrzymywać powiadomienia o nich, uniwersalna scena przekazuje te informacje do menedżera państwowego.
  • Dla każdego obiektu sceny bootloader tworzy uniwersalny obiekt, a następnie określa, które systemy rozszerzy uniwersalny obiekt. Korespondencja między obiektami systemu jest określona przez ten sam schemat używany do scen. Jest również przekazywany do menedżera stanu.
  • Korzystając z uzyskanych interfejsów sceny, bootloader tworzy instancje obiektów systemowych i używa ich do rozszerzenia obiektów uniwersalnych.
  • Scheduler żąda danych z interfejsów scen o swoich głównych zadaniach, dzięki czemu w procesie wykonania tych informacji do menedżera zadań.


Rysunek 11. Inicjalizacja sceny uniwersalnej i obiektu

6.3. Gry cyklu etapu

  • Menedżer platformy służy do przetwarzania systemu Windows i innych elementów wymaganych do bieżącej platformy.
  • Następnie kontrola przechodzi planer, który czeka na koniec zegara do kontynuowania pracy.
  • Pod koniec taktu w trybie swobodnego krok po kroku planista sprawdza, jakie zadania zostały zakończone. Wszystkie zakończone zadania (to jest gotowe do wykonania) są przesyłane do menedżera zadań.
  • Harmonogram określa, które zadania zostaną zakończone dla bieżącego taktu i czeka na nich.
  • W trybie wykonania twardego etapu, operacje te powtarzają każdy zegar. Planista wysyła wszystkie zadania do menedżera i oczekuje, że wykonanie.
6.3.1. Wykonanie zadania
Kontrola trafia do Menedżera zadań.
  • Tworzy kolejkę wszystkich odebranych zadań, a następnie pojawiają się bezpłatne strumienie, rozpoczyna ich wykonanie. (Proces wykonania zadania zmienia się w zależności od systemów. Systemy mogą działać tylko z jednym zadaniem lub przetwarzanie kilku zadań z kolejki jednocześnie, wdrażając równoległe wykonanie.)
  • W procesie wykonywania zadania może działać z całą sceną lub tylko z pewnymi obiektami, zmieniającymi ich wewnętrzne dane.
  • Systemy powinny otrzymywać powiadomienia o żadnych zmianach w ogólnych danych (na przykład, pozycja lub orientacja). Dlatego podczas wykonywania zadania scena systemowa lub obiekt informujący obserwatora o wszelkich zmianach. W tym przypadku obserwator faktycznie działa jako kontroler zmiany, która jest częścią menedżera państwowego.
  • Kontroler zmian generuje kolejkę powiadomień o zmianie w celu późniejszego przetwarzania. Ignoruje zmiany, które nie dotyczą tego obserwatora.
  • Aby korzystać z niektórych usług, zadanie odnosi się do menedżera usług. Menedżer usług umożliwia również zmianę właściwości innych systemów, niedostępne dla transmisji w mechanizmie przesyłania wiadomości (na przykład, system wprowadzania danych zmienia rozszerzenie ekranu - właściwość systemu graficznego).
  • Zadania mogą również uzyskać dostęp do medium Manager, aby uzyskać zmienne środowiskowe i zmienić stan wykonania (zawieszenie wykonania, przejście do następnej sceny itp.).


Rysunek 12. Menedżer zadań i zadania

6.3.2. Aktualizacja danych.
Po wykonaniu wszystkich zadań bieżącego zegara główny cykl gry odnosi się do menedżera stanu, aby rozpocząć krok aktualizacji danych.
  • Menedżer statusu naprzemiennie powoduje, że każdy z jego kontrolerów do wysyłania nagromadzonych powiadomień. Kontroler sprawdza, co obserwatorzy wysyłają powiadomienia o zmianach dla każdego z przedmiotów.
  • Następnie nazywa pożądany obserwator i mówi mu o zmianie (powiadomienie zawiera również wskaźnik do interfejsu przedmiotowego). W trybie swobodnego wykonania krok po kroku obserwator otrzymuje zmodyfikowane dane ze sterownika Zmień, ale w trybie wykonania kroku Hard Exection powinien poprosić o ich z samego tematu.
  • Zazwyczaj obserwatorzy zainteresowani otrzymywanie powiadomień o zmianach w obiekcie systemowym są inne obiekty systemowe związane z tym samym obiektem uniwersalnym. Pozwala to podzielić proces wprowadzania zmian w kilku zadaniach, które można wykonać równolegle. Aby uprościć proces synchronizacji, wszystkie powiązane rozszerzenia obiektu uniwersalnego można łączyć w jednym zadaniu.
6.3.3. Sprawdź wydajność i wyjdź
Ostatni etap cyklu gry jest walidacją stanu środowiska wykonawczego. Istnieje kilka takich stanów: Praca, Pauza, następna scena itp. Jeśli wybrany zostanie Status "Praca", zostanie uruchomiony, następująca iteracja cyklu zostanie uruchomiona. Stan "wyjście" oznacza zakończenie cyklu, uwalnianie zasobów i wyjścia z aplikacji. Można wdrożyć inne stany, na przykład "pauza", "następna scena" itp.

7. Wnioski

Główną ideą tego artykułu jest określona w sekcji 2, "stan równoległego wykonania". Dzięki funkcjonalnej rozkładu i rozkładowi danych możliwe jest wdrożenie nie tylko silnika wielowątkowego, ale także jego skalowalność do jeszcze większej liczby jąder w przyszłości. Aby wykluczyć koszty synchronizacji, kontynuując obsługę aktualizacji danych, użyj menedżerów statusu oprócz mechanizmu przesyłania wiadomości.

Wzór "Obserwator" jest funkcją mechanizmu przesyłania wiadomości. Ważne jest, aby zrozumieć zasadę swojej pracy dobrze, aby wybrać optymalną metodę jego wdrożenia dla silnika. W rzeczywistości jest to mechanizm interakcji między różnymi systemami, który zapewnia synchronizację wspólnych danych.

Ważną rolę w dystrybucji ładunków odgrywa zarządzanie zadaniami. Dodatek D zapewnia porady dotyczące tworzenia skutecznego menedżera zadań dla silnika gry.

Jak widać, wielowątkowość silnika gry może być wdrażana dzięki jasno określonej struktury i mechanizmu przesyłania wiadomości. Dzięki nim możliwe jest znacząco zwiększyć wydajność nowoczesnych i przyszłych procesorów.

Dodatek A. Schemat silnika

Rozpoczęcie przetwarzania jest wykonywane z głównego cyklu gry (patrz rys. 4, "Główny cykl gry").


Dodatek B. System interakcji silnika i systemy


Dodatek C. Observer (szablon projektu)

Szablon "Obserwator" jest opisany szczegółowo w książce "Projekt zorientowany na akceptację. Wzory projektowe », E. Gamma, R. Helm, R. Johnson, J. Wlissides (" Wzory projektowe: elementy oprogramowania zorientowanego na obiekty wielokrotnego użytku ", Gamma E., Helm R., Johnson R., Vlissides J.). W języku angielskim została po raz pierwszy opublikowana w 1995 roku przez Addison-Wesley Publishing House.

Główną ideą tego modelu jest następujące: Jeśli niektóre elementy muszą otrzymywać powiadomienia o zmianach w innych elementach, nie są wymagane do wyświetlenia listy wszystkich możliwych zmian, próbując znaleźć wymagane dane. Model obejmuje obecność obiektu i obserwatora, które służą do wysyłania powiadomień o zmianach. Obserwator monitoruje zmiany w temacie. Kontroler zmian działa jako pośrednik między dwoma komponentami danych. Poniższy schemat ilustruje to połączenie.


Rysunek 13. Szablon "Observer"

Poniżej opisano proces korzystania z tego modelu.

  1. Regulator zmiany rejestruje obserwatora i obiekt, powiadomienia, których chce otrzymać.
  2. Kontroler zmian jest właściwie obserwator. Zamiast obserwatora, wraz z tematem, rejestruje sam. Regulator zmiany przechowuje również własną listę obserwatorów i zarejestrowani w nich.
  3. Przedmiotem przyczynia się obserwator (czyli kontroler zmiany) na listę obserwatorów, którzy chcą otrzymywać powiadomienia o jego zmianach. Czasami dodatkowo wskazuje rodzaj zmiany, która określa, które zmiany, w których zainteresowany jest obserwator. Pozwala to zoptymalizować proces wysyłania powiadomień o zmianach.
  4. Zmiana danych lub statusu, obiekt powiadamia obserwatora przez mechanizm zwrotny i przesyła informacje o zmodyfikowanych typach.
  5. Sterownik zmiany generuje kolejkę powiadomień o zmianie i czeka na sygnał do rozpowszechniania ich na obiektach i systemach.
  6. Podczas dystrybucji kontroler zmian odwołuje się do prawdziwych obserwatorów.
  7. Obserwatorzy żądają informacji o zmodyfikowanych danych lub przedmiotem tematu (lub otrzymać je razem z powiadomieniami).
  8. Przed wyjmowaniem obserwatora lub nie musi już otrzymywać powiadomień na temat obiektu, usuwa subskrypcję tego obiektu w kontrolerze zmian.
Jest wiele na różne sposoby Wdrożyć dystrybucję zadań. Jednak najlepiej jest zachować liczbę przepływów pracy równych liczbie dostępnych procesorów platformy logicznej. Staraj się nie zawierać zadań do określonego strumienia. Zadania Czas różnych systemów nie zawsze się pokrywa. Może to prowadzić do nierównego rozkładu obciążenia między przepływami pracy i wpływać na skuteczność. Aby uprościć ten proces, użyj bibliotek zarządzania zadaniami, takimi jak

Rozumiejąc się z teorią wielowątkowej, rozważ praktyczny przykład - Pentium 4. Już na etapie opracowywania tego procesora inżynierowie Intel nadal pracuje nad poprawą jego wydajności bez wprowadzania zmian w interfejsie programu. Rozważono pięć prostych sposobów:

Zwiększ częstotliwość zegara;

Umieszczenie na jednym układzie dwóch procesorów;

Wprowadzenie nowych bloków funkcjonalnych;

Przedłużenie przenośnika;

Za pomocą multithreading.

Najbardziej oczywistym sposobem poprawy prędkości jest zwiększenie częstotliwości zegara bez zmiany innych parametrów. Z reguły każdy kolejny model procesora ma nieco wyższą częstotliwość zegara niż poprzedni. Niestety, z prostym wzrostem częstotliwości zegara, deweloperzy stoją przed dwoma problemami: wzrost zużycia energii (co jest istotne dla laptopy oraz inne urządzenia komputerowe działające na bateriach) i przegrzanie (co wymaga tworzenia bardziej wydajnych radiatorów).

Drugą metodą jest umieszczenie na chipie dwóch procesorów - stosunkowo prosty, ale wiąże się z podwojeniem obszaru zajmowanego przez mikroukładkę. Jeśli każdy procesor jest dostarczany z własną pamięcią podręczną, liczba mikrokiriuchów na płycie jest ciągnąca, ale oznacza również podwojenie kosztów produkcji. Jeśli dla obu procesorów można uniknąć wspólnej pamięci podręcznej, można uniknąć znaczącego wzrostu w okupowanym obszarze, ale w tym przypadku wystąpi inny problem - ilość pamięci podręcznej w kategoriach każdego procesora jest o połowę mniejsza, a to jest nieuchronnie dotknięte wydajnością . Ponadto, jeśli profesjonalne aplikacje serwerowe są w stanie w pełni wykorzystać zasoby kilku procesorów, w konwencjonalnych programach pulpialnych wewnętrzny równoległość jest rozwijana w znacznie mniejszym stopniu.

Wprowadzenie nowych bloków funkcjonalnych nie jest również trudne, ale ważne jest, aby zachować saldo. Jakie jest znaczenie dziesięciu najlepszych bloków ALU, jeśli chip nie może wydać poleceń do przenośnika z prędkością, która umożliwia pobieranie wszystkich tych bloków?

Przenośnik ze zwiększoną liczbą etapów zdolnych do oddzielenia zadań na mniejsze segmenty i przetwarza je w krótkich okresach czasu, z jednej strony zwiększa wydajność, z drugiej, zwiększa negatywne konsekwencje nieprawidłowej prognozowania przejść, cacherów, przerywania i inne wydarzenia, które naruszają zwykłe polecenia przetwarzania kursu w procesorze. Ponadto, aby w pełni wdrożyć możliwości rozszerzonego przenośnika, konieczne jest zwiększenie częstotliwości zegara, a to, jak wiemy, prowadzi do zwiększenia zużycia energii i transferu ciepła.

Wreszcie możliwe jest wdrożenie wielowątkowości. Zaletą tej technologii jest wprowadzenie dodatkowego strumienia oprogramowania, który pozwala wejść w życie tych zasobów sprzętowych, które w przeciwnym razie byłyby proste. Zgodnie z wynikami badań eksperymentalnych, deweloperzy Intel odkryli, że wzrost obszaru mikroukolizacji o 5% w realizacji wielokrotnych dla wielu zastosowań daje wzrost w 25%. Pierwszym procesorem Intel z obsługą wielowątkowości był HEON 2002. Następnie, począwszy od częstotliwości 3,06 GHz, MultiThReading wprowadzono do Pentium 4. Władca Intel wywołuje wdrażanie wielowątkowości w hipermatochii Pentium 4 (HyperThreading).

  • Instruktaż

W tym artykule postaram się opisać terminologię wykorzystywaną do opisania systemów, które mogą wykonać kilka programów równolegle, czyli wielordzeniowy, wieloprocesorowy, wielu gwintowanych. Różne rodzaje równoległości w procesorze IA-32 pojawiły się w różnych godzinach i nieco niespójny sposób. W tym wszystkim jest to dość łatwe do zdezorientowania, zwłaszcza biorąc pod uwagę, że systemy operacyjne ostrożnie ukrywają części nie są zbyt wyrafinowane programy aplikacji.

Celem artykułu jest pokazanie, że ze wszystkimi różnorodnością możliwych konfiguracji wieloprocesora, wielordzeniowych i wielu gwintowanych systemów dla programów, które są wykonywane na nich, możliwości są tworzone zarówno do abstrakcji (różnice ignorowanie), jak i rozliczanie specyfiki (możliwość konfiguracji programu).

Ostrzeżenie o znakach ®, ™, w artykule

My wyjaśnienia, dlaczego pracownicy firm powinni korzystać z praw autorskich w komunikacji publicznej. W tym artykule musieli być często używane.

procesor

Oczywiście najbardziej starożytne, najczęściej używane i niejednoznaczne termin jest "procesorem".

W nowoczesnym świecie procesor jest wtedy (pakiet), który kupujemy w pięknym pudełku detalicznym lub niezbyt pięknej torbie OEM. Niepodzielna esencja włożona w złącze (gniazdo) płyta główna. Nawet jeśli nie ma złącza i niemożliwe jest ją usunięcie, czyli, jeśli jest szczelnie lutowany, to jest jeden układ.

Systemy mobilne (telefony, tabletki, laptopy) i większość komputerów stacjonarnych ma jeden procesor. Stacje robocze i serwery czasami przechowują dwa lub więcej procesorów na jednej płycie głównej.

Wsparcie dla kilku centralnych procesorów w jednym systemie wymaga licznych zmian w konstrukcji. Przynajmniej potrzebujesz ich zapewnić fizyczne połączenie (Podaj kilka gniazd na płycie głównej), rozwiązać problemy z identyfikacją procesora (patrz w dalszej części niniejszego artykułu, a także moją nutę), koordynowanie dostępu do pamięci i dostarczania przerwania (sterownik przerwania musi być w stanie trafić do kilku procesorów ) I oczywiście wsparcie z systemu operacyjnego. Niestety nie mogłem znaleźć dokumentalnego wspomnienia o momencie tworzenia pierwszego systemu wieloprocesora na procesorach Intel, ale Wikipedia twierdzi, że sekwencyjne systemy komputerowe już dostarczyły je w 1987 r. Korzystanie z procesorów Intel 80386. Powszechne wsparcie dla kilku frytek w jednym systemie staje się Dostępne począwszy od Intel® Pentium.

Jeśli istnieje kilka procesorów, każdy z nich ma własne złącze na tablicy. Każdy z nich ma pełne niezależne kopie wszystkich zasobów, takich jak rejestry, urządzenia wykonujące, bufory. Udostępniają ogólną pamięć - RAM. Pamięć może połączyć się z nimi na różne i raczej nietrywialne sposoby, ale jest to oddzielna historia, która wykracza poza ten artykuł. Ważne jest, aby z dowolnym scenariuszem dla programów wykonywalnych należy utworzyć iluzję jednorodnej pamięci ogólnej, dostępny ze wszystkich procesorów zawartych w systemie.


Zdjąć gotowe! Intel® Desktop Board D5400XS

Rdzeń

Historycznie, wielordzeniowy w Intel IA-32 pojawił się później Intel® HyperThreading, ale w logicznej hierarchii idzie dalej.

Wydaje się, że jeśli w systemie jest więcej procesorów, a następnie jego wydajność (na zadaniach, które mogą korzystać z wszystkich zasobów). Jednakże, jeśli koszt komunikacji między nimi jest zbyt duży, cały wygrywający równoległość zostaje zabity przez długich opóźnień w transmisji wspólnych danych. To jest to, co obserwuje się w systemach wieloprocesorowych - zarówno fizycznie, jak i logicznie, są one bardzo daleko od siebie. W celu skutecznej komunikacji w takich warunkach należy wymyślać specjalistyczne opony, takie jak Intel® QuickPath Interconnect. Zużycie energii, rozmiary i cena ostatecznej decyzji oczywiście nie zmniejsza się od tego wszystkiego. Wysoka integracja składników - schematy, które wykonują części programu równoległego powinny dojść do ratowania, konieczne jest podniesienie siebie, korzystnie na jednym krysztale. Innymi słowy, kilka procesorów powinno zorganizować kilka jądro.We wszystkich identycznych ze sobą, ale pracuje niezależnie.

Pierwszy multi-core IA-32 procesory z Intel przedstawiono w 2005 roku. Od tego czasu średnia liczba jąder na serwerach, pulpicie i platformach i mobilnych platformach stale rośnie.

W przeciwieństwie do dwóch procesorów jednorzędowych w jednym systemie, oddzielając tylko pamięć, dwa rdzenie mogą mieć również wspólne bufory i inne zasoby odpowiedzialne za interakcję z pamięcią. Najczęściej buforami pierwszego poziomu pozostają prywatne (każde jądro), podczas gdy drugi i trzeci poziom może być zarówno ogólnie, jak i oddzielny. Taka organizacja systemu redukuje opóźnienia w dostarczaniu danych między sąsiednimi jąderami, zwłaszcza jeśli pracują na wspólnym zadaniu.


Microsinks z czterorzędowym procesorem Intel z nazwą kodu Nehalem. Oddzielne jądra są podświetlone, całkowita pamięć podręczna trzeciego poziomu, a także linki QPI do innych procesorów i ogólnego sterownika pamięci.

Hiperpot

Do około 2002 r. Jedynym sposobem uzyskania systemu IA-32 zdolnego do wykonywania dwóch lub więcej programów równolegle, było stosowanie systemów wieloprocesorowych. W Intel® Pentium® 4, a także linię Xeon z nazwą kodu Foster (Netburst), prezentowana jest nowa technologia - Hypertrons lub Hiperpotions - Intel® HyperThreading (zwany dalej HT).

Nie ma nic nowego pod słońcem. HT jest szczególnym przypadkiem, że w literaturze jest określana jako jednoczesna multithreading (jednoczesny wielokrotność, SMT). W przeciwieństwie do "prawdziwych" jąder, które są pełnymi i niezależnymi kopiami, w przypadku HT w jednym procesorze, tylko część węzłów wewnętrznych jest duplikowana, przede wszystkim odpowiedzialna za przechowywanie stanu architektonicznego - rejestry. Węzły wykonawcze odpowiedzialne za organizację i przetwarzanie danych pozostają w liczbie pojedynczej, aw dowolnym momencie używają maksymalnie jednego z strumieni. Podobnie jak jądro, hiperpotacje są podzielone przez pamięci buforów, ale począwszy od tego, czego zależy od określonego systemu.

Nie będę próbował wyjaśnić wszystkich zalet i minusów projektów z SMT w ogóle iw szczególności z HT. Wspaniały czytelnik może znaleźć dość szczegółową dyskusję na temat technologii w wielu źródłach, a oczywiście w Wikipedii. Zanotę jednak następujące ważny momentWyjaśnienie obecnych ograniczeń liczby hiperpotionów w prawdziwych produktach.

Ograniczenia strumienia
Kiedy jest obecność "nieuczciwego" wielordzeniowego w postaci Uzasadnionych HT? Jeśli jeden strumień aplikacji nie jest w stanie załadować wszystkich węzłów wykonujących wewnątrz jądra, mogą być "pożyczone" na inny strumień. Zazwyczaj jest to aplikacje mające " wąskie gardło»Nie w obliczeniach, ale podczas uzyskiwania dostępu do danych często generujesz pociski pamięci podręcznej i zmuszone do oczekiwania danych dostarczania danych z pamięci. W tym czasie jądro bez HT zostanie zmuszony do bezczynności. Obecność HT pozwala szybko przełączyć darmowe węzły wykonujące do innego stanu architektonicznego (ponieważ jest po prostu powielane) i wykonuje jego instrukcje. Jest to szczególny przypadek akceptacji, o której ukrywa się opóźnienie, gdy jedna długa operacja, podczas których przydatne zasoby są bezczynne, jest maskowane przez równoległe wykonujące inne zadania. Jeśli aplikacja ma już wysoki stopień recyklingu zasobów jądra, obecność hiperpotionów nie pozwoli uzyskać przyspieszenia - tutaj potrzebujesz "uczciwej" jąder.

Typowe scenariusze pracy do aplikacji na pulpit i serwer zaprojektowane do architektur maszynowych ogólny cel, Mają potencjał do równoległości realizowanego za pomocą HT. Jednak ten potencjał jest szybko "spędzony". Być może z tego powodu, prawie wszystkie procesory IA-32, liczba hiperpotionów sprzętowych nie przekracza dwóch. Na typowych skryptach wygrywa z wykorzystania trzech i więcej hiperpotionów byłoby małe, ale strata w wielkości kryształu, jego zużycie energii jest znaczące.

Inna sytuacja obserwuje się na typowych zadaniach wykonywanych na scenie wideo. Dlatego te architektury charakteryzują się stosowaniem technologii SMT z większą liczbą wątków. Ponieważ Coprocesses Intel® Xeon PHI (przedstawione w 2010 r.) Są ideologicznie i genealogicznie w pobliżu kart wideo, mogą być cztery Nadciśnienie na każdym jądrze jest unikalne dla konfiguracji IA-32.

Procesor logiczny.

Trzy "poziomów" równoległości (procesory, jądra, hiperpotts), niektóre lub nawet wszystko w określonym systemie. To jest pod wpływem ustawienia BIOS. (Multi-rdzeń i multithReading są odłączone niezależnie), funkcje mikroarchitektury (na przykład HT był nieobecny w Intel® Core ™ Duo, ale został zwrócony z wydaniem Nehalem), a zdarzenia podczas operacji systemu (Serwery wieloprocesorowe mogą wyłączyć odrzucone procesory W przypadku awarii i kontynuuj "latać" na pozostałych). W jaki sposób ten wielopoziomowy zoo równoległości jest widziany przez system operacyjny i ostatecznie zastosowane aplikacje?

Następny, dla wygody, oznaczamy liczbę procesorów, jądra i strumieni w systemie trójdrożnym ( x., y., z.), gdzie x. - to jest liczba procesorów, y. - liczba jąder w każdym procesorze i z. - liczba hiperpotionów w każdym jądrze. Następnie zadzwonię do tego potrójnego topologia - Ustalony termin, mało z sekcją matematyki. Kompozycja p. = xYZ. określa liczbę nazwanych podmiotów procesory logiczne. Systemy. Określa całkowitą liczbę niezależnych kontekstów zastosowanych procesów w systemie z udostępnianą pamięcią wykonywalną równolegle, co system operacyjny Zmuszony do uwzględnienia. Mówię "wymuszać", ponieważ nie może zarządzać procedurą wykonania dwóch procesów na różnych procesorach logicznych. Dotyczy to również hiperpotionów: Chociaż działają "konsekwentnie" na jednym jądrze, konkretna kolejność jest podyktowana przez sprzęt i nie jest dostępna do monitorowania lub zarządzania programami.

Najczęściej, system operacyjny ukrywa się z aplikacji końcowych. Cechy fizycznej topologii systemu, na której działa. Na przykład trzy następujące topologie: (2, 1, 1), (1, 2, 1) i (1, 2) - OS będą reprezentowane jako dwa procesory logiczne, chociaż pierwszy z nich ma dwa procesory, Drugi - dwa jądra, a trzecia to tylko dwa strumienie.


Menedżer zadań Windows pokazuje 8 procesorów logicznych; Ale ile to jest w procesorach, jądrach i hiperpotach?


Top Linux pokazuje 4 procesory logiczne.

Jest dość wygodne dla twórców zastosowanych aplikacji - nie muszą zajmować się często nieznacznymi dla nich funkcji sprzętu.

Definicja oprogramowania topologii

Oczywiście abstrakcja topologii w pojedynczą liczbę procesorów logicznych w niektórych przypadkach tworzy dość powód do zamieszania i nieporozumień (w sporach internetowych). Aplikacje obliczeniowe, które chcą wycisnąć się z żelaza maksymalnej wydajności, wymagają szczegółowej kontroli nad tym, gdzie zostaną umieszczone ich strumienie: bliżej siebie na sąsiednich hiperpotach lub odwrotnie, z dala od różnych procesorów. Prędkość komunikacji między procesorami logikami w kompozycji jednego jądra lub procesora jest znacznie wyższa niż szybkość przesyłania danych między procesorami. Możliwość niejednorodności w organizacji losowy pamięć dostępu Komplikuje również obraz.

Informacje na temat topologii systemu jako całości, a także położenie każdego procesora logicznego w IA-32 są dostępne przy użyciu instrukcji CPUID. Od pojawienia się pierwszych systemów wieloprocesorowych schemat identyfikacji procesorów logicznych rozszerzył się kilka razy. Do tej pory jego część jest zawarta w arkuszach 1, 4 i 11 CPUID. Które z arkuszy należy oglądać, możesz określić z następującego schematu blokowego pobranego z artykułu:

Nie będę zabierać wszystkich szczegółów poszczególnych części tego algorytmu. Jeśli jesteś zainteresowany, może to być poświęcone następnej części tego artykułu. Odejdę od czytelnika czytelnika, w którym to pytanie jest zrozumiałe jak najbardziej szczegółowe. Tutaj najpierw opiszę na krótko, co jest APIC i jak jest związany z topologią. Następnie rozważ pracę z arkuszem 0xB (jedenaście liczb dziesiętnych), który jest obecnie ostatnim słowem w "Konstrukcji Spike".

Identyfikator APIC.
Lokalny APIC (zaawansowany programowalny sterownik przerywania) jest urządzeniem (obecnie w procesorze), który jest odpowiedzialny za pracę z przerwaniem, przychodząc do określonego procesora logicznego. Każdy procesor logiczny ma własny apiński. A każdy z nich w systemie powinien mieć unikalne znaczenie Identyfikator APIC. Numer ten jest używany przez przerwane sterowniki do adresowania podczas dostarczania wiadomości i wszystkich pozostałych (na przykład, system operacyjny) - do identyfikacji procesorów logicznych. Specyfikacja tego sterownika przerwania ewoluowała, przechodząca z układu PIC Intel 8259 przez podwójne pic, APIC i XAPIC do X2APIC.

Obecnie szerokość liczby przechowywanej w identyfikatorze apicznym osiągnęła pełne 32 bitów, choć w przeszłości była ograniczona do 16, a nawet wcześniej - tylko 8 bitów. Dziś pozostałości starych dni są rozproszone w całym procesorze CPUID, ale wszystkie 32 bitów identyfikatora APIC są zwracane do CPUID.0XB.EDX. Na każdym procesorze logicznym, niezależnie wykonując instrukcję procesora, powróci do jego wartości.

Filmowanie powiązanych więzi
Sam identyfikator APIC nie mówi o topologii. Aby dowiedzieć się, co dwa procesory logiczne są wewnątrz tego samego fizycznego (tj. "Bracia" z Hyperthmmsami), co dwa są w jednym procesorze, a także w ogóle w różnych procesorach, konieczne jest porównanie ich wartości identyfikacyjnych APIC. W zależności od stopnia pokrewieństwa niektóre z ich bitów będą się pokrywać. Informacje te są zawarte w konsoli CPUID.0XB, które są zakodowane za pomocą operandu w ECX. Każdy z nich opisuje pozycję pola bitowego jednego z poziomów topologii w EAX (dokładniej, liczba bitów, które muszą być przesuwane do identyfikatora APIC w prawo, aby usunąć poziom dolnych topologii), a także Rodzaj tego poziomu - hiperpotions, rdzeń lub procesor w ECX.

Procesory logiczne, które są wewnątrz pojedynczego jądra, zbiegają się z wszystkimi bitami ID APIC z wyjątkiem pola SMT. W przypadku procesorów logicznych znajdujących się w jednym procesorze, wszystkie bity z wyjątkiem pól rdzeniowych i SMT. Ponieważ liczba sublitratorów w CPUID.0XB może rosnąć, ten schemat pozwoli Ci zachować opis topologii i więcej poziomów poziomów, jeśli istnieje potrzeba w przyszłości. Ponadto możliwe będzie wprowadzenie poziomów pośrednich między istniejącymi.

Ważną konsekwencją organizacji tego schematu jest to, że w zestawie wszystkich identyfikatorów APIC wszystkich procesorów logicznych systemu może być "Otwory", tj. Nie pójdą sekwencyjnie. Na przykład w procesorze wielordzeniowym za pomocą HT, wszystkie identyfikatory APIC mogą być dobrze znane, ponieważ młodszy bit odpowiedzialny za kodowanie numeru hiperpottop zawsze będzie zero.

Zauważam, że CPUID.0XB nie jest jedynym źródłem Informacje o procesorach logicznych dostępnych do systemu operacyjnego. Lista wszystkich procesorów dostępnych do niego wraz z ich wartościami identyfikacyjnymi APC jest zakodowany w tabeli MADT ACPI.

Systemy operacyjne i topologia

Systemy operacyjne dostarczają informacji na temat topologii procesorów logicznych do aplikacji przy użyciu własnych interfejsów.

W systemie Linuksie informacje topologiczne są zawarte w Pseudo-Plik / ProC / CPUInfo, a także wyjście polecenia DMidecode. W poniższym przykładzie filtruję zawartość CPUInfo na niektórych czterordzeniowych systemach bez HT, pozostawiając tylko wpisy związane z topologią:

Ukryty tekst

[Chroniony e-mail]: ~ $ CAT / PROC / CPUInfo | Grep "Prospessor | Fizyczne ID | rodzeństwo 0 Indyny APICIC: 0 Procesor: 1 ID fizyczny: 0 rodzeństwo: 4 Rdzeń ID: 0 CPU ROWS: 2 APICIC: 1 Początkowy APICID: 1 Procesor: 2 ID fizyczne: 0 rodzeństwo: 4 Rdzeń ID: 1 CORES CORES: 2 APICIC: 2 Wstępny APICIC: 2 Procesor: 3 ID fizyczny: 0 Rodzeństwo: 4 ID rdzeniowego: 1 CPU Corres: 2 APICIC: 3 Wstępny APICID: 3

Topologia FreeBSD jest zgłaszana przez mechanizm SYSTL w zmiennej Kern.Sched.topology_spec w formie XML:

Ukryty tekst

[Chroniony e-mail]: ~ $ sysctl kern.sched.topology_spec kern.sched.topology_spec: 0, 1, 2, 3, 4, 5, 6, 7 0, 1, 2, 3, 4, 5, 6, 7 0, 1 Grupa wątków.SMT Group. 2, 3 Grupa wątków.SMT Group. 4, 5 Grupa wątków.SMT Group. 6, 7 Grupa wątków.SMT Group.

W systemie MS Windows 8 Informacje o topologii można zobaczyć w menedżerze zadań Menedżera zadań.

Dla przemysł informacyjny Początek XXI wieku zbiegły się z zmianami, które można określić jako "tektoniczne". Znaki nowej ery powinny obejmować wykorzystanie architektur zorientowanymi na usługi (architektura zorientowana na usługi, SOA), konfiguracje klastra i wiele innych, w tym procesorów wielordzeniowych. Ale oczywiście podstawową przyczyną tego, co się dzieje, jest rozwój fizyki półprzewodnikowej, którego konsekwencją stało się wzrost liczby elementów logicznych na jednostkę, która słucha prawa Gordona Moore'a. Liczba tranzystorów na krysztale jest już obliczana przez setki milionów i wkrótce pokonują miliardowy frontier, w wyniku którego znane prawo dialektyki nieuchronnie przejawia się z relacją zmian ilościowych i jakościowych. W zmienionych warunkach pojawia się nowa kategoria złożonośćoraz systemy stają się złożone i na mikro-poziomie (procesory) oraz na poziomie makro (systemy informacyjne firmy).

W pewnym stopniu, co dzieje się w nowoczesnym świecie komputera, można porównać do ewolucyjnego przejścia, które miały miejsce miliony lat temu, gdy pojawiły się organizmy wielokomórkowe. Zanim złożoność jednej komórki osiągnęła określony limit, a kolejna ewolucja poszła wzdłuż drogi rozwoju złożoności infrastruktury. To samo się dzieje systemy komputerowe: złożoność jednego rdzenia procesora, a także monolityczną architekturę korporacyjną systemy informacyjne. Osiągnął pewną maksimum. Teraz poziom makro jest przejściowy z systemów monolitycznych do komponentu (lub składający się z usług), a uwaga dewelopera koncentruje się na oprogramowaniu infrastruktury warstwy pośredniej, a na poziomie mikro pojawiają się nowe architektury procesora.

Dosłownie przynajmniej idea złożoności zaczęła tracić zdrowy rozsądek, odwracając się w niezależny czynnik. W tym względzie złożoność nie jest jeszcze całkowicie zrozumiała, a stosunek do niego nie jest w pełni zdefiniowany, choć dziwnie wystarczająco, od prawie 50 lat istnieje oddzielna dyscyplina naukowa, która jest również nazywana "teorią złożonych systemów". (Przypomnijmy, że w teorii "złożonego" zwanego systemem poszczególne składniki są łączone z metodą nieliniową; taki system nie jest tylko sumą komponentów, jak to się dzieje w systemach liniowych.) Jeden może być tylko Zaskoczony, że teoria systemów nie jest jeszcze postrzegana przez tych specjalistów i firm, z których działalność prowadzi ich do tworzenia tych złożonych systemów za pomocą technologii informatycznych.

Architektura "Gardła do butelki" von neymanan

Na poziomie mikro analogiem przejścia z organizmów jednookomórkowych do wielokomórkowego można przejść z procesorów jednordzeniowych do wielordzeniowej (multiprocesoriesorys chip, CMP). CMP daje jedną z możliwości przezwyciężenia wrodzonej słabości nowoczesnych procesorów - "butelki gardła" architektury von neymanan.

Właśnie to powiedział John Bacik na ceremonii prezentacji Nagrody Tyuukitov w 1977 r.: "Co to jest komputer na tle Nimanan? Kiedy 30 lat temu John Von Neuman i inni zaoferowali swoją oryginalną architekturę, pomysł wydawał się elegancki, praktyczny i pozwalający uprościć rozwiązanie wielu zadań inżynierskich i programowych. I choć w ciągu ostatniego czasu warunki, które istniały w momencie jego publikacji zostały radykalnie zmienione, identyfikujemy nasze pomysły na komputery z tym starymi koncepcjami. W najprostszej prezentacji Komputer Nimański składa się z trzech części: jest to centralny procesor (procesor lub procesor), pamięć i podłączenie ich kanał, który służy do wymiany danych między procesorem i pamięcią i małymi porcjami (tylko jedno słowo). Proponuję zadzwonić do tego kanału "butelki butelki w tle Butelki Neymanan". Z pewnością musi być mniej prymitywne rozwiązanie niż pompowanie ogromnej ilości danych przez "wąskie gardle". Taki kanał nie tylko tworzy problem dla ruchu, ale także jest "inteligentną butelką gardle", która nakłada programiści "sałatką" myślenia, nie pozwalając na kłócić się w wyższych kategoriach koncepcyjnych. "

Największa sława Bakusy przyniosła stworzenie w połowie 50 lat języka Fortrana, który przez kilka dekad był najpopularniejszym sposobem tworzenia programów rozliczeniowych. Ale najwyraźniej, Bacus był głęboko świadomy swoich słabości i zdał sobie sprawę, że rozwinął "język najbardziej tła-Neimanovsky" ze wszystkich języków wysokiego szczebla. Dlatego główne patos jego krytyki stawało się przede wszystkim do niedoskonałej metod programowania.

Od momentu wymówienia mowy Bacusa w programowaniu pojawiły się zauważalne zmiany, pojawiły się technologie funkcjonalne i zorientowane na obiekty, a dzięki pomocy udało się przezwyciężyć, co bakusa nazywana "inteligentnym tła-nimanovsky butelka gardła". Jednak korzeń architektoniczna przyczyna tego zjawiska, wrodzona choroba kanału między pamięcią a procesorem - jego ograniczona przepustowość - nie zniknęła, pomimo postępów w dziedzinie technologii w ciągu ostatnich 30 lat. Przez lata problem ten jest stale pogorszył, ponieważ prędkość pamięci rośnie znacznie wolniej niż wydajność procesorów, a szczelina między nimi staje się coraz bardziej.

Tło architektury Nimanovsk z komputera nie jest jedynym możliwym. Z punktu widzenia uporządkowania poleceń wymiany między procesorem a pamięcią, wszystkie komputery można podzielić na cztery klasy:

  • SISD (pojedyncze instrukcje pojedyncze dane) - "Jeden strumień poleceń, jeden strumień danych" ";
  • Simd (pojedyncze instrukcje mnożące dane) - jeden przepływ poleceń, wielu strumieni danych;
  • MISD (wiele instrukcji Pojedyncze dane) - Wiele strumieni komend, jeden strumień danych;
  • MIMD (wiele danych dotyczących wielu danych) - Wiele strumieni poleceń, wiele strumieni danych.

Z tej klasyfikacji widać, że maszyna Nimanovskaya jest specjalnym przypadkiem wpadającym do kategorii SISD. Możliwa poprawa w ramach architektury SISD są ograniczone do przenośników on-line i innych dodatkowych węzłów funkcjonalnych, a także stosowanie różnych metod buforowania. Dwie inne kategorie architektur (SIMD, który obejmuje procesory wektorowe i architektury przenośnika MISD) zostały wdrożone w kilku projektach, ale nie stały się masywne. Jeśli pozostaniesz w tej klasyfikacji, jedyną możliwością przezwyciężenia ograniczeń "gardła do butelki" pozostaje rozwojem architektur klasy MIMD. W swoich ramach znaleziono wiele podejść: może to być różne architektury równoległe i klastrowe oraz procesory wielokrotne.

Kilka lat temu, ze względu na ograniczenia technologiczne, wszystkie multi-gwintowane procesory zostały zbudowane na podstawie jednego jądra, a takie wielowymiarowe nazywano "jednoczesne" - Jednocześnie MultithReading (SMT). A wraz z pojawieniem się procesorów wielordzeniowych, pojawił się alternatywy rodzaj wielokimensowności - Multiprocesory chip (CMP).

Cechy procesorów wielokrotnych

Przejście z prostych procesorów jednookątnych do logicznie bardziej złożonego koniugatu wielopasmowego z przezwyciężającym specyficznym, a nie spełniającym trudności. Funkcjonowanie urządzenia, w którym proces wykonania jest podzielony na środki lub wątki (wątki) zawiera dwie funkcje:

  • zasada niezgodności (zasada nieokreślona). W zastosowaniu wielu gwintowanych proces jest podzielony na interakcję strumieniowych agentów bez wcześniej ustalonej pewności;
  • zasada niepewności. Sposób, w jaki zasoby zostaną dystrybuowane między agentami strumieni, jest również nieznany z góry.

Ze względu na te cechy pracę procesorów wielokrotnych jest zasadniczo różni się od deterministycznych obliczeń na schemacie Nimanova. W tym przypadku obecny stan procesu nie może być zdefiniowany jako funkcja liniowa poprzedniego stanu i odebrana na wejściu danych, chociaż każda z procesów może być postrzegana jako mikromestyle Nimanana. (W aplikacji do zachowania przepływów można nawet użyć terminu "dziwności" używanego w fizyce kwantowej.) Obecność tych cech przynosi procesor wielokrotnych do pomysłów skomplikowany systemAle z czysto praktycznym punktem widzenia jasne jest, że na poziomie wdrażania procesów, brak niestetynistycznej lub niepewności, a nawet bardziej o dziwadzie i mowy nie może być. Prawidłowo wykonany program nie może być dziwny.

W najbardziej ogólnej formie procesor multi-gwint składa się z dwóch typów prymitywów. Pierwszym typem jest zasobem, który obsługuje przepływ strumienia, który jest nazywany Mutex (z wzajemnego wykluczenia - "wzajemny wyjątek"), a drugi - zdarzenia. Sposób, który jest fizycznie wdrażany przez jeden lub inny mutax zależy od wybranego schematu - SMT lub CMP. W każdym przypadku, proces jest zredukowany do faktu, że następny strumień przechwytuje mutex podczas jego wykonania, a następnie uwalnia go. Jeśli mutax jest zajęty w jednym strumieniu, drugi strumień nie może go zdobyć. Szczególna procedura przenoszenia mocy do posiadania mutax z jednego strumienia do drugiego może być losowo; Zależy to od wdrażania zarządzania, na przykład w określonym systemie operacyjnym. W każdym przypadku zarządzanie należy zbudować tak, że zasoby składające się z Mutex są rozprowadzane prawidłowo, a efekt niepewności został stłumiony.

Wydarzenia są obiektami (zdarzeniem), sygnalizującym zmianę w środowisku zewnętrznym. Mogą tłumaczyć się w tryb gotowości przed innym wydarzeniem lub zgłosić swój stan innym wydarzeniu. W ten sposób wydarzenia mogą współdziałać ze sobą, a ciągłość danych między zdarzeniami powinna być zapewniona. Realizacja oczekiwania Agent musi poinformować gotowość danych dla niego. A jak w dystrybucji Mutex efekt niepewności powinien być stłumiony, więc podczas pracy z wydarzeniami powinno być stłumione przez nieznany efekt. Po raz pierwszy schemat SMT został wdrożony w procesorach Compaq alfa 21464, a także w MP Intel Xeon i Itanium.

Logicznie CMP jest prostsze: tutaj równoległość jest zapewniona przez fakt, że każda z wątków jest przetwarzana przez własny jądro. Ale jeśli aplikacja nie może być podzielona na strumienie, to (przy braku środków specjalnych) jest przetwarzany przez jedno jądro, aw niniejszym przypadku całkowita wydajność procesora jest ograniczona do prędkości jednego jądra. Na pierwszy rzut oka procesor zbudowany według schematu SMT jest bardziej elastyczny, a zatem preferowany jest ten schemat. Ale takie stwierdzenie jest prawdziwe tylko przy niskiej gęstości tranzystorów. Jeśli częstotliwość jest mierzona przez megahertery, a liczba tranzystorów w krysztale zbliża się miliarda, a opóźnienia w sygnałach transmisji stają się duże niż czas przełączania, zalety otrzymuje mikroarchitekturę CMP, w której zlokalizowane są powiązane elementy obliczeniowe.

Jednak fizyczna równoległa prowadzi do faktu, że CMP nie jest zbyt skuteczna z kolejnymi obliczeniami. Aby przezwyciężyć tę wadę, stosuje się podejście, zwane "spekulacyjnym wielopoziomowym" (spekulacyjna wielowątkowość). W języku rosyjskim słowo "spekulatywny" ma negatywną semantyczną cień, więc zadzwonimy do takiego wielokształcenia "warunkowego". Podejście to sugeruje obsługę sprzętu lub oprogramowania do wyłączania seryjnego zastosowania do strumieni warunkowych, pasujących do ich wdrażania i integracji wyników w pamięci.

Ewolucja CMP.

Pierwsze procesory CMP były przeznaczone na rynek serwerów. Niezależnie od dostawcy, w istocie, były dwoma niezależnymi procesorami supercalarnymi na jednym podłożu. Główną motywacją tworzenia takich struktur jest zmniejszenie objętości tak, że w jednym konstrukcji może być "opakowaniami" więcej procesorów, zwiększając specyficzną objętość jednostki (co ma kluczowe znaczenie dla nowoczesnych centrów danych). Następnie na poziomie ogólnym systemie, niektóre dodatkowe oszczędności osiąga, ponieważ procesory na jednym krysztale wykorzystują ogólne zasoby systemowe, takie jak szybkość komunikacji. Zazwyczaj istnieje tylko wspólny interfejs systemu między sąsiednimi procesorami ( figa. jeden, b).

Apologiści za pomocą procesorów CMP uzasadniają dalsze (ponad dwa) wzrost liczby jąder przez funkcje obciążenia serwera, które wyróżnia tego typu komputery z osadzonych lub przeznaczonych do ogromnych systemów obliczeniowych. Z serwera wymagana jest duża ogólna wydajność, ale opóźnienie w systemie nie jest tak krytyczne. Trywialny przykład: Użytkownik może po prostu zauważyć opóźnienie milisekund w wyglądzie zaktualizowanej strony internetowej, ale bardzo boleśnie reaguje na przeciążenie serwera, co może powodować przerwy w konserwacji.

Specyfika obciążenia daje procesory CMP kolejną zauważalną zaletę. Powiedzmy, że zastępując ten sam rdzeń Dual-Core Procesor, możesz podwoić częstotliwość zegara na tej samej wydajności. Jednocześnie teoretycznie czas przetwarzania oddzielnego żądania może wzrastać dwukrotnie, ale ponieważ fizyczna oddzielenie przepływów zmniejsza ograniczenie "gardła do butelki" architektury Nymananovsk, całkowite opóźnienie będzie znacznie mniejsze niż podwójne. Przy niższej częstotliwości i złożoności jednego jądra zużycie energii jest znacznie zmniejszone, a zwiększając liczbę jąder, wymienione argumenty na korzyść CMP są tylko wzmocnione. Dlatego następnym logicznym krokiem jest zebranie kilku jąder i łączenia ich ze wspólną pamięcią podręczną, na przykład, jak w projekcie Hydra (Figura 1, B). A potem możesz komplikować jądro i uczynić je wielokrotnymi, które zostały wdrożone w projekcie Niagara (rys. 1, D).

Złożoność procesorów ma kolejną ważną manifestację. Projektowanie numerycznych miliardów komponentów staje się coraz bardziej pracochłonnym zadaniem - pomimo korzystania z narzędzi automatyzacji. Jest istotne, że jesteśmy świadkami więcej niż dziesięcioleci "przynieść na myśl" Architektura IA-64. Konstrukcja procesora CMP jest zasadniczo prostsza: jeśli istnieje rozwinięty jądro, może być replikowany w niezbędnych ilościach, a projekt jest ograniczony przez tworzenie wewnętrznej infrastruktury krystalicznej. Ponadto prostota jąder upraszcza projekt pLASTEPS SYSTEM.Co sprowadza się do skalowania, a ostatecznie wskaźniki podsystemów I / O są zmieniane.

Pomimo powyższych argumentów nie ma rozsądnych podstaw do jednoznacznego oświadczenia o korzyściach CMP w porównaniu z SMT. Doświadczenie tworzenia procesorów wdrażających SMT jest znacznie więcej: od połowy lat 80. utworzono kilkadziesiąt produktów eksperymentalnych i kilku procesorów seryjnych. Historia rozwoju CPM jest nadal krótka: jeśli nie uwzględniasz rodziny specjalistycznych instrumentów TEXAS TMS 320C8X Procesory sygnalizacyjne, pierwszy udany projekt został Hydra, wykonany na Uniwersytecie Standford. Wśród uniwersyteckich projektów badawczych mających na celu budowę procesorów CMP znane są również trzy kolejne więcej - Wisconsin Multisalar, Carnegie-Mellon Stampede i MIT M-maszyna.

Mikroprocesor Hydra.

Kryształ Hydra składa się z czterech jąder procesora na podstawie MIPS RISC-Architecture. Każdy jądro ma pamięć podręczną i pamięć podręczną danych, a wszystkie jądra łączą się w drugą pamięć podręczną drugiego poziomu. Procesory wykonują normalny zestaw komend MIPS Plus Conditional Storage Commands (Store Conditional lub SC), zaprojektowany do wdrożenia prymitywów synchronizacji. Procesory i pamięć pamięci podręcznej drugiego poziomu są połączone z oponami odczytu / zapisu, a ponadto istnieje pomocniczy adres i opony sterujące. Wszystkie te opony są wirtualne, czyli logicznie reprezentowane przez opony przewodowe i są fizycznie podzielone na wiele segmentów przy użyciu repeaterów i bufory, co umożliwia zwiększenie prędkości rdzeni.

Opona odczytu / nagrywania odgrywa rolę systemu. Ze względu na jego lokalizację wewnątrz kryształu, ma wystarczającą ilość wydajność Zapewnić wymianę z pamięci podręcznej dla jednego cyklu. Osiągnij takie wskaźniki wydajności nawet w najdroższych tradycyjnych architekturach wieloprocesorowych trudnych z powodu ograniczeń fizycznych na liczbie kontakty zewnętrzne. procesory. Skuteczny magistrala wymiany z pamięcią podręczną uniemożliwia problem pojawienia się "gardła do butelki" między jądrami a pamięcią.

Testy Hydry z ładunkami z wyraźnie wyraźnym parallemowaniem w typowych aplikacjach internetowych i serwerów wykazały, że wydajność czterech rdzeni w porównaniu z jednym rdzeniem wzrasta o 3-3,8 razy, czyli praktycznie liniowy. Daje to powody uwierzyć, że procesory tego typu dość z powodzeniem będą "pasować" w tych aplikacjach, w których używane są serwery z architekturą SMP. Ale oczywiste jest, że procesor powinien działać dość skutecznie z konsekwentnymi aplikacjami, więc jednym z najważniejszych zadań jest wdrożenie warunkowej wielopoziomowej. W hydrze jest on realizowany na poziomie sprzętowym, a wybór tego podejścia jest uzasadnione faktem, że nie wymaga dodatkowych kosztów do programowania aplikacji równoległych.

Warunkowy wielozwójny opiera się na partycji sekwencji polecenia programu na przepływach, które można wykonać równolegle. Oczywiście może istnieć logiczna współzależność między takimi strumieniami, a specjalny mechanizm synchronizacji jest osadzony na ich procesorze. Istota jego pracy jest zredukowana do faktu, że jeśli niektóre wątki wymaga danych z strumienia równoległego i nie są jeszcze gotowe, wykonanie takiego przepływu jest zawieszone. W rzeczywistości istnieją elementy niezwiązane, które omówiono powyżej. Proces synchronizacji jest dość skomplikowany, ponieważ konieczne jest określenie wszystkich możliwych zależności między niciami a warunkami synchronizacji. Synchronizacja warunkowa pozwala na równoległe programy bez uprzedniej wiedzy o ich właściwościach. Ważne jest, aby mechanizm synchronizacji jest dynamiczny, działa bez interwencji programatora lub kompilatora, który jest zdolny do statycznego podziału aplikacji do przepływów. Testy modelu opartego na różnych testach wykazały, że sposoby warunkowego wielu wymiarów pozwalają zwiększyć wydajność procesora kilka razy, a bardziej oczywisty równoległość charakteryzuje się testem, tym mniej taka wartość jest scharakteryzowana.

W 2000 r. Afara powstała w sytuacji ścisłej tajemnicy. Jej założyciele zostali profesorem Kunle Olulotun z Uniwersytetu Stanforda i znanego dewelopera procesorów procesorów Kon, którzy mieli doświadczenie w Microsystemach Intel i Sun. KON był jednym z autorów procesorów RISC I860 i I960 w pierwszej z tych korporacji i ultasparc-i w drugim. Pod kierownictwem, Hydra została poddana recyklingowi pod rdzenie procesora w oparciu o procesor SPARC. W 2002 r. Afara została zakupiona przez Sun Microsystems, a to zakończyło historię projektu Hydra i rozpoczęła się historia Niagary.

Niagara - "Stop" Majc i Hydra

W procesorze UltraSparc T1, bardziej znany jako Niagara, dwóch głównych poprzedników - Hydra i Majc.

W połowie lat 90., na fali hobby, specjalistycznych procesorów Java, Sun Microsystems próbował stworzyć procesor "z bardzo długim słowem" - bardzo długich słów instrukcji (VLIW). Ta inicjatywa została nazwana Majc (architektura mikroprocesorowa dla komputerów Java). Podobnie jak w innych projektach, które rozpoczęły się w tym czasie (Intel IA-64 Itanium), w tym przypadku było zadanie przeniesienia jednych z najtrudniejszych operacji, aby utrzymać kompilator. Uwolniona logika tranzystora może być wykorzystana do tworzenia bardziej wydajnych węzłów funkcjonalnych (jednostek funkcjonalnych) w celu zapewnienia produktywnej wymiany poleceń i danych między procesorem procesora, pamięci podręcznej i pamięci podstawowej. W ten sposób przezwyciężył tła-nimanovsky "gardło do butelki".

Majc różnił się od większości procesorów w przypadku braku wyspecjalizowanych koprocesorów (subprocesorów), które są powszechnie nazywane urządzeniami funkcjonalnymi przeznaczonymi do wykonywania operacji z liczbami całkowitymi, liczbami zmiennoprzecinkowymi i danymi multimedialnymi. W tym wszystkim urządzenia funkcjonalne. były takie same zdolne do wykonywania jakichkolwiek operacji, które z jednej strony zmniejszyło skuteczność poszczególnych operacji, ale z drugiej uniósł szybkość wykorzystania całego procesora.

Niagara uosabia najlepsze z dwóch alternatywnych podejść do wdrażania wielu wymiarów - SMT i CMP. Na pierwszy rzut oka jest bardzo podobny do Hydry, ale raczej Hydra można nazwać "układem" Niagara. Oprócz tego, że w tym drugim - dwa razy więcej rdzeni, każdy z nich może przetwarzać cztery strumienie.

Procesor Niagara zapewnia obsługę sprzętową do wykonywania 32 gwintów podzielonych na osiem grup (cztery wątki). Aby wykonać każdą grupę, serwuje kanał przetwarzania rurociągów SPARC ( rys. 2.). Jest to rdzeń procesora, zbudowany zgodnie z architekturą SPARC V9. Każdy rurociąg Sparc zawiera pamięć podręczną dla pierwszego poziomu dla poleceń i danych. Razem 32 strumieni używa pamięci podręcznej drugiego poziomu o pojemności 3 MB, podzielone na cztery banki. Przełącznik łączy osiem jąder, banków pamięci podręcznej na drugim poziomie i innych rozproszonych zasobów procesora i wspiera kurs wymiany 200 GB / s. Ponadto przełącznik zawiera port dla systemów I / O i kanałów DDR2 DRAM pamięci, zapewniając kurs wymiany 20 GB / s; Maksymalna pojemność pamięci wynosi do 128 GB.

Projekt Niagara koncentruje się na systemie operacyjnym Solaris, więc wszystkie aplikacje działające Solaris można wykonać na nowym procesorze bez żadnych zmian. Oprogramowanie aplikacji postrzega Niagara jako 32 dyskretny procesor.

Projekt komórkowy.

Własne podejście do tworzenia wielordzeniowych procesorów zaproponowano IBM Corporation, którego projekt komórkowy został nazwany "heterogeniczny chipowy multiprocesor). Architektura komórkowa odnosi się również do architektury silnika szerokopasmowego komórek (CBEA). Multiprocesor komórkowy składa się z 64-bitowego jądra architektury energetycznej IBM i osiem wyspecjalizowanych koprocesorów, które implementują schemat "Jedno polecenie Dużo danych". W IBM ta architektura nazywa się synergistyczną jednostką procesora (SPU). Może być z powodzeniem stosowany, jeśli to konieczne, aby przetworzyć duże strumienie danych, na przykład w kryptografii, w różnych zastosowaniach multimedialnych i naukowych, takich jak operacje szybkiej transformacji Fouriera lub Matrix. Architektura komórkowa została stworzona przez IBM Badania naukowców w połączeniu z kolegami z grupy IBM Systems Technology Group, Sony i Toshiba, a jego pierwszym zastosowaniem powinny być urządzenia multimedialne, które wymagają dużych ilości obliczeń.

Podstawą synergistycznej jednostki procesora jest zestaw architektury zestawu instrukcji (ISA). Polecenia mają długość 32 bitów i są skierowane do trzech operandów umieszczonych w puli rejestru, co składa się z 128-bitowych rejestrów w każdym.

W przyszłości stosowanie komórki nie będzie ograniczone systemy gier. W kolejce - Telewizja wysoka rozdzielczość, serwery domowe, a nawet superkomputery.

Literatura
  1. Leonid Chernyak. Audyt prymatu - koniec stagnacji? // Otwarte systemy. - 2003 №5.
  2. Michaił Kuzminsky. Multi-line Microprocessor Architecture // Open Systems. - 2002 №1.
  3. Rajat Dua, Bhushan Lokhande. Porównawcze badanie multiprocesorów SMT i CMP. -

Rozumiejąc się z teorią wielowątkowej, rozważ praktyczny przykład - Pentium 4. Już na etapie opracowywania tego procesora inżynierowie Intel nadal pracuje nad poprawą jego wydajności bez wprowadzania zmian w interfejsie programu. Rozważono pięć prostych sposobów:
1. Podnoszenie częstotliwości zegara.
2. Umieszczenie na jednym układzie dwóch procesorów.
3. Wprowadzenie nowych bloków funkcjonalnych.
1. Rozszerzenie przenośnika.
2. Korzystanie z wielowątkowości.
Najbardziej oczywistym sposobem poprawy prędkości jest zwiększenie częstotliwości zegara bez zmiany innych parametrów. Z reguły każdy kolejny model procesora ma nieco wyższą częstotliwość zegara niż poprzedni. Niestety, z prostym wzrostem częstotliwości zegara, deweloperzy stoją przed dwoma problemami: zwiększenie zużycia energii (co jest istotne dla komputerów przenośnych i innych urządzeń komputerowych z bateriami) i przegrzania (co wymaga tworzenia bardziej wydajnych radiatorów).
Drugą metodą jest umieszczenie na chipie dwóch procesorów - stosunkowo prosty, ale wiąże się z podwojeniem obszaru zajmowanego przez mikroukładkę. Jeśli każdy procesor jest dostarczany z własną pamięcią podręczną, liczba mikrokiriuchów na płycie jest ciągnąca, ale oznacza również podwojenie kosztów produkcji. Jeśli dla obu procesorów można uniknąć wspólnej pamięci podręcznej, można uniknąć znaczącego wzrostu w okupowanym obszarze, ale w tym przypadku wystąpi inny problem - ilość pamięci podręcznej w kategoriach każdego procesora jest o połowę mniejsza, a to jest nieuchronnie dotknięte wydajnością . Ponadto, jeśli profesjonalne aplikacje serwerowe są w stanie w pełni wykorzystać zasoby kilku procesorów, w konwencjonalnych programach pulpialnych wewnętrzny równoległość jest rozwijana w znacznie mniejszym stopniu.
Wprowadzenie nowych bloków funkcjonalnych nie jest również trudne, ale ważne jest, aby zachować saldo. Jakie jest znaczenie dziesięciu najlepszych bloków ALU, jeśli chip nie może wydać poleceń do przenośnika z prędkością, która umożliwia pobieranie wszystkich tych bloków?
Przenośnik ze zwiększoną liczbą etapów zdolnych do oddzielenia zadań na mniejsze segmenty i przetwarza je w krótkich okresach czasu, z jednej strony zwiększa wydajność, z drugiej, zwiększa negatywne konsekwencje nieprawidłowej prognozowania przejść, cacherów, przerywania i inne wydarzenia, które naruszają zwykłe polecenia przetwarzania kursu w procesorze. Ponadto, aby w pełni wdrożyć możliwości rozszerzonego przenośnika, konieczne jest zwiększenie częstotliwości zegara, a to, jak wiemy, prowadzi do zwiększenia zużycia energii i transferu ciepła.
Wreszcie możliwe jest wdrożenie wielowątkowości. Zaletą tej technologii jest wprowadzenie dodatkowego strumienia oprogramowania, który pozwala wejść w życie tych zasobów sprzętowych, które w przeciwnym razie byłyby proste. Zgodnie z wynikami badań eksperymentalnych, deweloperzy Intel odkryli, że wzrost obszaru mikroukolizacji o 5% w realizacji wielokrotnych dla wielu zastosowań daje wzrost w 25%. Xeon 2002 stał się pierwszym procesorem Intel z obsługą wielowątkowości. Następnie, począwszy od częstotliwości 3,06 GHz, MultiThReading wprowadzono do Pentium 4. Władca Intel wywołuje wdrażanie wielowątkowości w hipermatochii Pentium 4 (HyperThreading).
Główną zasadą hiperpotimity jest jednoczesne wykonanie dwóch strumieni oprogramowania (lub procesów - procesor nie rozróżnia procesów z strumieni oprogramowania). System operacyjny uważa procesor Hypervision Pentium 4 jako kompleks dwuetrycyorowy z wspólnymi pamięcią buforami i podstawową pamięcią. Planowanie systemu operacyjnego działa dla każdego strumienia oprogramowania oddzielnie. Tak więc dwie aplikacje mogą być wykonywane w tym samym czasie. Na przykład program pocztowy może wysyłać lub odbierać wiadomości tryb tłaDopóki Użytkownik nie będzie interakcji z interaktywną aplikacją - to znaczy program demona i użytkownika są wykonywane jednocześnie, jak gdyby dwa procesory są dostępne dla systemu.
Programy aplikacji obejmujące możliwość wykonania w formie kilku strumieni oprogramowania może używać obu "procesorów wirtualnych". Na przykład programy edycji wideo zwykle pozwalają użytkownikom zastosować filtry do wszystkich ramek. Takie filtry dostosowują jasność, kontrast, balans kolorów i inne właściwości ramek. W takiej sytuacji program może przypisać jeden procesor wirtualny do przetwarzania nawet ramek, a drugi do przetwarzania nieparzystego. Jednocześnie dwa procesory będą działać całkowicie niezależnie od siebie.
Ponieważ strumieni oprogramowania zwraca się do tych samych zasobów sprzętowych, konieczna jest koordynacja nici. W kontekście nadciśnienia, Deweloperzy Intel zidentyfikowali cztery przydatne strategie zarządzania zasobami: powielanie zasobów, jak również sztywne, progowe i pełne separacja zasobów. Rozważ te strategie.
Zacznijmy od powielania zasobów (powielanie zasobów). Jak wiesz, niektóre zasoby są powielane w celu organizowania strumieni oprogramowania. Na przykład, ponieważ każdy strumień oprogramowania wymaga indywidualnej kontroli, potrzebujesz drugiego licznika poleceń. Ponadto należy wprowadzić drugą tabelę wyświetlania rejestrów architektonicznych (EAH, UE itp.) Do rejestrów fizycznych; Podobnie kontroler przerwań jest powielany, ponieważ przetwarzanie przerwania dla każdego strumienia jest wykonywane indywidualnie.
Następnie przestrzegana jest metoda udostępniania zasobów pomiędzy strumieniami oprogramowania. Na przykład, jeśli procesor zapewnia kolejkę między dwoma etapami funkcjonalnymi przenośnika przenośnika, połowa szczelinów może otrzymać przepływ 1, drugi pół-strumień 2. Oddzielenie zasobów jest łatwo wdrażane, nie prowadzi do Nierównowaga i zapewnia kompletną niezależność strumieni oprogramowania od siebie. Dzięki pełnym podziale wszystkich zasobów jeden procesor rzeczywiście obraca się na dwa. Z drugiej strony, może wystąpić taka sytuacja, w której jedna wątek programu nie stosuje zasobów, które mogą być przydatne dla drugiego strumienia, ale w odniesieniu do którego nie ma uprawnień dostępowych. W rezultacie można zaangażować środki, które w innej sytuacji mogą być bezczynne.
Przeciwieństwem sztywnej separacji jest pełną separą zasobów (pełne udostępnianie zasobów). W tym schemacie każdy strumień oprogramowania może uzyskać dostęp do żądanych zasobów i są obsługiwane w kolejności żądań dostępu. Rozważmy sytuację, w której szybki strumień składający się głównie z dodatkowych i odejmowania operacji współistniejących z wolnym przepływem, który realizuje operacje mnożenia i podziału. Jeśli polecenia zostaną wywołane z pamięci szybciej niż operacje mnożenia i działalności są wykonywane, liczba poleceń spowodowanych w ramach powolnego przepływu i w kolejce na przenośniku stopniowo rośnie. Ostatecznie polecenia te wypełniają kolejkę, w rezultacie szybki przepływ z powodu braku miejsca zatrzyma się w nim. Pełna separacja zasobów rozwiązuje problem nieoptymalnych wydatków współdzielonych zasobów, ale tworzy nierównowagę ich zużycia - jeden wątek może spowolnić lub zatrzymać drugi.
Schemat pośredni jest realizowany w progu zasobów (udostępnianie zasobów progowych). Zgodnie z tym schematem każdy strumień oprogramowania może dynamicznie otrzymać pewną (ograniczony) objętość zasobów. W odniesieniu do replikowanych zasobów, podejście to zapewnia elastyczność bez zagrożenia dla jednego z strumieni oprogramowania ze względu na niemożliwość uzyskania zasobów. Jeśli, na przykład, aby zabronić każdej z strumieni, aby zajmować więcej niż 3/4 kolejki poleceń, zwiększone zużycie zasobów z wolnym przepływem nie zapobiegnie wykonywaniu szybkiego.
Model hiperplow Pentium 4 łączy różne strategie separacji zasobów. W ten sposób podjęto próbę rozwiązania wszystkich problemów związanych z każdą strategią. Duplikacja jest realizowana w odniesieniu do zasobów, do których można uzyskać stale wymagane przez oba strumienie oprogramowania (w szczególności w odniesieniu do licznika poleceń, tabele wyświetlania i sterowników przerwania). Duplikacja tych zasobów zwiększa obszar mikrokriguitów o zaledwie 5% - zgadzasz się, dość rozsądną opłatą za wielowątkowość. Zasoby dostępne w takiej objętości, który jest praktycznie wyeliminowany przez prawdopodobieństwo przechwytywania ich jednym strumieniem (na przykład wiersze pamięci podręcznej) są rozpowszechniane dynamicznie. Dostęp do zasobów, które kontrolują pracę przenośnika (w szczególności, jego liczne kolejki) jest podzielone - połowa szczelin jest podawana do każdego przepływu programowego. Główny przenośnik architektury Netburst zaimplementowany w Pentium 4 jest przedstawiony na FIG. 8.7; Biały I. szare obszary Ta ilustracja wskazuje mechanizm alokacji zasobów między strumieniami białych i szarych oprogramowania.
Jak widać, wszystkie koleje się na tej ilustracji są podzielone - każdy strumień oprogramowania jest podświetlony na pół szczeliny. Żaden z strumieni oprogramowania nie może ograniczyć działania innego. Jednostka dystrybucyjna i substytucja są również rozdzielone. Zasoby planisty są podzielone dynamicznie, ale w oparciu o określoną wartość progową - dlatego żaden z wątków nie może przyjmować wszystkich warstw kolejki. Dla wszystkich innych etapów przenośnika znajduje się pełna separacja.
Jednak z wielowartością nie wszystko jest takie proste. Nawet taka technika progresywna ma niedociągnięcia. Sztywne separacja zasobów nie jest związana z poważnymi kosztami, ale dynamiczna separację, w szczególności, biorąc pod uwagę progi, wymaga śledzenia zużycia zasobów w fazie wykonania. Ponadto w niektórych przypadkach programy działają znacznie lepiej bez wielowartościowego niż z nim. Przypuśćmy na przykład, w obecności dwóch strumieni oprogramowania do normalnego funkcjonowania, każdy z nich wymaga pamięci podręcznej 3/4. Jeśli zostały wykonane na przemian, każdy pokazuje wystarczającą wydajność z niewielką ilością pamięci podręcznej (wiadomo, że jest związane z dodatkowymi kosztami). W przypadku równoległego wykonania pamięci podręcznej brakuje, wszyscy byliby znacznie większy, a ostateczny wynik byłby gorzej niż bez wielowartościowego.
Aby uzyskać więcej informacji na temat mechanizmu wielokrotnego powtórzenia 4, możesz się nauczyć.

Dzwon.

Są ci, którzy przeczytali tę wiadomość przed tobą.
Subskrybuj odbieranie artykułów świeżych.
E-mail
Nazwa
Nazwisko
Jak chcesz przeczytać dzwonek
Bez spamu