Programowanie w asemblerze Obliczenia zmiennopozycyjne

Transkrypt

Programowanie w asemblerze Obliczenia zmiennopozycyjne
Programowanie w asemblerze
Obliczenia zmiennopozycyjne
Zbigniew Jurkiewicz, Instytut Informatyki UW
17 stycznia 2017
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Reprezentacja w Standardzie 754 IEEE
Mantysa i wykładnik (cecha)
m × 2w
W znormalizowanej liczbie mantysa jest liczba˛
„stałopozycyjna”
˛ postaci 1.bbbbbbbbbb..., np.
1.0110001110111 × 27
Dwa standardowe formaty IEEE: single precision (32 bity) i
double precision (64 bity)
W FPU Intela dodatkowo extended precision (80 bitów).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Klasy liczb:
zera ze znakiem
znormalizowane
nieznormalizowane liczby skończone
nieskończoności ze znakiem
NaNs (Not a Number : nie liczby)
liczby nieokreślone (indefinite)
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Zera
Znak zera
pozwala stwierdzić kierunek powstania underflow
pozwala stwierdzić znak nieskończoności, z której wzieto
˛
odwrotność
przydaje sie˛ przy arytmetyce przedziałowej
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Normalizacja
Brak normalizacji oznacza zmniejszenie dokładności
(liczby binarnych cyfr znaczacych).
˛
Otrzymanie wyniku nieznormalizowanego oznacza
underflow condition (#U).
W FPU Intela:
floating-point underflow exception = powstanie wyniku
nieznormalizowanego
floating-point denormal-operand exception = wykrycie, że
nieznormalizowana liczba jest argumentem operacji.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Nieskończoności
Nieskończoności można porównywać i używać ich w
operacjach arytmetycznych.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
NaN
Rodzaje NaN:
m = 1.0xxxxxxx
m = 1.1xxxxxxx
m = 1.10000000
SNaN (Signaling Nan) jako operand sygnalizuja˛ floating-point invalid-operation exception, trzeba je tworzyć programowo (procesor
ich nie generuje)
QNaN (Quiet NaN) moga˛ być w zasadzie
operandami w operacjach arytmetycznych
floating-point indefinite
Wykorzystanie:
kompilator wypełnia niezainicjowane elementy tablicy
NaNami zawierajacymi
˛
indeks elementu.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
IEEE single precision
górny bit (31) to bit znaku s
8 bitów (23..30) na wykładnik w
23 dolne bity (0..22) na mantyse˛ m
znormalizowana mantysa ma zawsze postać
1.bbbbbbbbbb..., wiec
˛ dla oszcz˛edności górnej jedynki nie
przechowujemy.
cecha przesunieta
˛ o 127.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
IEEE single precision
Przypadki specjalne
w = 0 & m = 0: liczba 0 (zależnie od znaku +0 lub -0)
w = 0 & m 6= 0: liczba nieznormalizowana
w = 255 & m = 0: nieskończoność (∞)
w = 255 & m 6= 0: NaN (Not a Number) — nieokreślony
wynik
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
IEEE double precision
górny bit (63) to bit znaku s
11 bitów (52..62) na wykładnik
52 dolne bity (0..51) na mantyse˛
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Technologie Intela
Poczatkowo
˛
obliczenia zmiennopozycyjne wykonywano na
osobnym koprocesorze zwanym FPU (Floating Point Unit).
W kolejnych modelach został on wbudowany w główny
procesor.
Technologia MMX umożliwia obliczenia równoległe na
spakowanych liczbach całkowitych. Pojawiła sie˛ w Pentium
MMX i Pentium II.
Technologia SSE umożliwia obliczenia na spakowanych
liczbach zmiennopozycyjnych pojedynczej precyzji. Używa
osobnych rejestrów 128-bitowych. Pojawiła sie˛ w Pentium
III.
Technologia SSE2 dodaje spakowane liczby
zmiennopozycyjne podwójnej precyzji i spakowane liczby
całkowite różnych rozmiarów oraz dodatkowe operacje. W
Pentium 4.
Technologia SSE3 to tylko dodatkowe operacje. W
Pentium 4HT i Xeonie.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
FPU Intela
Kiedyś był rzeczywiście odrebnym
˛
układem (tzw.
koprocesor matematyczny), obecnie wbudowany, ale
rozdzielenie architektur zostało w postaci osobnego
środowiska obliczeniowego
Na przykład instrukcje FPU nie moga˛ siegać
˛
do
normalnych rejestrów (EAX itp.), bo to „inny procesor”.
Odrebny
˛
zestaw rejestrów st0, st1, ..., st7, tworzacych
˛
stos
(st0 na wierzchu).
Obliczenia (prawie) zawsze z użyciem wierzchołka stosu.
Osobny rejestr stanu („flagi”), niewidoczny dla normalnego
procesora oraz rejestr sterujacy.
˛
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Flagi stanu
Bity i maski w dwóch miejscach:
dla instrukcji FPU
x87 FPU status word: bity 0..5
x87 FPU control word: maski 0..5
dla obliczeń SIMD w instrukcjach SSE/SSE2/SSE3
rejestr MXCSR: flagi w bitach 0..5, maski w bitach 7..12.
Bity flag (stanu) sa˛ „lepkie”: pozostaja˛ ustawione aż do
recznego
˛
wyzerowania. Można wiec
˛ zamaskować wszystkie
wyjatki
˛ i po wykonaniu całego obliczenia zobaczyć, co sie˛
działo
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Wyjatki
˛
W procesorach Intela jest 6 klas wyjatków
˛
z bitami i maskami
precomputation
Invalid operation (#I), bit IE, maska ME.
przepełnienie stosu lub pusty stos (#IS)
błedna
˛
operacja arytmetyczna (#IA), np. dzielenie ∞ przez
∞ lub zera przez zero
Divide-by-zero (#Z), bit IZ, maska MZ itd.
Denormalized operand (#D), brak w standardzie IEEE
postcomputation
Numeric Overflow (#O)
Numeric underflow (#U)
Inexact result (precision) (#P), bardzo cz˛este, np. 1/3
Gdy maska ustawiona, to domyślna obsługa wyjatku,
˛
wpp.
wyjatek
˛
zgłaszany
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Instrukcje: ładowanie i zapisywanie
FLD miejsce
Przekłada zawartość miejsca na wierzch stosu. Miejsce
może być także rejestrem procesora FPU.
FILD miejsce
Pobiera liczbe˛ całkowita˛ z pamieci,
˛ zamienia na format
zmiennopozycyjny i dokłada na stos
FLD1
Kładzie jedynk˛e na wierzchołku stosu
FLDZ
Kładzie zero na wierzchołku stosu
FXCH stn
Zamienia miejscami podany rejestr i wierzchołek stosu
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Instrukcje: ładowanie i zapisywanie
FST miejsce
Przekłada zawartość wierzchołka stosu w podane miejsce
(może to być także rejestr procesora FPU).
FSTP miejsce
To samo, ale ze zdjeciem
˛
ze stosu.
FIST miejsce
Zamienia liczbe˛ z wierzchołka stosu na całkowita˛ dwu- lub
czterobajtowa˛ i zapisuje w podane miejsce
FISTP miejsce
To samo, ale
ze zdjeciem
˛
ze stosu;
można dostać liczbe˛ 8-bajtowa.
˛
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Instrukcje: arytmetyka
FADD miejsce
Dodaje zawartość miejsca do wierzchołka stosu (st0).
FADD rejestr,st0
Dodaje zawartość wierzchołka stosu (st0) do rejestru.
FADDP rejestr,st0
To samo ze zdjeciem
˛
ze stosu.
FIADD miejsce
Dodaje liczbe˛ całkowita˛ z miejsca do wierzchołka stosu
(st0).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Przykład [Carter]
Przykład sumowania tablicy:
SIZE
equ 10
array
sum
section .bss
resq SIZE
resq 1
section .text
mov ecx, SIZE
mov esi, array
fldz
;inicjujemy st0
lp:
fadd
add
loop
fstp
qword [esi]
esi, 8
lp
qword sum
Zbigniew Jurkiewicz, Instytut Informatyki UW
;kolejny element
;krok
;zapisanie wyniku
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Instrukcje: arytmetyka
Dla odejmowania mamy dwa razy wiecej
˛
instrukcji, bo to
nie jest operacja przemienna, przykłady:
FSUB miejsce
Odejmuje zawartość miejsca od wierzchołka stosu (st0).
FSUBR rejestr,st0
Odejmuje zawartość wierzchołka stosu (st0) od rejestru,
wynik do do st0.
FSUBR rejestr,st0
To samo, ale wynik do rejestru.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Instrukcje: arytmetyka i porównania
Mnożenie i dzielenie analogicznie jak dodawanie i
odejmowanie.
FCOM miejsce
Porównuje miejsce z wierzchołkiem stosu (st0).
FCOMP miejsce
To samo ze zdjeciem
˛
ze stosu.
FCOMPP
Porównuje st0 z st1 i usuwa oba ze stosu.
FTST
Porównuje st0 z zerem.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Instrukcje: porównania
Instrukcje warunkowe procesora nie uwzgledniaj
˛
a˛ rejestru
stanu FPU, dlatego trzeba go najpierw przepisać do
EFLAGS.
FSTSW miejsce Zapisuje rejestr stanu w podane miejsce,
zwykle jest to rejestr AX.
Po przerzuceniu do AX instrukcja˛ SAHF można flagi
przerzucić do EFLAGS.
Jako skoków warunkowych należy używać JA, JB i JZ
(inaczej mówiac,
˛ liczby zmiennopozycyjne traktujemy jak
liczby całkowite bez znaku).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Instrukcje porównania: przykład [Carter]
;;; if (x > y)
fld qword [x]
fcomp qword [y]
fstsw ax
;przeniesienie rejestru stanu
sahf
jna else_part
then_part:
;kod dla then
jmp end_if
else_part:
;kod dla else
end_if:
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Instrukcje porównania
Od Pentium Pro dwie nowe instrukcje porównania
bezpośrednio modyfikujace
˛ EFLAGS, ale operujace
˛ tylko
na rejestrach.
COMI rejestr
Porównuje rejestr z st0.
COMIP rejestr
To samo ze zdjeciem
˛
ze stosu.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Instrukcje porównania: przykład
global dmax
%define a1 ebp+8
%define a2 ebp+16
section .text
dmax: push ebp
mov ebp,esp
fld qword [a1]
fld qword [a2]
fcomi st1
ja a2_mniejszy
fxchg st1
a2_mniejszy:
pop ebp
ret
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Instrukcje „matematyczne”
FSQRT
Zastepuje
˛
wierzchołek stosu (st0) przez jego pierwiastek
kwadratowy.
FSIN, FCOS, FPTAN
To samo dla funkcji sin, cos i tan. Argument w radianach!
FPTAN
Oblicza tan od wierzchołka stosu (st0) i zastepuje
˛
go, a
nastepnie
˛
dokłada 1.0 na wierzchołek stosu (pamiatka
˛
z
czasów, gdy było tylko FPTAN, a nie było FSIN i FCOS).
FLDPI, FLDL2E, FLDLN2
Umieszczaja˛ na wierzchołku stosu π, log2 e, ln 2.
„Dziwne” logarytmy.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Synchronizacja
Procesor właściwy („całkowity”) i jednostka FPU to
odrebne
˛
środowiska obliczeniowe.
Moga˛ pracować równolegle, tzn. podczas wykonywania
operacji zmiennopozycyjnej równocześnie wykonuja˛ sie˛ (o
ile to możliwe) „normalne” instrukcje.
Problem z obsługa˛ wyjatków
˛
zmiennopozycyjnych:
komórki pamieci,
˛ które spowodowały wystapienie
˛
wyjatku,
˛
mogły już zostać nadpisane przez normalne instrukcje.
Stawia to pod znakiem zapytania możliwość analizy
sytuacji i naprawy w procedurach obsługi.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
Synchronizacja FWAIT
Wprowadzono instrukcje˛ FWAIT do umieszczania w kodzie
bezpośrednio po instrukcji mogacej
˛ powodować wyjatek
˛
—
blokuje ona chwilowo wykonanie dalszych instrukcji.
Cz˛esto ten sam efekt można osiagn
˛ ać
˛ po prostu
zmieniajac
˛ kolejność instrukcji, np. ciag
˛
fild [count]
inc [count]
fsqrt
zmieniamy na
fild [count]
fsqrt
inc [count]
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne
MMX
Rozszerzenie MMX procesorów Pentium daje możliwość
równoczesnego wykonywania tych samych operacji na
wielu argumentach. Jest to jak gdyby miniaturowy
procesor wektorowy.
Inna˛ ciekawa˛ cecha˛ MMX jest stosowanie arytmetyki z
nasycaniem (saturation) — przy przekroczeniu zakresu
wynikiem jest najwieksza
˛
reprezentowalna wartość (nie ma
„zawijania”). Taki sposób obliczeń stosuje sie˛ czasem w
przypadku przetwarzania danych audiowizualnych.
Przy korzystaniu z rozszerzenia MMX należy pamietać, że
praca w trybie MMX wyklucza operacje zmiennopozycyjne
i odwrotnie (bo korzystaja˛ z tych samych rejestrów, tylko
różnie je nazywaja),
˛ konieczne jest jawne przechodzenie
miedzy
˛
trybami.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Obliczenia zmiennopozycyjne

Podobne dokumenty