Jak wygląda multicore assembly language?

Dawno, dawno temu, aby napisać na przykład asembler x86, mielibyśmy instrukcje "załaduj rejestr EDX z wartością 5"," zwiększ rejestr EDX", itd.

Z nowoczesnymi procesorami, które mają 4 rdzenie (a nawet więcej), Czy na poziomie kodu maszynowego wygląda to tak, jakby były 4 oddzielne Procesory (tzn. czy są tylko 4 odrębne rejestry "EDX")? Jeśli tak, to kiedy powiesz "increment the EDX register" , co określa, który rejestr EDX procesora jest zwiększany? Czy istnieje " kontekst procesora" czy koncepcja "wątku" w asemblerze x86?

Jak działa komunikacja/synchronizacja między rdzeniami?

Jeśli piszesz system operacyjny, jaki mechanizm jest ujawniony przez sprzęt, aby umożliwić zaplanowanie wykonania na różnych rdzeniach? Czy jest to jakaś specjalna instrukcja (- y)?

Jeśli piszesz optymalizujący kompilator / bajtową maszynę wirtualną dla wielordzeniowego procesora, co musisz wiedzieć konkretnie o, powiedzmy, x86, aby wygenerować kod, który działa wydajnie we wszystkich rdzeniach?

Jakie zmiany zostały wprowadzone w kodzie maszynowym x86 w celu obsługi funkcji wielordzeniowych?

10 answers

To nie jest bezpośrednia odpowiedź na pytanie, ale odpowiedź na pytanie, które pojawia się w komentarzach. Zasadniczo pytanie brzmi, jakie wsparcie sprzęt daje wielowątkowej pracy.

Nicholas Flynt miał rację , przynajmniej jeśli chodzi o x86. W środowisku wielowątkowym (Hyper-threading, multi-core lub multi-processor), wątek Bootstrap (Zwykle wątek 0 w rdzeniu 0 w procesorze 0) rozpoczyna pobieranie kodu z adresu 0xfffffff0. Wszystkie inne wątki uruchamiają się w specjalnym stanie uśpienia o nazwie Wait-for-SIPI. W ramach inicjalizacji wątek główny wysyła specjalne inter-processor-interrupt (IPI) przez APIC zwane SIPI (Startup IPI) do każdego wątku znajdującego się w WFS. Sipi zawiera adres, od którego wątek powinien rozpocząć pobieranie kodu.

Mechanizm ten umożliwia każdemu wątkowi wykonywanie kodu z innego adresu. Wszystko, co potrzebne jest wsparcie oprogramowania dla każdego wątku, aby skonfigurować własne tabele i kolejek komunikatorów. System operacyjny używa tych do wykonywania rzeczywistego harmonogramu wielowątkowego.

Jeśli chodzi o rzeczywisty montaż, jak Nicholas napisał, nie ma różnicy między złożeniami dla pojedynczego lub wielowątkowego zastosowania. Każdy wątek logiczny ma swój własny zestaw rejestru, więc zapis:

mov edx, 0

Zaktualizuje EDX tylko dla aktualnie uruchomionego wątku. Nie ma możliwości modyfikacji EDX na innym procesorze przy użyciu jednego zestawu Instrukcja. Potrzebujesz jakiegoś wywołania systemowego, aby poprosić system operacyjny, aby powiedział innemu wątkowi, aby uruchomił kod, który zaktualizuje swój własny EDX.

 114
Author: Nathan Fellman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:21

Jak rozumiem, każdy "rdzeń" jest kompletnym procesorem, z własnym zestawem rejestrów. Zasadniczo BIOS zaczyna się od jednego uruchomionego rdzenia, a następnie system Operacyjny może "uruchomić" inne rdzenie, inicjując je i wskazując na kod do uruchomienia, itp.

Synchronizacja odbywa się przez system operacyjny. Ogólnie rzecz biorąc, każdy procesor uruchamia inny proces dla systemu operacyjnego, więc funkcja wielowątkowa systemu operacyjnego jest odpowiedzialna za decydowanie, który proces zostanie dotknięty jaka pamięć i co zrobić w przypadku kolizji pamięci.

 42
Author: Nicholas Flynt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-11 13:21:22

Minimal runnable Intel x86 bare metal example

Można uruchomić przykład z gołym metalem ze wszystkimi wymaganymi płytami kotła . Wszystkie główne części są omówione poniżej.

Testowane na Ubuntu 15.10 QEMU 2.3.0 i Lenovo ThinkPad T400. Intel Manual Volume 3 System Programming Guide - 325384-056US September 2015 obejmuje SMP w rozdziałach 8, 9 i 10.

Tabela 8-1. "Broadcast INIT-Sipi-Sipi Sequence and Choice of Timeouts" zawiera przykład, że zasadniczo działa:

MOV ESI, ICR_LOW    ; Load address of ICR low dword into ESI.
MOV EAX, 000C4500H  ; Load ICR encoding for broadcast INIT IPI
                    ; to all APs into EAX.
MOV [ESI], EAX      ; Broadcast INIT IPI to all APs
; 10-millisecond delay loop.
MOV EAX, 000C46XXH  ; Load ICR encoding for broadcast SIPI IP
                    ; to all APs into EAX, where xx is the vector computed in step 10.
MOV [ESI], EAX      ; Broadcast SIPI IPI to all APs
; 200-microsecond delay loop
MOV [ESI], EAX      ; Broadcast second SIPI IPI to all APs
                    ; Waits for the timer interrupt until the timer expires

O tym kodzie:

  1. Większość systemów operacyjnych uniemożliwia większość tych operacji z pierścienia 3 (programy użytkownika).

    Więc musisz napisać własne jądro, aby grać swobodnie z nim: userland Linux program nie będzie działać.

  2. Na początku działa jeden procesor, zwany procesorem bootstrap (BSP).

    Musi obudzić Pozostałe (zwane procesorami aplikacji (AP)) poprzez specjalne przerwania nazywane Inter Processor Interrupts (IPI) .

    [16]}przerwania te mogą być wykonane przez zaprogramowanie Advanced Programmable Interrupt Controller (APIC) za pomocą rejestru poleceń przerwań (ICR) Format ICR jest udokumentowany na: 10.6 "wydawanie przerwań INTERPROCESORA"

    IPI dzieje się tak szybko, jak piszemy do ICR.

  3. ICR_LOW jest zdefiniowany w 8.4.4 "MP Initialization Example" jako:

    ICR_LOW EQU 0FEE00300H
    

    Magiczna wartość 0FEE00300 jest to adres pamięci ICR, jak udokumentowano w tabeli 10-1 "Local APIC Register Address Map"

  4. Najprostsza możliwa metoda jest użyta w przykładzie: ustawia ICR do wysyłania Ipis transmisji, które są dostarczane do wszystkich innych procesorów z wyjątkiem bieżącego.

    Ale możliwe jest również, i zalecane przez niektórych, uzyskanie informacji o procesorach poprzez specjalne struktury danych ustawione przez BIOS, takie jak tabele ACPI lub MP Intela Tabela konfiguracji i budzić tylko te, których potrzebujesz jeden po drugim.

  5. XX W 000C46XXH koduje adres pierwszej instrukcji, którą procesor wykona jako:

    CS = XX * 0x100
    IP = 0
    

    Pamiętaj, że CS wielokrotność adresów przez 0x10, Tak więc rzeczywisty adres pamięci pierwszej instrukcji to:

    XX * 0x1000
    

    Więc jeśli na przykład XX == 1, procesor zacznie się od 0x1000.

    Musimy wtedy upewnić się, że istnieje 16-bitowy kod trybu rzeczywistego do uruchomienia w Miejsce Pamięci, np. z:

    cld
    mov $init_len, %ecx
    mov $init, %esi
    mov 0x1000, %edi
    rep movsb
    
    .code16
    init:
        xor %ax, %ax
        mov %ax, %ds
        /* Do stuff. */
        hlt
    .equ init_len, . - init
    

    Użycie skryptu linkera jest inną możliwością.

  6. Pętle opóźniające są irytującą częścią pracy: nie ma super prostego sposobu, aby dokładnie to zrobić.

    Możliwe metody to:

    • PIT (użyty w moim przykładzie)
    • HPET
    • W przypadku pętli zajętości czas ten może zostać skalibrowany.]}

    Podobne: Jak wyświetlić numer na ekranie i sen na sekundę z DOS x86 assembly?

  7. Myślę, że początkowy procesor musi być w trybie chronionym, aby to działało, gdy piszemy na adres 0FEE00300H, który jest zbyt wysoki dla 16-bitów

  8. Aby komunikować się między procesorami, możemy użyć spinlocka na głównym procesie i zmodyfikować blokadę z drugiego rdzenia.

    Należy upewnić się, że odpis pamięci jest wykonywany, np. przez wbinvd.

Wspólny stan pomiędzy procesory

8.7.1 "Stan procesorów logicznych" mówi:

Poniższe cechy są częścią stanu architektonicznego procesorów logicznych w procesorach Intel 64 lub IA-32 obsługa technologii Intel Hyper-Threading. Cechy można podzielić na trzy grupy:

  • zduplikowany dla każdego procesora logicznego
  • dzielone przez procesory logiczne w fizycznym procesorze
  • dzielone lub powielane, w zależności od realizacja

Następujące funkcje są zduplikowane dla każdego procesora logicznego:

    W 2007 roku firma została założona przez Marka A. S. A., a w 2008 roku została założona przez Marka A. S. A. I. A. S. A., a w 2009 roku przez firmę A. S. A. S. A., a w 2009 roku przez firmę A. S. A.]} W 1996 roku został wybrany do Izby Gmin.]}
  • EFLAGS i rejestry EIP. Zauważ, że rejestry CS i EIP/RIP dla każdego procesora logicznego wskazują na strumień instrukcji dla wątku wykonywanego przez procesor logiczny.
  • rejestry FPU x87 (ST0 przez ST7, słowo statusu, słowo kontrolne, słowo znacznika, wskaźnik operandu danych i instrukcja wskaźnik)
  • rejestry MMX (MM0 do MM7)
  • Rejestry XMM (XMM0 do XMM7) i rejestr MXCSR ([36]} Rejestry kontrolne i rejestry wskaźnikowe tabeli systemowej (GDTR, LDTR, IDTR, rejestr zadań) W 2007 roku firma została założona przez firmę Microsoft, która od 2007 roku zajmuje się dystrybucją i dystrybucją sprzętu komputerowego.]}
  • Machine check global status (Ia32_mcg_status) i Machine check capability (Ia32_mcg_cap) MSRs
  • [[31]}Modulacja zegara termicznego i kontrola zarządzania zasilaniem ACPI MSRs
  • Licznik znaczników czasu MSRs
  • większość innych rejestrów MSR, w tym tabela atrybutów strony (PAT). Zobacz wyjątki poniżej.
  • lokalne rejestry APIC.
  • dodatkowe rejestry ogólnego przeznaczenia (R8-R15), rejestry XMM (XMM8-XMM15), rejestr kontrolny, IA32_EFER on Procesory Intel 64.

Następujące funkcje są współdzielone przez logiczne procesory:

  • rejestry zakresu typów pamięci (MTRRs)

To, czy następujące funkcje są współdzielone lub zduplikowane, jest specyficzne dla implementacji:

  • IA32_MISC_ENABLE MSR (MSR adres 1A0H)
  • W przeciwieństwie do innych systemów, które nie są w pełni kompatybilne ze standardem Ia32_mcg_status i Ia32_mcg_cap, nie są w pełni kompatybilne ze standardem Ia32_mcg_cap.]}
  • kontrola wydajności i przeciwdziałanie MSRs

Omówiono udostępnianie pamięci podręcznej at:

Hyperthready Intel mają większą pamięć podręczną i współdzielenie potoków niż oddzielne rdzenie: https://superuser.com/questions/133082/hyper-threading-and-dual-core-whats-the-difference/995858#995858

Linux kernel 4.2

Główna akcja inicjalizacyjna wydaje się be at arch/x86/kernel/smpboot.c.

Przykłady ramion

ARM wydaje się być nieco łatwiejszy w konfiguracji niż x86, ponieważ ma mniej historycznych kosztów, oto dwa minimalne przykłady:]}

TODO: przegląd te przykłady, i wyjaśnić je lepiej tutaj.

Ten dokument zawiera kilka wskazówek na temat używania prymitywów synchronizacji ARM, których możesz użyć do robienia zabawnych rzeczy z wieloma rdzeniami: http://infocenter.arm.com/help/topic/com.arm.doc.dht0008a/DHT0008A_arm_synchronization_primitives.pdf

 40
Author: Ciro Santilli 新疆改造中心 六四事件 法轮功,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-11 06:50:41

Nieoficjalne FAQ SMP logo stack overflow


Dawno, dawno temu, aby napisać na przykład asembler x86, mielibyśmy instrukcje "załaduj rejestr EDX z wartością 5"," zwiększ rejestr EDX", itd. Czy przy nowoczesnych procesorach, które mają 4 rdzenie (a nawet więcej), na poziomie kodu maszynowego wygląda to tak, jakby były 4 oddzielne Procesory (tzn. czy są tylko 4 odrębne rejestry "EDX")?

Dokładnie. Istnieją 4 zestawy rejestrów, w tym 4 oddzielne wskazówki instruktażowe.

Jeśli tak, to kiedy powiesz "increment the EDX register" , co określa, który rejestr EDX procesora jest zwiększany?

Procesor, który wykonał tę instrukcję, oczywiście. Pomyśl o tym jak o 4 zupełnie różnych mikroprocesorach, które po prostu dzielą tę samą pamięć.

czy w asemblerze x86 jest teraz pojęcie "kontekstu PROCESORA" lub "wątku"?

Nie. Asembler po prostu tłumaczy instrukcje, jak zawsze. Nie. zmiany tam.

Jak działa komunikacja/synchronizacja między rdzeniami?

Ponieważ mają tę samą pamięć, jest to głównie kwestia logiki programu. Chociaż obecnie istnieje mechanizm inter-Processor interrupt, nie jest to konieczne i nie było pierwotnie obecne w pierwszych systemach z podwójnym procesorem x86.

Jeśli piszesz system operacyjny, jaki mechanizm jest ujawniony przez sprzęt, aby umożliwić zaplanowanie wykonania na różne rdzenie?

Scheduler w rzeczywistości się nie zmienia, z wyjątkiem tego, że jest nieco bardziej ostrożny w sekcjach krytycznych i rodzajach używanych blokad. Przed SMP, kod jądra w końcu wywołał scheduler, który spojrzał na run queue i wybrał proces do uruchomienia jako następny wątek. (Procesy do jądra wyglądają jak wątki.) Jądro SMP uruchamia dokładnie ten sam kod, jeden wątek na raz, tylko że teraz krytyczne blokowanie sekcji musi być bezpieczne dla SMP upewnij się, że dwa rdzenie nie mogą przypadkowo wybrać tego samego PID.

czy to jakieś specjalne uprzywilejowane instrukcje?

Nie. Rdzenie działają w tej samej pamięci z tymi samymi starymi instrukcjami.

gdybyś pisał optymalizujący kompilator / bajtową maszynę wirtualną dla wielordzeniowego procesora, co musiałbyś wiedzieć konkretnie o, powiedzmy, x86, aby generował kod, który działa wydajnie na wszystkich rdzeniach?

Biegniesz tak samo Kod jak poprzednio. To jądro systemu Unix lub Windows musiało się zmienić.

możesz podsumować moje pytanie jako " jakie zmiany zostały wprowadzone do kodu maszynowego x86 w celu obsługi funkcji wielordzeniowych?"

Nic nie było konieczne. Pierwsze systemy SMP używały dokładnie tego samego zestawu instrukcji co uniprocesory. Teraz nastąpiła ogromna ewolucja architektury x86 i miliony nowych instrukcji, aby wszystko poszło szybciej, ale żadna nie była niezbędna dla SMP.

Aby uzyskać więcej informacji, zobacz specyfikację Intel Multiprocessor Specification .


Update: na wszystkie kolejne pytania można odpowiedzieć po prostu całkowicie akceptując, że N -way multicore CPU jest prawie1 dokładnie to samo co N oddzielne procesory, które po prostu dzielą tę samą pamięć.2 nie zadano ważnego pytania: jak program jest napisany tak, aby działał na więcej niż jednym rdzeniu dla większej wydajności? Odpowiedź brzmi: jest napisany przy użyciu biblioteki wątków, takiej jak Pthreads. niektóre biblioteki wątków używają "zielonych wątków", które nie są widoczne dla systemu operacyjnego, a te nie otrzymają oddzielnych rdzeni, ale tak długo, jak biblioteka wątków używa funkcji jądra wątków, Twój program wątkowy będzie automatycznie wielordzeniowy.
1. Aby uzyskać kompatybilność wsteczną, tylko pierwszy rdzeń uruchamia się po resecie, a kilka sterowników należy zrobić, aby odpalić Pozostałe.
2. Dzielą się również wszystkie urządzenia peryferyjne, oczywiście.
 33
Author: DigitalRoss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-16 23:00:08

Każdy rdzeń jest wykonywany z innego obszaru pamięci. Twój system operacyjny skieruje rdzeń na twój program, a rdzeń uruchomi Twój program. Twój program nie będzie świadomy, że istnieje więcej niż jeden rdzeń lub na którym rdzeniu jest wykonywany.

Nie ma również dodatkowych instrukcji dostępnych tylko dla systemu operacyjnego. Rdzenie te są identyczne z jednordzeniowymi układami scalonymi. Każdy rdzeń uruchamia część systemu operacyjnego, która będzie obsługiwać komunikację do wspólnych obszarów pamięci używanych do wymiana informacji w celu znalezienia następnego obszaru pamięci do wykonania.

Jest to uproszczenie, ale daje podstawowe pojęcie o tym, jak to się robi. więcej o multicores i multiprocesorach na Embedded.com zawiera wiele informacji na ten temat ... Ten temat bardzo szybko się komplikuje!

 9
Author: Gerhard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-11 13:49:35

Jeśli piszesz optymalizację kompilator / bytecode VM dla wielordzeniowego CPU, co trzeba wiedzieć konkretnie o, powiedzmy, x86, aby generuje kod, który działa sprawnie przez wszystkie rdzenie?

Jako ktoś, kto pisze optymalizujące Kompilatory / bajtowe maszyny wirtualne, może będę w stanie Ci pomóc.

Nie musisz wiedzieć nic konkretnego o x86, aby wygenerować kod, który działa wydajnie we wszystkich rdzeniach.

Jednak możesz musisz wiedzieć o cmpxchg i znajomych, aby napisać kod, który działa poprawnie we wszystkich rdzeniach. Programowanie wielordzeniowe wymaga zastosowania synchronizacji i komunikacji między wątkami wykonania.

Być może musisz wiedzieć coś o x86, aby wygenerować kod, który działa wydajnie na x86 w ogóle.

Są inne rzeczy, których warto się nauczyć:

Powinieneś dowiedzieć się o obiektach systemu operacyjnego (Linux, Windows lub OSX) umożliwia uruchamianie wielu wątków. Powinieneś dowiedzieć się o interfejsach API do paralelizacji, takich jak OpenMP i Threading Building Blocks, lub nadchodzącym "Grand Central"OSX 10.6 "Snow Leopard".

Powinieneś rozważyć, czy twój kompilator powinien być automatycznie równoległy, lub czy autor aplikacji skompilowanych przez twój kompilator musi dodać specjalną składnię lub wywołania API do swojego programu, aby skorzystać z wielu rdzeni.

 9
Author: Alex Brown,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-11 16:42:19

Kod złożenia przełoży się na kod maszynowy, który będzie wykonywany na jednym rdzeniu. Jeśli chcesz, aby był wielowątkowy, będziesz musiał użyć prymitywów systemu operacyjnego, aby uruchomić ten kod na różnych procesorach kilka razy lub różne fragmenty kodu na różnych rdzeniach - każdy rdzeń wykona osobny wątek. Każdy wątek będzie widział tylko jeden rdzeń, na którym jest aktualnie wykonywany.

 5
Author: sharptooth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-11 13:21:19

Nie jest to wykonywane w instrukcji maszynowej w ogóle; rdzenie udają różne procesory i nie mają żadnych specjalnych możliwości rozmawiania ze sobą. Są dwa sposoby komunikowania się:

  • Dzielą fizyczną przestrzeń adresową. Sprzęt obsługuje spójność pamięci podręcznej, więc jeden procesor zapisuje na adres pamięci, który odczytuje inny.

  • Dzielą one APIC (programmable interrupt controller). Jest to pamięć odwzorowana w fizycznej przestrzeni adresowej i może być używany przez jeden procesor do sterowania innymi, włączania lub wyłączania, wysyłania przerwań itp.

Http://www.cheesecake.org/sac/smp.html jest dobrym odniesieniem z głupim adresem url.

 2
Author: pjc50,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-27 13:56:55

Główna różnica między aplikacją jedno - i wielowątkową polega na tym, że pierwsza ma jeden stos, a druga ma po jednym dla każdego wątku. Kod jest generowany nieco inaczej, ponieważ kompilator założy, że rejestry segmentów danych i stosu (ds I ss) nie są sobie równe. Oznacza to, że przekierowanie przez rejestry ebp i esp, które domyślnie są rejestrami ss, nie będzie również domyślne dla DS (ponieważ ds!= ss). Odwrotnie, poprzez inne rejestry, które domyślnie są ds nie będzie domyślnie ss.

Wątki dzielą Wszystko inne, w tym obszary danych i kodu. Mają również wspólne procedury lib, więc upewnij się, że są bezpieczne dla wątków. Procedura sortowania obszaru w pamięci RAM może być wielowątkowa, aby przyspieszyć działanie. Wątki będą następnie uzyskiwać dostęp, porównywać i porządkować dane w tym samym obszarze pamięci fizycznej i wykonywać ten sam kod, ale używając różnych zmiennych lokalnych do kontrolowania ich odpowiedniej części sortowania. To oczywiście dlatego, że wątki mają różne stosy, w których znajdują się zmienne lokalne. Ten rodzaj programowania wymaga starannego dostrojenia kodu, tak aby kolizje między rdzeniami danych (w pamięci podręcznej i pamięci RAM) były zredukowane, co z kolei skutkuje szybszym kodem z dwoma lub więcej wątkami niż z jednym. Oczywiście, nie dostrojony kod będzie często szybszy z jednym procesorem niż z dwoma lub więcej. Debugowanie jest trudniejsze, ponieważ standardowy punkt przerwania "int 3" nie będzie miał zastosowania, ponieważ chcesz przerwać konkretny wątek i nie wszystkie. Punkty przerwania rejestru debugowania również nie rozwiązują tego problemu, chyba że możesz ustawić je na określonym procesorze wykonującym określony wątek, który chcesz przerwać.

Inny wielowątkowy kod może obejmować różne wątki działające w różnych częściach programu. Ten rodzaj programowania nie wymaga tego samego rodzaju strojenia i dlatego jest znacznie łatwiejszy do nauczenia się.

 1
Author: Olof Forshell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-22 12:25:43

To, co zostało dodane na każdej architekturze zdolnej do przetwarzania wieloprocesorowego w porównaniu z wariantami jednoprocesorowymi, które pojawiły się przed nimi, to instrukcje synchronizacji między rdzeniami. Ponadto, masz instrukcje, aby poradzić sobie z spójnością pamięci podręcznej, buforami płukania i podobnymi operacjami niskiego poziomu, z którymi ma do czynienia SYSTEM OPERACYJNY. W przypadku jednoczesnych architektur wielowątkowych, takich jak IBM POWER6, IBM Cell, Sun Niagara i Intel "Hyperthreading", często pojawiają się nowe instrukcje ustalania priorytetów między wątkami (jak ustawianie priorytetów i jawne ustępowanie procesorowi, gdy nie ma nic do roboty).

Ale podstawowa semantyka jednowątkowa jest taka sama, wystarczy dodać dodatkowe udogodnienia Do obsługi synchronizacji i komunikacji z innymi rdzeniami.

 0
Author: jakobengblom2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-18 18:20:46