Rozdział 2.
Procesor z rozszerzeniem MMX
MMX (MultiMedia eXtention) jest największą ze zmian w architekturze procesorów Intela od czasu wprowadzenia na rynek przed ośmiu laty układów serii 386.
Przedsięwzięcie ma na celu umocnienie pozycji firmy Intel na polu błyskawicznie rozwijających się zastosowań multimedialnych. Obszary te zdominowane są dotychczas przez szereg mniejszych firm wytwarzających różnego rodzaju kontrolery wyspecjalizowane w szybkim przetwarzaniu grafiki i dźwięku. Jak na razie nowa technologia nie zabiera chleba akceleratorom graficznym lecz skupia się na lepszym podziale mocy obliczeniowej i wykorzystaniu zasobów.
Kluczową rolę w tak postawionym zagadnieniu odgrywa na pewno zapewnienie możliwości szybkiej wymiana danych pomiędzy elementami komputera. Kolejny krok przyprawiający skrzydeł architekturze Intela stanowić ma upowszechnienie nowej wewnętrznej magistrali o nazwie AGP (Accelerated Graphics Port).
Zmiany w architekturze
Idea leżąca u podstaw MMX nie jest nowa i stanowi krok w kierunku przetwarzania równoległego. W tym wypadku nie chodzi jednak o równoległe wykonywanie dowolnych rozkazów ale o grupowanie danych w większe grupy. Zamiast kolejnego przetwarzania pojedynczych jednostek informacji (bajtów, słów itd) szybciej jest brać po kilka porcji na raz i załatwiać sprawę jednym rozkazem maszynowym takim jak add, sub, or, anci itd. Technika taka nosi miano SIMD (Single Instruction Multiple Data).
Intel jako pierwszy upowszechnia SIMD dla potrzeb zwykłego użytkownika. Inne firmy też stosują ten sposób przetwarzania danych ale w dużych komputerach. W oparciu o instrukcje tego typu pracują procesory RISC używane w systemie PA-8000 firmy HP a specjalnie dobrany do potrzeb grafiki wektorowej zestaw instrukcji VIS (Yisual Instruction Set) przetwarzaj ą procesory firmy Sun.
Wspomaganie multimediów stanowi jedno z najwdzięczniejszych pól do zastosowania takiej techniki. Dane reprezentowane są tutaj jako długie ciągi słów 8- lub 16-bitowych. Operacje na takich danych, to często powtórka tych samych kroków w odniesieniu do, jeśli nie wszystkich słów na raz (filtr audio), to co najmniej kolejnych kilkunastu z nich (filtracja bilinearna tekstur).
Warto wspomnieć, iż rozkazy tego typu można zrealizować również bez gruntownych zmian w architekturze CPU. Nic nie stoi na przeszkodzie by jeden z 32-bitowych rejestrów potraktować jako złożenie czterech bajtów i wykonać operację jednoczesnej inkrementacji:
ADD OlOlOlOlh
Problem pojawi się w momencie gdy jeden z bajtów miał przed operacją wartość OxFFh, bowiem bit przepełnienia przeleje się na sąsiadujący wyższy bajt. Najistotniejszą modyfikacją architektury nowych procesorów stanowi właśnie odmienne niż dotychczas traktowanie stanu przepełnienia podczas operacji SIMD.
Przy okazji kuracji odmładzającej nowy procesor (oficjalna nazwa P55C w odróżnieniu do klasycznego Pentium P54C) wyposażony został w dodatkowe układy sprzętowe nie mające bezpośredniego związku z technologią MMX:
Pamięć podręczną (first level cache). W procesorach MMX pamięć podręczna zarówno dla danych jak i rozkazów została zwiększona do 16 kB i pracuje z poczwórną asocjacją (P54C 8/8 kB i podwójna asocjacja). Każdy z dwóch potoków przetwarzających rozkazy może więc wystąpić jednocześnie z dwoma żądaniami dostępu do pamięci i obydwa będą buforowane.
Bufor zapisu. P55C wyposażony zostaje w dwukrotnie większy w porównaniu z P54C bufor zapisu: 4 zamiast 2 słów.
Nową jednostkę BPU (Branche Prediction Unii). Nowy układ przewidywania dla instrukcji rozgałęzień zapożyczony został w dużej części od starszego brata, Pentium Pro. Jego zastosowanie zwiększa prawdopodobieństwo zapełniania potoków tymi instrukcjami, które będą faktycznie wykonywane. Błędne przewidywanie skutków rozgałęzienia powoduje, że jeden z potoków musi (po dojściu do newralgicznego punktu) wstrzymać przetwarzanie. W okresie niezbędnym do ponownego załadowania, drugi z potoków znajduje się w stanie oczekiwania i traci czas.
Dłuższe potoki przetwarzania instrukcji (Pipę Lines). Długość rozkazów maszynowych jest zmienna i waha się w przedziale od l do 15 bajtów. Fakt ten stanowi jedną z bolączek procesorów P54C, bowiem żmudne określanie adresu następnego rozkazu (w celu przekazania go dekoderowi instrukcji) zajmuje stosunkowo dużo czasu. Sam dekoder byłby w stanie przyjmować do dwóch instrukcji w jednym cyklu zegarowym. Dla pokonania tego wąskiego gardła obie linie przetwarzania zostały wydłużone o brakujący stopień zlokalizowany pomiędzy punktem pobierania (Prefetch) a dekoderem.
Trzeba dodać, że obydwa potoki pracują nadal synchronicznie. Wypełnione rozkazami o różnym czasie trwania blokują się wzajemnie. Odnoga, która szybciej zostanie opróżniona musi czekać na zakończenie przetwarzania w drugiej.
Możliwość równoległego wykonywania rozkazów. Pentium MMX może w sprzyjających warunkach wykonywać równolegle 2 polecenia. W szczególności parowane mogą być nowe rozkazy z grupy MMX, jeżeli odnoszą się do różnych rejestrów MM.
Stos powrotu (Return Stack). Dla procesorów Cyrix nic nowego, dla Intela istotna zmiana. Procesory MMX wyposażone zostały w wewnętrzny stos powrotów. Przy przejściu do wykonywania podprogramu zapamiętywany jest adres powrotu - adres rozkazu następnego po CALL. Przyspieszane jest wykonywanie kodu bogatego w krótkie procedury, dla których odległość między instrukcjami call i ret jest stosunkowo niewielka. Cały mechanizm działa do czterech poziomów w głąb (procedura może bowiem wywoływać procedurę a ta następną itd...). Zysk czasu szacowany jest na 20%.
Zasilanie. Procesory MMX wykonywane są wprawdzie w nowoczesnej technologii 0,28 um (dla porównania 0,35 um dla P54C) zawierają jednak blisko 40% więcej tranzystorów (P54C: 3.3 miliona, P55C: 4,5 miliona). Dla ograniczenia wydzielania ciepła obniżono napięcie zasilające samą jednostkę centralną (Corę) do 2,8 V. Układy wejścia/wyjścia zasilane są nadal standardowym napięciem; w zależności od grupy selekcyjnej 3.3 V - 3,5 V. Nie obeszło się więc bez zmiany kolejnego numeru wersji u producentów płyt głównych. Dla tych, którzy ze swoją płytą rozstać się nie chcą przewidziano moduł typu overdrive z procesorem MMX i regulatorem napięcia zadowalający się standardową podstawką typu 5 lub 7.
Te energooszczędne zabiegi prowadzą do pozytywnego bilansu: model MMX 200 MHz rozprasza na ciepło jedynie 0,2 W więcej od taktowanego takim samym zegarem normalnego P54C.
Wszystkie te unowocześnienia razem wzięte gwarantują (bez dotykania samego tematu MMX) przyrost mocy obliczeniowej o 15 - 20%. Tyle tylko korzystają więc z P55C aplikacje nie wywołujące rozkazów MMX.
Eozpoznanie procesora P55C
Typ procesora Pentium można rozpoznać badając stan rejestru EDX po wywołaniu instrukcji cpuicd (Nie każdy procesor zna rozkaz cpuid (386, wczesne 486), trzeba najpierw sprawdzić, czy należy on do zestawu instrukcji).
Potrzebna informacja zawarta jest w bicie 23. Jeżeli jest on ustawiony, w systemie mamy procesor P55C:
mov EAX, l
CPUID
test EDX,OO8OOOOOh ; gdy (bit 23=1) jest MMX
jnz Kod_MMX
Kod Standard:
Przy okazji, nieco na uboczu, pojawia się problem zgodności z nowym kodem. W użyciu są bowiem jednocześnie dwa rodzaje programów i dwa rodzaje procesorów. Stare programy szyte na miarę P54C nic nie wiedzą o MMX i nie są w stanie wykorzystać jego zalet. Problem załatwia wypuszczenie nowej wersji aplikacji. Z drugiej jednak strony, aplikacje pod P55C mogą napotkać na swej drodze procesory bez rozszerzenia. O ile zagadnienie poprawnej identyfikacji Intela MMX jest jednoznacznie zdefiniowane, to sedno sprawy stanowi konieczność dublowania procedur wywołujących rozkazy MMX. Każda z nich musi mieć w rezerwie swój odpowiednik dostosowany do klasycznego procesora bez rozszerzeń. Zależnie od wyników testu typu zainstalowanego w systemie CPU, sterowanie przekazywane jest do właściwej gałęzi. Programowanie ułatwia posługiwanie się jedną z gotowych bibliotek dostarczanych przez Intel. Newralgiczne partie kodu są tu automatycznie dublowane przez emulator MMX.
Nowe rejestry
Wydajne przetwarzanie danych w myśl założeń SIMD wymaga pogrupowania ich w porcje o możliwie dużej długości. Procesory Intel-MMX mogą pracować na blokach 64-bitowych. Do dyspozycji nowych rozkazów stoi osiem nowych rejestrów wewnętrznych oznaczanych symbolami MMO - MM7, każdy o szerokości 64 bitów.
Istotną barierą stojącą przed twórcami nowego procesora było pokonanie nieśmiertelnego problemu "kompatybilności w dół" - zgodności z poprzednimi wersjami. Samo wprowadzenie nowych rozkazów i rejestrów nie stanowi żadnego zagrożenia: stare programy i systemy nic nie wiedzą o ich obecności, żaden kompilator nie generuje kodu z ich udziałem. W spisie symboli operacji (Opcodes) wywodzącym się jeszcze z czasów procesorów bazowych x86 jest dużo wolnego miejsca dla nowych rozkazów bez obawy pomieszania ich z dotychczas znanymi.
Dla procesora MMX pisze się nowe programy posługujące się nowymi instrukcjami, na nowych typach danych i nowych rejestrach. Jak długo nasz nowy P55C przetwarza wyłącznie taki program wszystko jest w porządku. Katastrofa nastąpi gdy do akcji
wkroczy jeden z nowoczesnych systemów operacyjnych, który przydziela czas procesora różnym zadaniom (systemy wielozadaniowe). Każde takie przełączenie wymaga zapamiętania aktualnego stanu CPU, tak by później móc podjąć przerwany wątek w tym samym miejscu. Zapamiętać trzeba wiele rzeczy, a w szczególności rejestry wewnętrzne. Dla procesorów rodziny x86 są to między innymi rejestry AX, BX itd. Żaden ze współczesnych systemów operacyjnych nie ma pojęcia, że trzeba też zapamiętać i odtworzyć rejestry MMX, bo nic nie wie o ich istnieniu.
Na szczęście występuje dodatkowa grupa rejestrów, o które troszczą się systemy operacyjne. Mowa tu o ośmiu 80-bitowych rejestrach koprocesora arytmetycznego (FPU). Na reprezentację liczb zmiennoprzecinkowych w pamięci komputera składa się jeden bit znaku, 15-bitowa eksponenta i 64-bitowa mantysa. Każdorazowe przejście CPU do nowego kontekstu poprzedzane jest między innymi instrukcją FSAVE, która odkłada rejestry FPU w specjalnie do tego celu zarezerwowanym bloku. Wywołanie instrukcji FRSTOR po powrocie gwarantuje przywrócenie stanu FPU.(W segmentach 16-bitowych rezerwuje
się 94 bajty a w 32 bitowych 108 bajtów.).
Rejestry MMX podszywają się pod fragmenty rejestrów FPU (część przeznaczona na mantysę) i w ten sposób gwarantują sobie obsługę ze strony systemów operacyjnych (rysunek 2.2).
Jak powszechnie wiadomo, nie ma nic za darmo i to genialnie proste rozwiązanie pociąga za sobą pewne konsekwencje. Instrukcjom FSAVE/FRSTOR jest z pewnością obojętne jak należy interpretować przesyłane dane. Jakkolwiek rejestry MM i ST stanowią fizycznie odrębne jednostki, każdy dostęp do FPU ma swoje odbicie w MMX i odwrotnie. W obrębie danego zadania (Task), od przełączenia do przełączenia, procesor pracuje albo w trybie MMX albo w trybie zmiennoprzecinkowym - nigdy w obydwu na raz. Każda zmiana stanu musi być przeprowadzona z udziałem pary rozkazów FSAVE/ FRSTOR.
Programy wykorzystujące specyfikę rozszerzeń MMX muszą być pisane w przebiegły sposób. Z jednej strony nie można sobie wyobrazić nowoczesnego algorytmu 3D bez intensywnej operacji na danych zmiennoprzecinkowych; bazuje na nich cały rachunek współrzędnych w przestrzeni. Drugą stronę medalu stanowi astronomicznie długi czas przełączania: fsave zajmuje 124 takty zegarowe a frstor trwa 70 taktów (W przypadku szczególnie
korzystnym, gdy dane znajdują się w pamięci podręcznej (cache hit). W praktyce stan taki ma rzadko miejsce co prowadzi do zwielokrotnienia podanych czasów.).
Częstestosowanie tych instrukcji obraca w niwecz ideę przyspieszania czegokolwiek.
Jeżeli pominąć momenty przełączania wątków skupić się można na wykonywaniu programu zawierającego zarówno instrukcje MMX jak i te odwołujące się do jednostki zmiennoprzecinkowej. Idealnym rozwiązaniem jest grupowanie partii kodu jednego rodzaju w możliwie duże bloki. Jeżeli każdy z bloków wie, że w newralgicznych rejestrach zastaje "śmieci" pozostawione tam przez poprzednika operacja przełączania nie musi być tak czasochłonna.
Rejestry MMX można przecież jeśli to konieczne czyścić przed użyciem szybkimi instrukcjami typu:
PXOR mmx, mmx ; jeden cykl zegarowy
Każdy blok MMX zakończany jest specjalną instrukcją emms (Empty Multimedia State). Jej działanie sprowadza się do ustawienia flag informujących jednostkę FPU, że przejmowane przez rejestry ST dane są nieważne ( Zastanie w rejestrze eksponenty wartości
0xFFFFh zostanie zinterpretowane jako nieskończoność i koprocesor generuje przerwanie.).
i nie podlegają interpretacji. Czas wykonywania EMMS wynosi jak na razie nie mało bo aż 57 taktów zegarowych. Intel planuje usunięcie tego mankamentu w kolejnych wersjach procesora i zredukowanie czasu przełączenia do trzech taktów.
Fragmenty kodu operujące na liczbach zmiennoprzecinkowych powinny pozostawiać czysty stos.
kod__FP_blok_:
...
...
... /* zwolniony stos FP*/
kod MMX
...
...
...
EMMS
kod FP blok 2:
...
...
... /* zwolniony stos FP */
Jednostkę FPU można zainicjować stosunkowo szybkimi rozkazami fninit i fIdcw, które pochłaniają (w korzystnych warunkach, cache hit) 19 taktów zegara.
Nowe typy danych
Rejestry MMX są 64-bitowe, mogą więc przyjąć 8 bajtów danych. Bajty te można grupować w słowa 16 i 32 bitowe. Prowadzi to do wyodrębnienie nowych typów danych, na których operuj ą rozkazy MMX (rysunek 2.3).
Nowe rozkazy
Intel reklamuje nowy procesor w towarzystwie 57 nowych rozkazów. Przybyło ich w istocie, ale nie aż tyle. Rozkazy MMX operują generalnie na trzech typach danych, niektóre na dwóch a niektóre tylko na jednym. Jeżeli uwzględnić dodatkowo odmienne traktowanie przeniesienia i znaku można uzyskać wspomnianą liczbę mutacji równą 57. Sam rozkaz add może się poszczycić siedmioma różnymi odmianami.
Kod mnemoniczny budowany jest według następującego schematu:
- Przedrostek (Prefix). Litera p, jeżeli poprzedza kod operacji oznacza Packed
- Kod operacji. Określa działanie, np. add, sub, cmp.
- Przyrostek (Suffix). Możliwe oznaczenia to:
- us Unsigned Saturation (nasycenie bez znaku),
- s Signed Saturation (nasycenie z uwzględnieniem znaku),
- b Typ danych: Packed Byte,
w Typ danych: Packed Word,
d Typ danych: Packed Doubleword,
q Typ danych: Quadword.
Tabela 2.1.
Rozkazy MMX
Rozkaz; Uwagi;
emms;
movd; rej.->pam./rej.
movd; pam./rej./->pam.
movq; rej.->pam./rej.
movq; pam./rej./->pam.
packssdw;
packsswb;
packuswb;
paddb;
paddd;
paddsb;
paddsw;
paddusb;
paddusw;
paddw;
pand;
pandn;
pcmpeąb;
pcmpeqd;
pcmpeqw;
pcmpgtb;
pcmpgtd;
pcmpgtw;
pmaddwą;
pmulhw;
pmullw;
por;
pshimd; jako PSLLD ze stałą
pshimd; jako psrad ze stałą
pshimd; jako psrld ze stałą
pshimq; jako psllą ze stałą
pshimq; jako psrlą ze stałą
pshimw; jako psllw ze stałą
pshimw; jako psraw ze stałą
pshimw; jako psrlw ze stałą
pslld;
psllą;
psrad;
psraw;
psrld;
psrlq;
psrlw;
psubb;
psubd;
psubsb;
psubsw;
psubusb;
psubusw;
psubw;
punpckhbw;
punpckhdq;
punpchwd;
punpcklbw;
punpckldq;
punpcklwd;
pxor;
Połączenie rozkazów MMX w klasy z uwzględnieniem wykonywanych funkcji prowadzi do wyodrębnienia grup przedstawionych w tabeli 2.2.
Tabela 2.2.
Podział rozkazów MMX na klasy
Klasa; Dlugość opcode; Mnemonik rozkazu; Typ argumentów;Komentarz;
Przesyłanie danych; 4; mov; D, Q; Ładowanie lub zapamiętywanie rejestrów MMX
Pakowanie; 1; packus; WB; Słowa na bajty, z nasyceniem, bez znaku;
;2; packss; WB, DW; Słowa na bajty, podwójne słowa na słowa, z nasyceniem, ze znakiem;
Rozpakowywanie; 3; punpcks; BW, WD, DQ; Bajty na słowa, słowa na podwójne słowa, podwójne słowa; na poczwórne słowa, HO*
3; punpckl; BW, WD, DQ; Bajty na słowa, słowa na podwójne słowa, podwójne słowa na poczwórne słowa, LO**;
Arytmetyczne; 3; padd; B, W, D; Dodawanie, bez nasycenia;
;2; padds; B, W; Dodawanie z nasyceniem, ze znakiem;
;2; paddus; B, W; Dodawanie z nasyceniem, bez znaku;
;3; psub; B, W, D; Odejmowanie, bez nasycenia;
;2; psubs; B, W Odejmowanie z nasyceniem, ze znakiem;
;2; psubus; B, W; Odejmowanie z nasyceniem, bez znaku;
;1; pmulh; W; Mnożenie, wynik = High word;
;1; pmull; W; Mnożenie, wynik = Low word;
;1; pmadd; WD; Mnożenie i dodawanie, wynik = podwójne słowo;
Przesunięcia;; 6; psll; W. D. Q; Przesunięcie logiczne w lewo;
;6; psrl; W, D, Q; Przesunięcie logiczne w prawo;
;4; psra; W, D; Przesunięcie arytmetyczne w prawo;
Porównania; 3; pcmpeą B, W, D; Jeżeli równe wynik = OxFFh, jeżeli nie: wynik = 0;
;3; pcmpgt; B, W, D; Jeżeli większe wynik = OxFFh, jeżeli nie: wynik = 0;
Logiczne; 1; pand; -; Bitowe logiczne AND;
;1; pandn; -; Bitowe logiczne NAND;
;1; por; -; Bitowe logiczne OR;
;1; pxor; -; Bitowe logiczne XOR;
Różne; 1; ernms; Opuszczenie stanu MMX;
* HO: High Order.
** LO: Low Order.
Mechanizm nasycenia (saturatiori) oznacza zlekceważenie przepełnienia i ogranicza wynik operacji do wartości wynikającej z zakresu przejętego dla zmiennej (tabela 2.3).
Tabela 2.3.
Zakresy typów danych z uwzględnieniem mechanizmu nasycenia
Typ; Zakres;
Signed Byte; 0x80h - 0x7Fh (-128- +127);
Signed Word; 0x8000h - 0x7FFFh (-32 768 - +32 767);
Unsigned Byte; 0x00h - 0xFFh (0-255);
Unsigned Word; 0x0000h - 0xFFFFh (0-65535);
Występowanie nasycenia wielkości fizycznej takiej jak jaskrawość, kontrast, siła i barwa dźwięku jest z pewnością bliższe naturalnemu podejściu do zjawisk fizycznych ze świata multimediów. Analogowy regulator siły głosu nie kręci się przecież w kółko ale ma swoje położenia graniczne.
W realizacji klasycznej (wrap-around), dalsza inkrementacja zmiennej, która już osiągnęła wartość OxFFh, prowadzi do wyniku OxOOh. Zwykłe rozkazy x86 ustawiają w tym przypadku dodatkowo flagę (carry) informującą o "przekręceniu się licznika". Bogaty asortyment instrukcji arytmetycznych MMX daje możliwość wyboru punktu podejścia: z nasyceniem lub bez.
Większość rozkazów MMX jest dwuargumentowa - przetwarzane są dwa operandy. Operacja zapisywana jest według klasycznej konwencji:
kod_instrukcji operand_2, operand_l
Wynik operacji na operandach określanej przez kod_instrukcji umieszczany jest w miejscu wyznaczonym przez operand_2.
Przykład działania: rozkaz PACKUSWB
PACK rozkaz pakowania
US z nasyceniem bez uwzględnienia znaku
WB słowa na bajty
PACKUSWB operand_2 , operand_l
operand_2 jest jednym z rejestrów MMX (MM0 - MM7)
operand_l jest adresem 64 bitowego obszaru w pamięci lub rejestrem MMX
Dla lokalizacja 64-bitowego obszaru w pamięci przyjęta została następująca umowa (na przykładzie adresu początkowego 0xl500h):
Wynik operacji umieszczany jest w rejestrze MMX określonym przez operand_2. Instrukcja traktuje lokalizację podaną przez operand_1 jako zestaw czterech 16-bitowych słów ze znakiem. Tak samo interpretowany jest drugi z argumentów.
Dla każdego ze stojących w ten sposób do dyspozycji ośmiu 16-bitowych słów wykonywana jest następująca operacja:
Jeżeli wartość słowa (z uwzględnieniem znaku) wypada poza zakres 0 - 255 (przyjęty dla typu signed byte) uznaje się wartość graniczną zakresu. Tak więc wynikiem jest 0x00h jeśli poniżej a 0xFFh jeśli powyżej zakresu.
Dla słów, których wartości mieszczą się w zakresie O - 255 przepisuje się po prostu młodszy bajt
Powyższy rozkaz dokonuje więc istotnie spakowania danych zawartych w ośmiu słowach 16-bitowych (razem 128 bitów) do kontenera o rozmiarze 64 bity.
[Przykład działania: rozkaz PADDSW
p rozkaz dotyczy danych spakowanych
ADD instrukcja dodawania
SW operuje na słowach z uwzględnieniem znaku
PADDSW operand_2 , operand_1
operand_2 jest jednym z rejestrów MMX (MMO - MM7)
operand_1 jest adresem 64 bitowego obszaru w pamięci lub rejestrem MMX
Instrukcja PADDSW dodaje 16-bitowe słowa (traktując je jako liczby ze znakiem) wskazane przez operand_1 i operand_2. Jeżeli wynik jest mniejszy od najmniejszej liczby z zakresu przewidzianego dla typu Signed Word, następuje ograniczenie do wartości Ox8000h. W przypadku wyjścia poza zakres od drugiej strony wartość nasycenia wynosi Ox7FFFh.
Rozkaz przesyłania mov w zależności od przyrostka (d lub q) operuje na danych 32 lub 64-bitowych. Jest jedynym środkiem komunikacji pomiędzy klasycznymi rejestrami (EAX, ERX, ...) a rejestrami MMX. Jednorazowa porcja przesłanej informacji nie może jednak w takim przypadku przekraczać 32 bitów. Dla załadowania 64-bitowego rejestru MMX parą rejestrów 32-bitowych trzeba uciekać się do następującej sekwencji:
MOVD MMO, edx ;EDX -> MMO MOVD MM1, eax ;EAX -> MM1 PSLLQ MMO, 32 ;shift MMO o 32 POR MMO, MM1 ;MM1 or MM0
Pomiary wykazują, że P55C potrzebuje na wykonanie powyższej partii kodu trzech cykli zegarowych. Procesor MMX może istotnie grupować rozkazy, ale nie każdy z każdym. W tym wypadku połączeniu ulega drugi i trzeci z nich (dotyczą różnych rejestrów MMX).
Przykłady zastosowań
Rozszerzenia MMX dobrane zostały pod kątem aplikacji multimedialnych. Główny zakres zastosowań to filtry cyfrowe przetwarzające dane audio i video oraz dekodery MPEG, dotychczas domena specjalnie projektowanych do tego celu układów DSP. Optymalizacji MMX poddają się najchętniej algorytmy mające następujące wspólne cechy:
dane w formacie Integer, maksymalnie jedno lub dwubajtowe,
krótkie i często wywoływane pętle programowe,
częste operacje dodawania i mnożenia,
algorytmy bardzo czasochłonne,
możliwość realizacji równoległej.
Tajemnica sukcesu (kilkunastokrotne skrócenie czasu pracy) nie leży zwykle w nowym, rewolucyjnym podejściu do tematu. O wiele istotniejsze jest sprytne rozdzielenie zmiennych, tak by wykorzystać możliwości wspomnianego przetwarzania równoległego.
Blue-Box
Skuteczność działania rozkazów MMX na danych typu video można najłatwiej zademonstrować na przykładzie tzw. Chroma Keying. W telewizji stosowany jest często mikser trickowy zwany Blue-Box, dzięki któremu prezenter przedstawiany jest na tle mapy pogody. W rzeczywistości postać prezentera występuje na tle jednorodnej planszy (najczęściej w kolorze niebieskim, stąd nazwa miksera).
Pierwszym zadaniem komputera jest wytworzenie maski stanowiącej obrys postaci pierwszoplanowej. Przy pomocy maski wycina się we właściwym tle pustą przestrzeń, w którą wklejany jest obraz prezentera (rysunek 2.4).
Algorytm przetwarza po cztery piksle jednocześnie (przy kolorach 16-bitowych). Dla wymodelowania maski wystarczy pojedynczy rozkaz PCMPEQW, który porównuje kolejne punkty obrazu (postać na niebieskim tle) z wzorcem koloru niebieskiego. Produktem wyjściowym jest dwuwartościowa mapa bitowa: w punktach tła instrukcja porównania zwraca 0xFFFFh a w pozostałych (postać) 0x0000h.
Tak uzyskana maska jest produktem pośrednim, i służy do dwóch kolejnych operacji: instrukcją pand wycina się otwór w obrazie drugoplanowym (w naszym przykładzie mapa pogody) a rozkaz pandn izoluje samą postać prezentera. Te dwie części składowe montowane są w jedną całość przy pomocy instrukcji por.
Przetwarzanie pliku WAV
Innym klasycznym przykładem zastosowania techniki MMX jest przetwarzanie pliku w formacie WAV. Plik taki stanowi jednorodny ciąg słów 16 bitowych. Zakodowana informacja jest dźwiękiem stereofonicznym o jakości zbliżonej od płyty kompaktowej. Zadaniem programu jest przepuszczenie całej sekwencji przez filtr cyfrowy na przykład dla uwypuklenia wysokich tonów. Przetwarzanie polega na modyfikacji kolejnych elementów składowych ciągu.
Filtr nie może działać ślepo i bez ograniczenia. Oddziaływanie na określone partie sekwencji wejściowej doprowadzi z pewnością do przekroczenia analogowych wartości granicznych co objawi się odczuwalnymi zniekształceniami. Poprzez wbudowany w instrukcje MMX mechanizm nasycenia algorytm może czuć się zwolniony z konieczności stałej kontroli. Przekroczenie limitu kosztuje dla każdego słowa co najmniej 3 operacje (porównanie, skok, ładowanie). Dodatkowy zysk na czasie wynika z faktu, iż przetwarzane jest 8 bajtów jednocześnie.( Rzeczywisty zysk na czasie można osiągnąć jeśli rozkazy MMX wykonywane są możliwie szybko, najlepiej w jednam cyklu zegarowym CPU. Warunek ten spełniony jest dla wszystkich instrukcji za wyjątkiem pmaddwd (dodawanie z mnożeniem), która potrzebuje 3 taktów.).
Wyszukiwarka
Podobne podstrony:
02 rozdział 02Rozdzial 0202 Proces badawczykopczewska (pliki z kodami) Rozdział 02 Podstawowe operacjeNauka swiatowa i polska[1] Rozdzial 02MLP FIM Fanfic Wojna o Equestrię Rozdział 02MLP FIM Fanfic Wojna o Equestrię Rozdział 02Pan Wolodyjowski Rozdzial 02ROZDZIAŁ 02 Analizy molekularne DNA i RNA w wykrywaniu dziedzicznych predyspozycji do nowotworów04 Rozdział 02 Różniczkowanie funkcji wielu zmiennychWampiry Argeneau 02 Miłość gryzie rozdział 02Wampiry Argeneau 02 Miłość gryzie rozdział 0202 ROZDZIA 2 Krtka historia zegarmistrzostwa, czyli minimum jakie wiedzie naley02 Rozdział 02amatematyka 2 podrecznik dla liceum i technikum zakres rozszerzony rozdzial 7 statystyka pdfCrissy Smith [Were Chronicles 02] Pack Enforcer Rozdział od 1 do 3więcej podobnych podstron