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

W przypadku przemysłu informacyjnego początek XXI wieku zbiegł 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 dzieje się z systemami komputerowymi: złożoność jednego rdzenia procesora, a także monolityczną architekturę korporacyjnej 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 Nimanovsky składa się z trzech części: to procesor (CPU lub CPU), pamięć i podłączanie ich kanału, który służy do wymiany danych między procesorem i pamięcią i małymi częściami (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 załączniku do zachowania przepływów jest nawet możliwe, aby stosować termin "dziwność" stosowany w fizyce kwantowej.) Obecność tych cech przynosi wielozwójny procesor do pomysłów na temat złożonego systemu, ale z czysto praktycznym W punkcie widoku jest oczywiste, że na poziomie procesów, wszelkie niezwiązane lub niepewność, a nawet bardziej o dziwności 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.). On jest kernel procesoraZbudowany 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 wykorzystanie komórki nie będzie ograniczone do systemów 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. -

Wprowadzenie Sprzęt komputerowy szybko się rozwija. Urządzenia komputerowe stają się potężniejsze, bardziej kompaktowe, wygodniejsze, ale niedawno ulepszanie wydajności urządzenia stały się dużym problemem. W 1965 roku Gordon Moore (jeden z założycieli Intel) doszedł do wniosku, że "liczba tranzystorów umieszczonych na zintegrowanym krysztale podwaja się co 24 miesiące".

Pierwsze wydarzenia w tworzeniu systemów wieloprocesorowych rozpoczęły się w latach 70-tych. Przez długi czas wydajność znanych procesorów jednordzeniowych wzrosła ze względu na wzrost częstotliwości zegara (do 80% wydajności określony tylko do częstotliwości zegara) z jednoczesnym wzrostem liczby tranzystorów na krysztale. Podstawowe prawa fizyki zatrzymały ten proces: żetony zaczęły przegrzać, technologiczne zaczęło zbliżać się do rozmiarów atomów krzemowych. Wszystkie te czynniki doprowadziły do:

  • prądy wycieku wzrosły, w wyniku czego wzrosły rozpraszanie ciepła i zużycie energii.
  • procesor stał się znacznie "szybszą" pamięcią. Wydajność zmniejszyła się z powodu opóźnienia w odwołaniu do losowy pamięć dostępu i pobieranie danych do pamięci podręcznej.
  • jest taka koncepcja jako "tło-neymogany wąskie gardło" Oznacza to nieskuteczność architektury procesora podczas wykonywania dowolnego programu.

Systemy wieloprocesorowe (jako jeden ze sposobów rozwiązywania problemu) nie były szeroko stosowane, ponieważ domagali się one drogie i złożone w produkcji wieloprocesora płyty główne.. W oparciu o to, wydajność wzrosła na różne sposoby. Koncepcja wielowartościowego była skuteczna - jednoczesne przetwarzanie kilku strumieni komend.

Hyper-Threading Technology (HTT) lub technologia przetwarzania danych Superfluid umożliwia procesor na jednym jądrze do wykonania wielu strumieni oprogramowania. Według wielu specjalistów stało się warunkiem wstępnym tworzenia procesorów wielordzeniowych. Procesor wykonuje jednocześnie kilka wątków oprogramowania nazywane są równoległością na poziomie strumienia (równoległość TLP-poziom-poziom).

Aby ujawnić potencjał procesora wielordzeniowego, program wykonywalny musi używać wszystkich jąder obliczeniowych, które nie zawsze jest osiągalne. Stare kolejne programy, które mogą używać tylko jednego jądra, teraz nie działają szybciej w nowej generacji procesorów, więc programiści stają się coraz bardziej zaangażowani w rozwój nowych mikroprocesorów.

1. Ogólne koncepcje

Architektura w szerokim znaczeniu jest opis skomplikowany systemskładający się z wielu elementów.

W procesie rozwoju struktury półprzewodnikowe (żetony) ewoluuje zatem zasad konstruowania procesorów, liczbę elementów zawartych w ich kompozycji, w jaki sposób organizowane są ich interakcję, są stale się zmieniane. W ten sposób procesor z tymi samymi podstawowymi zasadami struktury jest zwyczajowo nazywany procesorami jednej architektury. I te zasady nazywane są architekturą procesora (lub mikroarchitektury).

Mikroprocesor (lub procesor) jest głównym elementem komputera. Przetwarza informacje, wykonuje programy i zarządza innymi urządzeniami systemowymi. Moc procesora zależy od sposobu szybkiego uruchomienia programów.

Jądro jest podstawą dowolnego mikroprocesora. Składa się z milionów tranzystorów znajdujących się na krysztale krzemu. Mikroprocesor jest podzielony na specjalne komórki zwane rejestrami ogólny cel (Ron). Prace procesora jest suma wyodrębniania z pamięci w określonej sekwencji poleceń i danych oraz ich wykonanie. Ponadto, ze względu na zwiększenie prędkości komputera mikroprocesor jest wyposażony w wewnętrzną pamięć podręczną. Pamięć pamięci podręcznej jest wewnętrzna pamięć Procesor stosowany jako bufor (w celu ochrony przed przerwami z obligacją z RAM).

Procesory Intel używane w kompatybilnych kompatybilnych z IBM mają więcej niż tysiąc poleceń i należą do procesorów z rozszerzonym systemem poleceń - procesory CISC (CSIS -Complex instrukcje ustawione).

1.1 Wydajne obliczenia. Równoległość

Tempo rozwoju sprzętu obliczeniowego jest łatwe do śledzenia: od ENIAC (pierwszy elektroniczny komputer cyfrowy ogólnego przeznaczenia) z wydajnością kilku tysięcy operacji na sekundę do superkomputera TANHE-2 (1000 bilionów zmiennoprzecinkowych na sekundę). Oznacza to, że szybkość obliczeń wzrosła trzy razy w ciągu 60 lat. Tworzenie wysokowydajnych systemów obliczeniowych jest jednym z najbardziej złożonych zadań naukowych i technicznych. Pomimo faktu, że prędkość obliczania Środki techniczne Wyrosło tylko kilka milionów razy, całkowita prędkość obliczania wzrosła w czasach bilionów. Efekt ten został osiągnięty ze względu na stosowanie równoległości na wszystkich etapach obliczeń. Równoległy obliczenia wymagają wyszukiwania racjonalnego alokacji pamięci, niezawodne sposoby przesyłania informacji i koordynowania procesów obliczeniowych.

1.2 Symetryczny multiprocesor.

Symetryczne multiprocessing (skrócony SMP) lub symetryczny multiprocessing jest szczególną architekturą systemów wieloprocesorowych, w których kilka procesorów ma dostęp do pamięci współdzielonej. Jest to bardzo wspólna architektura, bardzo szeroko stosowana ostatnio.

Podczas korzystania z SMP kilka procesorów pracuje na komputerze, każdy na jego zadaniu. SMP System z wysokiej jakości systemem operacyjnym racjonalnie rozdziela zadania między procesorami, zapewniając jednoczesne obciążenie dla każdego z nich. Istnieje jednak problem dotyczący przetwarzania pamięci, ponieważ nawet systemy jednoprojektora są wymagane dla tego stosunkowo wielkiego czasu. Tak więc dostęp do pamięci RAM w SMP następuje sekwencyjnie: pierwszy procesor, a następnie drugi.

Ze względu na funkcje wymienione powyżej system SMP jest używany wyłącznie w sferze naukowej, branży, biznesowej, niezwykle rzadkich w biurach pracy. Oprócz wysokiego kosztu wdrożenia sprzętu, takie systemy wymagają bardzo kosztownych i wysokiej jakości oprogramowania, które zapewnia wielokrotne zadania. Zwykłe programy (gry, redakcja tekstowa) Nie będzie działać skutecznie w systemach SMP, ponieważ nie zapewniają tego stopnia równoległości. Jeśli dostosujesz dowolny program dla systemu SMP, stanie się niezwykle nieefektywne do pracy w systemach jednomrocesorowych, co prowadzi do konieczności tworzenia wielu wersji tego samego programu dla różnych systemów. Wyjątkiem jest na przykład program Ableton Live (zaprojektowany do tworzenia muzyki i przygotowania sieci DJ) posiadających obsługę systemów wieloprocesorowych. Jeśli uruchomisz zwykły program w systemie wieloprocesorowym, nadal będzie działać trochę szybciej niż w procesorze jednoprocesorowym. Wynika to z tak zwanego przerwań sprzętowych (zatrzymując program do przetwarzania jądra), który jest wykonywany na innym wolnym procesorze.

System SMP (jak również każdy inny, oparty na obliczeniach równoległych) umieszcza zwiększone wymagania dla takiego parametru pamięci jako przepustowości magistrali pamięci. Często ogranicza liczbę procesorów w systemie (nowoczesne systemy SMP działa skutecznie do 16 procesorów).

Ponieważ procesory mają wspólną pamięć, istnieje potrzeba racjonalnego wykorzystania i koordynacji danych. W systemie wieloprocesorowym okazuje się, że kilka pamięci buforowych działa dla wspólnego zasobu pamięci. Spójność SCHUE (spójność pamięci podręcznej) - właściwość pamięci podręcznej, która zapewnia integralność danych przechowywanych w poszczególnych buforach dla wspólnego zasobu. Koncepcja ta jest szczególnym przypadkiem koncepcji spójności pamięci, gdzie kilka jąder ma dostęp do pamięci współdzielonej (wszędzie spotyka się w nowoczesnych systemach wielordzeniowych). Jeśli opisujesz koncepcje koncepcji ogólnie, obraz będzie następujący: Ten sam blok danych można załadować do różnych pamięci podręcznych, gdzie dane są przetwarzane inaczej.

Jeśli żadne powiadomienia o zmianie danych nie są używane, wystąpi błąd. Spójność pamięci podręcznej ma na celu rozwiązanie takich konfliktów i wspieranie zgodności z danymi w pamięci CH.

Systemy SMP są podgrupą MIMD (Multi in-budowlane Dane Multi - system obliczeniowy z wieloma strumieniami poleceń i wielu strumieniami danych) Klasyfikacja systemów obliczeniowych na Flynn (profesor Uniwersytetu Stanforda, współzałożyciela Palyn Associates). Zgodnie z tą klasyfikacją prawie wszystkie odmiany równoległych systemów można przypisać MIMD.

Separacja systemów wieloprocesorowych na typach opiera się na oddzieleniu zasady wykorzystania pamięci. Takie podejście umożliwiło odróżnienie następujących ważnych typów.

systemy wieloprocesorowe - multiprocessors (systemy wieloprocesorowe ze wspólną pamięcią współdzieloną) i multicomputers (systemy z oddzielną pamięcią). Ogólne dane używane z równoległymi obliczeniami wymagają synchronizacji. Zadaniem synchronizacji danych jest jednym z najważniejszych problemów oraz jego rozwiązanie w rozwoju wieloprocesora i wielordzeniowego, a odpowiednio konieczne oprogramowanie jest priorytetem zadaniem inżynierów i programistów. Wspólny dostęp do danych można wykonać za pomocą dystrybucji pamięci fizycznej. Takie podejście nazywa się niejednorodny dostęp do pamięci (niejednolity dostęp do pamięci lub NUMA).

Wśród tych systemów można przydzielić:

  • Systemy, w których używany jest tylko indywidualna pamięć podręczna procesora do przesyłania danych (architektura pamięci tylko w pamięci podręcznej).
  • Systemy z spójnością lokalnych pamięci podręcznych dla różnych procesorów (spójna pamięć podręczna NUMA).
  • Systemy z udostępnianiem dostępu do indywidualnych procesorów pamięci bez implementacji na poziomie sprzętu podręcznego spójności (spójna numa numa).

Uproszczenie problemu tworzenia systemów wieloprocesorowych uzyskuje się przy użyciu rozproszonej pamięci współdzielonej (rozproszona pamięć współdzielonej), ale ta metoda prowadzi do namacalnego wzrostu złożoności programowania równoległego.

1.3 Jednocześnie Multithreading.

Na podstawie wszystkich powyższych wad wieloprocesowych symetrycznych ma sens na rozwój i rozwijanie innych sposobów zwiększenia wydajności. Jeśli przeanalizujesz pracę każdego indywidualnego tranzystora w procesorze, można zwrócić uwagę na bardzo interesujący fakt - w spełnieniu większości operacji obliczeniowych, nie wszystkie składniki procesora są zaangażowane (zgodnie z najnowszymi badaniami - około 30% wszystkie tranzystory). Tak więc, jeśli procesor wykonuje, powiedzmy, prosta operacja arytmetyczna, wtedy większość procesora jest bezczynna, dlatego może być stosowany do innych obliczeń. Tak więc, jeśli w momencie procesor wykonuje działanie rzeczywiste, wówczas operacja arytmetyczna całkowita może być załadowana do wolnej części. Aby zwiększyć obciążenie procesora, możesz utworzyć spekulacyjne (lub zaawansowane) działanie operacji, co wymaga dużej komplikacji logiki sprzętowej procesora. Jeśli program z wyprzedzeniem określi strumienie (sekwencje poleceń), które mogą być wykonywane niezależnie od siebie, będzie to znacznie uprościć zadanie (ta metoda jest łatwo zaimplementowana na poziomie sprzętu). Ta idea należąca do Dina Tulsenija (rozwinięta przez niego w 1955 r. Na Uniwersytecie w Waszyngtonie), nazywano jednoczesną wielowątkową (multithReading Simul-bluzy). Później został opracowany przez Intel pod nazwą hiperphottity ( hyper Threading.). Więc jeden procesor wykonujący wiele strumieni jest postrzegany przez działanie system Windows. jako kilka procesorów. Używanie tej technologii ponownie wymaga odpowiedniego poziomu oprogramowania. Maksymalny efekt wykorzystania technologii Multithreading wynosi około 30%.

1.4 Multi-rdzeń

Multithreading Technology jest wdrożeniem wielordzeniowego na poziomie programu. Dalszy wzrost wydajności, jak zawsze wymaga zmian w sprzęcie procesora. Powikłanie systemów i architektur nie zawsze okazuje się skuteczne. Jest odwrotna opinia: "Wszystko pomysłowe jest proste!". Rzeczywiście, w celu zwiększenia wydajności procesora, nie jest konieczne zwiększenie częstotliwości zegara, komplikuje komponentów logicznych i sprzętowych, ponieważ wystarczy racjonalizować i odwiedzić istniejącą technologię. Ta metoda jest bardzo korzystna - nie jest konieczne rozwiązanie problemu zwiększenia rozpraszania rozpraszania procesora, rozwój nowego drogiego sprzętu do produkcji mikroukładów. Podejście to zostało wdrożone w ramach technologii wielordzeniowej - wdrażanie kilku jąder obliczeniowych na jednym krysztale. Jeśli weźmiesz procesor źródłowy i porównujesz wzmocnienie wydajności przy wdrażaniu kilku sposobów zwiększenia wydajności, oczywiste jest, że wykorzystanie technologii wielordzeniowej jest najlepszą opcją.

Jeśli porównujesz architekturę symetrycznej wieloprocesora i wielordzeniowego, będą one prawie identyczne. Klucze rdzenia mogą być wielopoziomowym (lokalnym i powszechnym, a dane z pamięci RAM można załadować do pamięci podręcznej drugiego poziomu). Na podstawie badanych zalet architektura wielordzeniowa Procesory, producenci nacisk na to nacisk. Ta technologia Okazało się, że jest wystarczająco tani w realizacji i uniwersalnym, co umożliwiło doprowadzenie go do szerokiego rynku. Ponadto architektura ta dokonała własnych korekt prawa Moore: "Liczba rdzeni obliczeniowych w procesorze podwoi co 18 miesięcy".

Jeśli spojrzysz na nowoczesny rynek wyposażenie komputeraNastępnie widać, że urządzenia z czterema i osiem procesory jądrowe. Ponadto producenci procesora twierdzą, że wkrótce na rynku można zobaczyć procesory z setkami jąder obliczeniowych. Ponieważ wielokrotnie stwierdzono wcześniej, cały potencjał wielordzeniowej architektury jest ujawniony tylko w obecności oprogramowania wysokiej jakości. Tak więc sferę komputera produkcyjnego "żelaza" i oprogramowanie jest bardzo blisko.

Saul. 9 września 2015 o 13:38

Wdrożenie architektury wielokrotnej silnik gier

  • Blog Intela
  • Produkcja gier
  • Programowanie równoległe
  • Tworzenie stron internetowych.
  • 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 - Wybierz wartości bezwzględne lub względne 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 tego mechanizmu 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ą.
Dokładna informacja W przypadku składników systemu można znaleźć w rozdziale 5.2, "System Składniki".

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óżne systemy.. 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 systemy specyficzne.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 cecha Używaj głównie do ustawienia parametrów, które nie zmieniają się z ramki do ramy.

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ę połączeń system operacyjnyA 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 dzwoniący do Platform Menedżer do pobrania dynamiczna biblioteka Systemy. 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 można znaleźć w rozdziale 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, aby przeciążenie informacji o silnikach o różnych typach systemów. 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 podstawowy punkt wejściowy 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

Po zrozumieniu z teorią multithreading, rozważ praktyczny przykład - Pentium 4. Już na etapie rozwoju tego procesora Inżynierowie Intel nadal pracują nad poprawą prędkoś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 profesjonalny aplikacje serwera. Potrafi w pełni zaangażować zasoby kilku procesorów, w konwencjonalnych programach pulpitu, 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%. Pierwszy procesor Intel. Heon 2002 stał się wsparciem dla multithreading. 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).

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