ASK, Studia PŚK informatyka, semestr 2, archtektura


Architektura Systemów Komputerowych 6.10.2008

dr Mariusz Kapruziak

konsultacje: poniedziałek 16-17; czwartek 12-13

udostępnia wykłady; egzamin pisemny + ustny

komputer - przetwarza informacje w sposób deterministyczny;

ENIAC - 1szy komputer według architektury von Neumanna

4 funkcje komputera: przenoszenie, przechowywanie danych, przetwarzanie danych zewnętrznych i wewnętrznych;

Komputer = jednostka centralna (CPU) + pamięć + połączenia systemowe + urządzenia I/O

CPU = rejestry + jednostka sterująca + ALU (jednostka arytmetyczno-logiczna) + połączenia wewnętrzne

rejestry - pamięć statyczna, szybka lecz droga, pracuje z prędkością CPU

str. 13

architektura komputera - składniki (ich obecność lub brak), ew. ich możliwości (w sensie lista instrukcji procesora);

organizacja komputera - jakie są połączenia składników i jak są one zbudowane;

(możliwe jest zbudowanie komputerów o takiej samej architekturze i różnych organizacjach)

str 14.- rozdział 2 z podanej książki

schemat najprostszego CPU;

str 15

„to niebieskie” - układ wykonawczy

ALU - jest zbiorem operacji, samo z siebie nic nie robi. Z zewnątrz jest wybierana operacja i dostarczane dane; alu nie pobiera i nie wysyła;

rejestr wskaźników - niezbędny do instrukcji skoku

rejestr przejściowy - przechowywane są tam dane pobrane z pamięci

akumulator - pomaga utrzymać drugi argument, najczęściej jest to wynik poprzedniej operacji pochodzący bezpośrednio od ALU;

Zegar - zabezpiecza przed zjawiskiem hazardu; gwarantuje że zczytywany wynik jest już ustalony;

Licznik programu - adres na instrukcję, która ma zostać pobrana;

wskaźnik stosu - zapamiętuje poprzednią wartość licznika programu (aby móc wrócić po wykonaniu funkcji). Ponieważ jest zorganizowany w strukturę stosu, można zagnieżdżać funkcję wewnątrz funkcji teoretycznie w nieskończoność.

<omówił cykl maszynowy>

suma 8 elementów w assemblerze (???)

mov a

add b; add c; (...)

store y;

//---------------------------------------------------------------------------------------

13.10.2008 ASK; wykład 2

opisuje znów słynny obrazek;

mamy jedną szynę danych - to starcza na dostarczenie tylko jednego argumentu w danym cyklu. Akumulator - specjalny zbiór rejestrów - który dostarcza 2gi argument.

Wartość rejestru na szynę adresową - w kolejnym cyklu pamięć odpowiada, jedziemy do rejestru rozkazów. Dekodujemy (zamieniamy słowa instrukcji na szynę sterującą, czyli na zestaw sterujący do multiplekserów iw szsystkiego tam tam <mamrocze>.) Równolegle z dekodowaniem pobieramy jakąś wartość argumentu (albo adres albo wartość do rejestru przejściowego). Jeśli adres to z pamięci danych jedzie wartość do rejestru przejściowego. Dopiero teraz ALU wykonuje, zapisuje wynik do akumulatora i jedziemy od początku.

To trwa kilka cykli zegara.

To, na co wskazuje program counter to program, to, na co wskazuje instrukcja to dane

---

Procesor PIC16F84A. Akumulator nazywa się W Reg. TO na prawo to układy peryferyjne. To na górze: znajome elementy. Działa to podobnie jak wcześniej.

Architektura harvardzka - jak von Neumanna, ale pamięć danych i programów są rozdzielone. Mamy 2 osobne szyny adresowe, 2 szyny, programu i danych. (Można jednocześnie pobierać instrukcje i dane, to zaleta).

„rozdzielenie części wykonawczej od danych; zupełnie osobno ALU i zupełnie osobno dane”. Pamięć danych i programów logiczne spójna. Ciągła żonglerka danymi między ALU a pamięcią - „wąskie gardło von Neumanna”. Aby zapobiec temu problemowi: akumulator, cache.

Ta architektura źle znosi równoległość.

Instrukcja = operacja + argument dla niej.

Str 6/32

OPCODE - kod operacji.

TRYBY ADRESOWANIA - egz.

implikowane, natychmiastowe, bezpośrednie, względne, pośrednie, indeksowe

R.Pełka, „Mikrokontrolery, architektura, programowanie, zastosowania”

Str 10/32

f - wartość w pamięci, W - akumulator

MOVF - ładuje z pamięci do f, MOVWF - z akumulatora do pamięci.

Str 11/32

jeśli bit ma wartość 1, pomiń następną instrukcję (bit test f, skip if set)

str 12/32

L - literał

CALL jak GOTO, ale CALL zapisuje dotychczasową wartość PC, żeby można było tu wrócić.

Watchdog - program do resetowania procesora. Jest jakiś timer, który dojdzie do zadanej wartości, to resetuje procesor. Procesor może w dowolnej chwili wyczyścić ten timer. Jak będzie to robił wystarczająco często, to wszystko będzie w porządku.

PORT - port procesora, szyna wystawiona na zewnątrz procesora

TRIS - najmłodszy bit to wyjście, reszta to wyjścia

Koncepcja banku - jako że starsze bity i tak się nam nie zmieniają - bo zazwyczaj poruszamy się w bloku blisko siebie umieszczonych komórek pamięci - to zapiszmy jeden bit np. w rejestrze STATUS. Należy pamiętać o kontrolowaniu tego rejestru gdy opuścimy dany „rejon”.

Najważniejsze co umieć: pisanie programów w assemblerze!

Dwa: jak można by zmienić architekturę żeby coś uzyskać.

Str 15/32

analiza programu.

TRISA ma wartość 85

Linia

1: ustawiamy bit 5 w rejestrze statusu; to jest bit banku, najstarszy bit;

2: do akumulatora wartość FE

3: do f z akumulatora

4:

20.10.2008 wykład 3

slajd 2/32

decfsz: decrease; f - wartość w pamięci; sz - skip zero (jeżeli wyjdzie 0, to następną instrukcję pominie).

Jeżeli ustawimy to przed instrukcją goto, to będzie to stanowiło warunek wyjścia z pętli (bo w końcu pominie instrukcję skoku)

iorwf - zwykły or między tym co w akumulatorze i rejestrze

movwf - przesuń to co w akumulatorze do rejestru

movlw - …

segment(…) n/c

0x10 to liczba 00010000. SHL sprawdza konkretny bit (np. 4 bit). JZ skoczy jeśli flaga 0 jest ustawiona. CALL, RET.JA, JAE.

Tryby adresowania:

pośrednie - musi dwa razy odwołać się do pamięci. Adres może być w rejestrze - lepiej wtedy. Stąd rejestrowe (w liście instrukcji) Rejestrów jest mało - są dość drogie i prądożerne, wykorzystujemy tylko dlatego że pracują z taką samą prędkością jak procesor, dużą powierzchnię zajmują. Jest ich kilka, może kilkadziesiąt. Pamięci dużo - w gigabajtach.

Jak niejawnie adresujemy to na stosie, adres ->instrukcja direct

AX wpisujemy tam gdzie wskazuje [] - pośrednie rejestrowe.NOT - negacja tablicy.

To są te same co wcześniej tylko bardziej sprecyzowane.

BIOS (12/35)

lea=mov - to samo

int - przerwanie

w 10 przerwaniu odnośnie grafiki ekranu. Jeśli AH = 0EH to ma wypisać znak. Od done to do klawiatury. Program służy do wypisania tekstu na ekranie. Jest pętla inkrementowana. <Dopóki nie napotka 0 na końcu to będzie wypisywać. SI - indeks - gdzie jesteśmy w ramach łańcucha, msg jest adresem na początek naszego łańcucha. Segment danych i kodu to ten sam (zakładamy). Do AH wpisujemy R Do AL wpisujemy to na co wskazuje SI (bo []). SI się nie zmienia. Porównujemy czy AL jest 0. Nic się nie zmienia tylko ustawia flagę. Jeśli było zero to skaczemy do done - łańcuch się skończył. Jeśli nie ma zera to wykonujemy przerwanie 10h. Następnie zwiększamy SI i skaczemy znowu do góry. Jak się wysypuje to się resetuje.

8086 - płyta historyczna. Układ resetuj zegar (po lewej na górze). Szyna wyindeksowana. Potrzebujemy zatrzask i transiwer. 14 nie jest ważny.

Mostek północny(mniejszy) i południowy - głównym zadaniem jest pracować szybko. AGP - b. szybkie złącze. Mało skomplikowany, bo szybki. To co może chodzić wolniej jest przerzucane na mostek południowy. Procesor komunikuje sę praktycznie tylko z mostkiem. (15 slajd)

16-20 - „nie wiem co o tym powiedzieć. (najważniejszy był x86)”

Mnożenie: napisać program mnożący wartość pod adresem (offset) 0x20 razy pięć i zapisujący wynik w 0x21

mov 0x21, 0

mov AX, 0x20

shl AX, 2

add AX, ox20

mov 0x21, AX

segment i banki; segmenty można przemieszczać w pamięci, można gęsto ustalać (w x8086 mogą być co 16 bajtów (słów)). Banki - statyczne

Rejestry

C - code -kodu

E - extended

D - data - danych

S - stack - stosu

SP - stack pointer; wskazuje na adres elementu stosu;

SS - wskazuje na zerowy element stosu;

(slajd 11 ważny)

BIOS - układ wbudowany nadzorujący start;

slajdy 21-23/35;

slajd 24; niekończąca się pętla ważne

Przerwania:

INT 10h - w AL kod znaku ascii który chcemy wypisać

INT 16h - oczekuje na znak z klawiatury i zapisuje w AL

INT 21h - wyłącza program

.startup - wywołanie makra

s.25 - wypisze tylko „czesc”; s. 26 to samo, ale z jawną deklaracją segmentów;

plik .exe - tam nie są po kolei instrukcje.

Tryb chroniony - ogranicza dostęp do pamięci oraz urządzeń I/O, aby nie było np. problemów gdy dwa programy równocześnie pracują nad tym samym sektorem pamięci.

Dowolne rozmiary segmentów i offsetów.

4 poziomy praw dostępu w SO.

s. 32 : lokalne i globalne tablice deskryptorów

Tab. desk to też rodzaj segmentów. W globalnej mogą znaleźć się segmenty z tablicami z kolejnymi tablicami deskryptorów. (glob. Nie może być po prostu zbyt duża, ona wskazuje na lokalne; „ktoś” lokalnie rezerwuje sobie tablicę). Żółte elementy - ich zadaniem jest przełączanie procesów

segment - organizacja w pamięci wielu różnych danych (jakaś nadrzędna rzecz nad bajtem); to innowacja architektury 8086 (choć funkcjonowało już wcześniej).

Pomysła : powołujmey dwa nowe rejestry (GDTR i LDTR). Powołujemy tab. deskryptorów, która nie może być rejestrem, bo jest duża. Jej adres jest w GDTR, a ona sama jest fragmentem (segmentem) w pamięci. Można tam zapisywać tylko z priorytemte 0 (tpoziom prawd dostępu w SO). Ta tablica jest z opisami segmentów. Nie możemy ich dowolnie ustawiać (segmentów),m musimy odwoływać się do tej tablicy.

Druga (ta ciemna niżej) jest lokalną tablicą deskryptorów. Też jest segmentem. Musi mieć więc wpis w tablicy globalnej. (To jest pierwszy dodatkowy segment który stworzyliśmy) Drugi to TSS:

Cały tryb chroniony ma sens gdy jest więcej niż jeden proces (bo jeden sam sobie nie będzie sobie szkodził). Skoro tak, powinien istnieć mechanizm automatycznego przełączenia kontekstu. (czyli przełączania z którego segmentu aktualnie czytamy/piszemy). TSS - segment który się tam zajmuje, tam jest zapisany stan procesu w czasie gdy zabieraliśmy mu sterowanie (rejestry, flagi, cały kontekst żeby wrócić do danego procesu). Taka hibernacja procesu.

s. 33; .model flat - sterujemy całą szyną adresową.

Przerwań się tutaj już nie nadużywa;

Invoke - wywołuje funkcję; jako argumenty potrzebuje nazwę funkcji oraz parametry tej funkcji.

Te parametry - na stosie. Tak samo lokalne zmienne.

Czyli Invoke push'uje od końca : najpierw parametry, na sam koniec nazwę funkcji.

//---------------------------------------------------------------------------------------

Wykład 4, 3.11.2008

Mnożenie liczb ze znakiem w U2; 1011 to -5;

(011 → 100, dodajemy 1 → 101);

w liczbie ujemnej przed nią stoi nieskończenie wiele jedynek (tak jak przed zwykłą liczbą stoi nieskończenie wiele zer). Czyli jeśli zapisujemy naszą -5 to w działaniu wpisujemy 11111011;

W wyniku odrzucamy wszystkie bity ponad ósmy (wynik 010 1111 0001, zostawiamy 1111 0001);

wady U2 - mamy dwa zera. Poza tym problem z dodawaniem (??)

Zadanie: if (a < 12) y = 1; else y = 0;

użyj: sub, cmp, mov, jc (skocz jeśli flaga C jest ustawiona)

cmp - to odejmowanie bez zapisania wyniku.

c = 1 gdy drugi argument jest > od pierwszego

mov ax, a

cmp ax, 0xC (12 w szesnastkowym)

mov y, 0

goto inna

jc end

end: mov y, 1

inna: (bla bla)

Historia... <sleep>

eniac - pierwszy elektroniczny, na nim zauważono że głupio robić kompy jednego przeznacznia

UNIVAC

//----------------------------------------------------------------------------------------

wykład 5, 17.11.2008

synteza układu wykonawczego: rejestry + ALU

synteza układu sterującego: jego zadaniem jest ustawienie multiplekserów (które wybierają który sygnał przekazywany jest z rejestrów do ALU).

Skrajne podejścia - kod maszynowy odpowiada szynie adresowej (łatwo przełożyć jedno na drugie) [kodowanie horyzontalne].

Lub: krótkie słowa maszynowe dekodowane przez dekoder - tłumaczy np. 8bitowe słowo sterujące na wielkość szyny sterującej [kodowanie wertykalne]. Instrukcji jest dużo mniej niż wynikałoby to z wielkości szyny sterującej (i całe szczęście).

[Kodowanie mieszane] - dzielimy słowo - to dotyczy ALU, to rejestrów etc. Każdy fragment możemy kodować dowolnie wertykalnie lub horyzontalnie, jak wygodniej.

cykl

fetch (pobranie z pamięci)

execute - składa się z: pobranie argumentów, wykonanie operacji, zapisanie wyniku

Mechanizm przerwań PIC (8/34)

urządzenie zewnętrzne informuje procesor, a nie procesor odpytuje urz. zew. (czy na pewno?? )

Dowiadujemy się że ktoś od nas coś chciał i zaczynamy odpytywać każdego po kolei.

retfie - wraca do wartości odłożonej na stosie. Ustawia flagę zezwalającą na przerwania na 1. Instrukcja specyficzna dla PIC-a.

podział mechanizmów przerwań (9/34)

Mechanizm przerwań Polling

jest jedno przerwanie, ale nie informuje kto był źródłem.

Przerwanie nie może być przerwane.

Mechanizm przerwań wektor przerwań (13/34)

są priorytety - po otrzymaniu przerwań sprawdzamy które jest ważniejsze

8 możliwych źródeł przerwań; (przechodzą przez maski - one eliminują przerwania które nas nie interesują).

W IRR zapisujemy kto wywołał przerwanie

priority resolver wybiera jedno urządzenie i jego numer przekazuje dalej.

Dlaczego podaje je na szynę danych, a nie na szynę adresową?

Zmiana kontekstu: (było wcześniej, przy trybie chronionym).

Invoke (było)

DMA -

„w dma nic nie mogliśmy nic zrobić, tylko transfer”

(przyspiesza?)

DTC

długo omawiał 24/34

(25/34) - potok (pipeline)

ścieżka krytyczna- ścieżka o najdłuższym czasie propagacji

z A1 do A6 - miną 4 cykle. (a1, a3, a5, a4, a6)

przez potokowość możemy zmniejszać ścieżkę krytyczną.

Ta linia przerywana - przecina wszystkie strzałki prowadzące w tym samym kierunku. (przykład (b) jest błędny (?) )

na przeciętnych liniach dodajemy D (zapisanie wartości do rejestru (?)).

Tam gdzie D - połączenie nie trwa już jednego cyklu (zero?)

w przypadku (c) ścieżka krytyczna wynosi 2 cykle.

WAŻNE: jedno kółko to jedna operacja.

Strzałka - zależności danych między operacjami (dana operacja wymaga danych od poprzedniej)

D - bufor (jakiś rejestr zapamiętujący)

„chodzi o to żeby przetransferować jakieś wartości z jednego rejestru do drugiego”

„Żeby na A1 była poprawna dana, wystarczy czas propagacji A1”

W pierwszym cyklu jest na A1 i automatycznie pójdzie też tam gdzie na liniach jest D.

między ustaleniem się stanu na wejściu i wyjściu któregoś A, mija jeden cykl zegarowy.

wykład 6, 24.11.2008

potok - opłacalne rozwiązanie przy stosowaniu jednego algorytmu dla wielu danych

stosowany w układzie sterującym.

Wszystkie RISC-i mają potok w układzie sterującym.

27/34 - w początkowych cyklach nie są wykonywane żadnej instrukcje. Potem konsekwentnie wykonujemy jedną instrukcję na cykl, więc zbliżamy się do średniej 1 instrukcji na takt zegara.

Skoki w potoku to problem: jeśli aktualna instrukcja to skok, to niepotrzebnie pobraliśmy następną instrukcję (czyli zonk, trzeba ją usunąć i sięgnąć po odpowiednią, żeby odbudować potok.

Zadanko: Potok o głębokości n. 90% instrukcji to nie są skoki. Reszta to skoki. Jaka będzie średnia liczba cykli zegara potrzebna do wykonania jednej instrukcji? (to samo co na tamtym wykresie) < liczba wszystkich wykonanych instrukcji / liczba wszystkich taktów instrukcji >

„typowe zadanie na egzamin”

alfa - prawdopodobieństwo wystąpienia czegoś = 0,9

śr = 1 * alfa + N * (1 - alfa) = alfa + N - N * alfa = alfa ( 1 - N ) + N

bo 90% czekamy tylko jeden takt, a 10% czasu czekamy N taktów na wynik.

śr = 1 ( 1 - gamma) + N*gamma = gamma ( N - 1 ) + 1

N - głębokość potoku.

gamma to ta część która zrywa potok

________________WZOREK_______________________

1/ILP - ile cykli wykonujemy w jednej instrukcji. |

ILP = (N - 1) * gamma + 1 |

_______________________________________________|

slajd 31/34 !

Metody przewidywania skoków (33/34)

Statyczne - nie śledzą, po prostu zawsze w danych warunkach coś robią

1. always taken/ not taken. Zakładamy że zawsze (lub nigdy) na instrukcji warunkowej skaczemy.

2. forward - instrukcja skoku spowoduje dodanie adresu.

Czyli wymyślamy sobie że dla warunków skoku „w przód” skok się nie odbędzie, a w „tył” - zawsze się odbędzie. Dlaczego tak a nie odwrotnie - bo wykorzystywane w pętlach często.

3. nigdy nie zrywamy potoku - czyli zanim wykona się skok, to parę instrukcji jeszcze przejdzie. (kłopot dla programisty, trzeba o tym pamiętać, po każdym skoku wstawiać jałowe funkcje; a zmiana głębokości potoku w nowej rodzinie spowoduje konieczność zmiany kodu programów dawniejszych)

Metody dynamiczne ( do 98% skuteczności)

1. zapamiętujemy dokąd był ostatni skok

2. liczymy ile razy skoczyliśmy ( ?? )

3. Pamiętamy też historię skoków - w każdym bicie zapamiętuje ostatni/przedostatni wynik obliczeń.

Kolejny pdf

2/20; zależy nam na małej mocy procesora bo temperatura i baterie. Nie da się łatwo obniżyć bo minimalne napięcie progowe i szumy na łączach.

5/20 obliczamy h i porównamy z tabelką. Unoszenie wymuszone wymaga już wiatraczka.

6/20 „jakiś podział, nie wiem czy on jeszcze obowiązuje”

w pc-cie pktem centralnym był mostek północnym. W PDA - mikroprocesor.

9/20 jeden procek do aplikacji, drugi do połączeń.

13/20 (4 duże risc-owe architektury.) W ARM - mała, niskomocowa struktura. Jedno ALU, i dwie dziwne rzeczy: mnożarka i barrel shifter (przesuwa o zadaną liczbę bitów) .

Mnożarka jest osobno, ponieważ mnożenie w ALU jest bardzo skomplikowane (przesunięcia i dodawanie), a poza tym czasami równocześnie coś mnożymy i dodajemy. Jest to wykorzystywane przy przetwarzaniu ciągów sum iloczynów. Możemy takie operacje wykonać wtedy jako jedną instrukcję.

(risc - stały rozkaz instrukcji)

Little/big endian format.

Dana wymagająca więcej niż jednego bajtu - jak ją zapisać. Czy ze wzrostem adresu to ma być młodsza czy starsza część?

LEF - x86 - my wskazujemy na bajt najmłodszy

BEF - motorola - wskazujemy na bajt najstarszy

wykład 7, 1.12.2008

zapisz pętlę: while (( a != 0) && (b < 10 )) { }

start:

cmp a, 0

jz koniec

cmp b, 10

jb wnętrzePętli

jmp koniec:

wnętrzePętli:

.

.

.

jmp start

koniec: (…)

Swobodny dostęp do pamięci - niesekwencyjny.

Rejestry - drogie i szybkie.

Pamięć główna - ulotna, w dużej ilości, w miarę szybka.

Pamięć cache - nieulotna. Podręczna.

Slajd 5/30 mały not i duży not. Ten mały musi być słaby...

Slajd przedstawia jedną komórkę pamięci (jeden bit).

Slajd 11/30. najpierw wybieramy wiersz. Sygnał do bufora, tam jest wzmacniany. Wybieramy kolumnę (konkretny jeden z czterech bitów.) Proces odczytywania z pamięci rozładował kondensatory. (cały wiersz się wyzerował). Trzeba teraz z powrotem zapisać odczytane wartości. Dlatego najpierw adresuje się wiersz, potem kolumnę. Wracający sygnał ładuje z powrotem kondensatory.

Latch - zatrzask. Jeśli EN = 1, to sygnał przez niego przechodzi. Jeśli nie, to utrzymuje stary sygnał.

RAS only refresh - podajemy tylko RAS (wybór wiersza) - wczyta i przeładuje. (to po to, żeby odświeżyć kondensatory). Wada - musimy sterować szyną adresową. To niewygodne, bo szyna ważna jest, trzeba ją za każdym razem przeładowywać.

Podanie CAS przed RAS. Pamięć wie że to nie jest poprawne odwołanie do pamięci (kolumna przed wierszem - wtf?). Zwalniamy szynę danych i szynę adresową, w jakimś counterze jest przechowywany adres wiersza który odświeżamy (?)

Odświeżanie całego bloku - pamięć na jakiś czas nie odpowiada.

Asynchroniczna DRAM - pustka.

Asynchroniczne - trochę nieprzewidywalne, bo zależne od jakiejś temperatury i innych dziwnych czynników.

Synchroniczne DRAM;

komenda - sekwencja sterowania

28/30

Pamięć flash; w pendrivach nandowa. Lepsza jest norowa ( używana w systemach wbudowanych - szybki odczyt, wolny zapis.)

nand - zbyt wolna jako np. pamięć procesorowa

przykład: zapisz kod: for( i =0, i<10, i++) { };

mov al, 0

start:

inc al

cmp al, 10

jne start

wykład 9, 15.12.2008

trzy rodzaje zależności (w których nie mamy zysku z więcej niż jednego ALU):

- prosta (kolejna operacja potrzebuje wynik poprzedniej)

- odwrotna (wynik jednej operacji zależy od kolejności wykonywania innych operacji)

- wyjścia (zmiana kolejności zmieni wynik na wyjściu)

Dwie ostatnie to zależności „nazwowe” - można je obejść zmieniając nazwę części zmiennych (czyli wprowadzając nowe, zamiast wykonywać cały czas obliczenia na tych samych zmiennych)

slajd 5/17 - ważne!

W sekwencyjnym kodzie próbujemy określić które instrukcje mogą się wykonać równolegle (a nie rozpatrujemy tego wątkami - w sensie które wątki mogą się wykonywać równolegle - to są duże bloki, nas interesują małe ziarenka ;) )

istnieje szereg algorytmów (trudnych obliczeniowo) które nie pasują do „bloków”, ale do pojedynczych instrukcji - tak.

Graf na slajdzie:

na etapie kompilacji (generowania kodu maszynowego) - możemy już jakieś równoległe obliczenia wyznaczać.

zadania procesora - na podstawie kodu maszynowego dopiero.

Jeżeli kod danego starego programu nie przewiduje wykorzystywania równoległości, za ten proces odpowiada tylko procesor. - to są procesory superskalarne. Mają ogromny układ sterujący.

Przepływowe - wrócimy do nich później

określenie zależności - patrz początek tego wykładu

określenie niezależności - instrukcje które nie zależą od siebie mogą być wykonane równoległe.

Jednostka funkcjonalna to na przykład ALU, mnożarka, lub inny blok wspomagający.

To przypisanie to jest wprost powiedzenie co ma być przez co wykonywane - dlatego na etapie kompilacji (dla architektur od VLIW w dół) trzeba wiedzieć jakie i ile jest jednostek funkcjonalnych

VLIW - w systemach wbudowanych. (slajd 7/17)

TTA - operacja jaką chcemy wykonać zależy od rodzaju danych jakie wrzucamy na szynę.

Adres odpowiada za operację. Adresem określamy operację (arch move?)

Wykuj te nazwy stąd... // egz (11/17 ??)

7/17 VLIW

gdy mamy dużo (kilkadziesiąt) jednostek funkcjonalnych, każda ma swój fragment w pamięci (gdzie ma zdefiniowane jakie operacje wykonuje). Potrzeba tylko do tego odpowiedniego kompilatora.

Każdy fragment słowa rozkazu odpowiada konkretnej jednostce funkcjonalnej.

Nowy procesor - trzeba przekompilować kod.

NXP - spółka Philipsa (Holandia)

Sharc DSP - Francja / globalna

8/17

zestawienie z potokiem - trzeba umieć pobrać dwie instrukcje naraz (problem polega na tym że dwie kolejne instrukcje mogą nie być takie żeby można je było wykonywać równolegle).

Od sześciu jednostek funkcjonalnych (JF) nasz układ sterujący, wybierający instrukcje, organizujący zrównuje się rozmiarem z samym układem obliczeniowym.

9/17

EPIC

Template - (4 bity) punkt określając zależności między trzema instrukcjami wcześniej.

Procesor ładuje sobie takie słowo składające się z trzech instrukcji oraz template'a - ma podane co od siebie zależy lub nie i może odpowiednio rozdzielić między kolejki. W związku z tym że na poziomie kodu nie mamy przypisania do konkretnych jednostek funkcjonalnych sam program zyskuje na przenośności. (dlatego: epic - architekturą przyszłości? to efektywniejsza architektura, bo superskalarna musi sobie obliczać te same informacje)

12/17

architektura przepływowa (fail):

dane miały być zapamiętywane razem z operacją - miało to być rozwiązaniem „wąskiego gardła von Neumanna”

token - info od kogo wyszły dane - to jest przekazywane dalej, bo być może kolejne operacje potrzebują te same dane.

Każda operacja musi śledzić, czy otrzymała już swoje dane czy nie - dla każdej potrzebny jest malutki prymitywny procesorek.

14, 15/17

Prawo Amdahla - jakie jest przyspieszenie wykonania algorytmu, jeżeli go wykonamy na n procesorach.

przykładzik. Egz. n -ilość procesorów

Sn = T1 / Tn

t1 - czas wykonania na jednym procesorze

Tn - czas wykonania na n procesorach

alfa - część zadania która się nie zrównolegla (te operacje oczekują na wyniki poprzednich operacji)

(1 - alfa) - część zadania która się zrównolegla

Tn = (1 - alfa) * T1/n + alfa * T1

Podstawiamy do wzorku na Sn i wychodzi nam:

Sn = n / (1 + alfa * (n-1))

to oznacza że użycie nieskończonej ilości procesorów przyspieszy nam wykonanie tylko (alfa) krotnie. Sn→nieskończoność = 1/alfa.

wykład 10, 22.12.2008

dokończenie poprzedniego wykładu. Różniac między architekturami statycznymi a dynamicznymi.

Statyczne planowanie - jawne przypisanie instrukcji do jednostek funkcjonalnych. (dynamiczne - gdyby nie było takiego stałego przypisania.)

arch von Neumanna - procesor często niepotrzebnie zapisuje/odczytuje dane, mógłby je sam zapamięŧywać (rejestry - za mało) - „wąskie gardło von Neumanna”

scoreboarding - blokowanie instrukcji zależnych

2/28

(dawniej: RAW - prosta zależność

WAR - zal. odwrotna

WAW - zależność wyjście)

3/38

dekoder - kod maszynowy instrukcji tłumaczy na szynę sterującą.

ID rozdzielone na IS i RO - rozdzielanie na jednostki funkcjonalne.

5/28

nowy pomocniczy zestaw rejestrów do kontrolowania algorytmu. Każdy rejestr - ma dwa bity - tam info czy chcemy czytać czy pisać. (?)

to oczywiście dotyczy korzystania tylko z rejestrów. Jak to wykorzystać przy zabawie z normalną pamięcią?

Instrukcja nie może odwoływać się do pamięci (oprócz dwóch: odczytująca i zapisująca wartości z pamięci).

Next pdf;

chroboty.

Wykład 11, 5.01.2009

I generacja - na lampach

II - tranzystory

III - układy scalone

II/III - złamane prawo (grosza) - 2 razy większy komp, 4 razy większa wydajność

9-12/36

wieloprocesory symetryczne - wszystkie procki muszą mieć taki sam dostęp do pamięci i urządzeń i/o. Nie posiadają lokalnej pamięci (prócz cache'u). Połączone wspólną szyną. wada - wspólna pamięć, konflikt o nią.

Pamięć wieloportowa - możliwe jednoczesne zapisanie do dwóch różnych komórek pamięci. Drogie wykonanie, poza tym i tak ten konflikt o zasoby się pojawi.

15/36

L2 - współdzielona pamięć cache

17/36

rozwiązania programowe - „prymitywne”

protokoły podglądania - procesory widzą komunikację kolegów z pamięciami. Przykład algorytmu - 19/36

SMP:

jeśli mam jako jedyny coś w cachu - E(xclusive). Jeżeli ktoś inny sobie też to wpiszę - S(hared). Jeżli zmieniam tą danę - M(odified) i inforumuję o tym resztę (wewnętrzna szyna) i reszta zmienia sobie ustawienie tej danej na I. Jeżeli one będą chciały tą danę, to odwołają się do tego procesora który posiada tą daną z oznaczeniem M.

To rozwiązanie pozwala nam mieć spójną pamięć i zmniejszyć ilość odwołań do niej.

Klastry

podział zadań między procesory - bardziej problem oprogramowania niż sprzętowy. Niefajne, jeden proc poświęcony na rozdzielanie zadań. Brak możliwości odczytania pamięci sąsiada.

Jeden procesor jak już otrzyma zadanie nie musi komunikować się z resztą.

NUMA

w smp pamięć była fizycznie spójna - tu jest logicznie spójna.

Jest trochę jak klaster - szereg komputerów połączonych szyną, ale cała pamięć widziana jako liniowo ciągła.

cc-numa - rzadko stosowane, podobnie jak wcześniej smp.

Lokalne szyny, więc przy dużej równoległości, numa może być efektywniejsza od smp.

Informacja o zawartości cache każdego procesora jest przechowywana centralnie (?)

Vector Processors

przetwarzanie potokowe. (SIMD) Cechą charakterystyczną SIMD jest: dana operacja jest wykonywana dokładnie tak samo.

EGZ:

zaliczenie pisemnego daje minimalnie dst.

pisemna:

Wyniki dzień po egzaminie (zal / niezal)

Wykład 12, 12.01.2009

„Poróbmy zadania z egzaminu”

1 ¾ + 2.125 =

1,11 + 10,001 = 11,111 = 3 7/8

2,125 * 1,75;

000010,001

000001,110

bla bla

00011,101110 (poz. przecinka to suma pozycji w mnożnikach)

dzielenie to mnożenie przez ułamek.

U2 - za proste :)

Superkomputer to złożenie procesorów, nie opłaca się robić III generacji procesorów (drogie).

Czym się różni NUMA od SMP?

SMP - czas dostępu do pamięci taki sam dla każdego procesora.

NUMA - każdy procesor może mieć własną pamięć lokalną, może odwołać się do pamięci kolegi, oraz do pamięci zewnętrznej (najdłużej).

Systemy operacyjne

Tryb chroniony - by się aplikacja nie rozswawoliła (odcinamy ją od informacji/zasobów)

systemy czasu rzeczywistego to takie które gwarantują że skończą wykonywać operację w skończonym czasie. PC nie wspomagają takich systemów, bo nigdy nie wiadomo: znajdziemy równoległość lub nie, dane będą w cache lub nie etc.

Monolityczny - aplikacje są niepewne (tryb chroniony), ale sterowniki - wchodzą w skład jądra. (większość systemów operacyjnych jest monolityczna).

Microkernel - nie ufamy niczemu. Każdy dostaje tylko takie zasoby o jakie prosi. Kosztowna wymiana komunikatów, kernel jest minimalnej wielkości, nawet planista jest osobnym procesem.

Sterownik = aplikacja. Zbiór funkcji, do których wskaźniki zapewniamy systemowi operacyjnemu.

4 typy sterowników w ramach WDM: class, mini, monolithic-function, filter.

Class driver - sterowniki do klasy urządzeń (np. do pendrive'ów)

Filter driver - ograniczenie funkcjonalności sterownika klasowego, jeśli chcemy żeby nasz sprzęt nie był traktowany jak „zwykły” pendrive.

Mini driver - modyfikujemy klasowy sterownik używany dla naszego sprzętu.

Monolityczny -

Wielowątkowość. Superskalarny nie zapewnia wielowątkowości, on zapewniał równoległość tylko w obrębie jednego wątku.

Sprzętowe wspieranie wielowątkowości - powielanie architektury dla każdego wątku.

Wykład 13, 19.01.2009

egz

W jaki sposób odbędzie się przerwanie w architekturze PIC?

Mechanizm przerwań - polling, wektor przerwań (wykład 6?)

architektury: x86 pic lub arm

równoległości

różnice: klaster & numa

zadanka jak wcześniej.

Układy rekonfigurowalne (reprogramowalne):

fpga, cpld, spld (odpowiednio complex i simple programmable logic device)

„a dlaczego nie architektura Kapruziaka?”

pamięć może być reprezentowana jako dowolna funkcja o zmiennych wejściowych wchodzących na linii adresowej.

(przykład programu na spld - slajd 11/27)

PAL - matryca orów jest już twardo zdefiniowana, można programować tylko matrycę andów. Bardziej skomplikowane programowanie. Potem MegaPAL - jeszcze większe. Są bardzo wolne.

Układ RC - filtr dolnoprzepustowy

im większa matryca - tym wolniej chodzi układ

cpld- Połączone spld. do wyjść i wejść podłączamy matryce które mogą przełączać wyjścia i wejścia. Jest mniejsza konfigurowalność, ale fizycznie matryce nie są olbrzymie. Logicznie - tak, bo są ze sobą połączone. Działanie jest szybsze (cena: zużywamy więcej zasobów)

FPGA:

clb - konfigurowalny blok logiczny. Lut - look-up table. Mux - jak my nie korzystamy, to udostępniamy rejestr innym. (clb to białe bloki na slajdzie 16/27).

od 18 nieważne.

Różnica mięðzy fpga i cpld:

fpga tworząc skomplikowaną strukturę połączeń między blokami clb staje się dużo trudniej przewidywalny jeśli chodzi o czas propagacji.

(cpld wykorzysytwany przy Glue logic - logika spajająca, interfejsowa.)

FPGA często wykorzystyywana jako alternatywa dla procesora. Trudno napisać tam algorytmy syntezy (model behawioralny [kod] na strukturalny)

wady układów reprogamowalnych w stosunku do procesorów von Neumanowskich: wolno działają.

Zalety - duży poziom równoległości, nieosiągalny przez procesor.



Wyszukiwarka

Podobne podstrony:
Szm-ASK, Studia PŚK informatyka, semestr 2, archtektura
sc, Studia PŚK informatyka, semestr 2, archtektura
sciaga ASK2, Studia PŚK informatyka, semestr 2, archtektura
Arch-ściągi, Studia PŚK informatyka, semestr 2, archtektura
sc, Studia PŚK informatyka, semestr 2, archtektura
ssciaga, Studia PŚK informatyka, Semestr 4, Bazy Danych 2, Bazy Danych Zaliczenie Wykladu, Bazy Dany
Si lab1, Studia PŚK informatyka, Semestr 5, semestr 5, SI 2, Sprawozdanie lab1
sieci ściąga, Studia PŚK informatyka, Semestr 4, sieci, kolos sieci, SK, sieci komputerowe
G312A-K04-P5, Studia PŚK informatyka, Semestr 5, semestr 5, SI 2, Sprawozdanie lab5
Pytania-sieci, Studia PŚK informatyka, Semestr 4, sieci, kolos sieci, SK, sieci komputerowe, gawlik,
02.Protokoły, Studia PŚK informatyka, Semestr 5, semestr 5, moje, Pai, Projektowanie aplikacji inter
Sieci komputerowe, Studia PŚK informatyka, Semestr 4, sieci, kolos sieci, SK, sieci komputerowe, gaw
Netbios, Studia PŚK informatyka, Semestr 4, SK kolos
pai 03 313B 03, Studia PŚK informatyka, Semestr 5, programowanie współiberze
Sprawozdanie06 elektronika, Studia PŚK informatyka, semestr 2, Semestr 2, miernictwo, Podstawy elekt
pai5, Studia PŚK informatyka, Semestr 5, Projektowanie aplikacji internetowych 1, laborki
dhcp, Studia PŚK informatyka, Semestr 4, SK kolos

więcej podobnych podstron