Programowanie w asemblerze Architektury równoległe

Transkrypt

Programowanie w asemblerze Architektury równoległe
Programowanie w asemblerze
Architektury równoległe
Zbigniew Jurkiewicz, Instytut Informatyki UW
17 stycznia 2017
1
1
Ilustracje: Song Ho Anh
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
Klasyfikacja Flynna
Duża różnorodność architektur równoległych, stad
˛ różne
kryteria podziału. Najstarsza klasyfikacja Flynna używała pojeć
˛
strumienia instrukcji i strumienia danych.
SISD (Single Instruction Single Data) to klasyczny system
jednoprocesorowy z pojedynczym,i strumieniami instrukcji
i danych.
Jeśli zwielokrotnimy strumienie danych, to otrzymamy
system SIMD (Single Instruction Multiple Data), w którym
wiele procesorów wykonywało równocześnie te˛ sama˛
instrukcje˛ na różnych danych. Przyśpiesza to
wykonywanie typowych operacji macierzowych, takich jak
mnożenie czy odwracanie. Tak pracowały procesory
wektorowe (np. Cray-1) i macierzowe.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
Klasyfikacje Flynna
Zwielokratniajac
˛ strumień instrukcji otrzymujemy system
MISD (Multiple Instruction Single Data), spotykany jedynie
w bardzo specyficznych zastosowaniach (np.
przetwarzanie lustrzane).
Przy zwielokrotnieniu obu strumieni otrzymujemy system
MIMD (Multiple Instruction Multiple Data), z pełna˛
współbieżnościa˛ — możliwościa˛ niezależnego
przetwarzania różnych danych przez poszczególne
procesory.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
Podział według metod synchronizacji
synchroniczne, np. SIMD;
asynchroniczne, np. MIMD.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
MMX
Pierwsze podejście do strumieni SIMD.
„Pasożytuje” na FPU — używa tych samych rejestrów.
Pierwsze instrukcje 64-bitowe, np.
movq mm0,[tablica]
pozwalajace
˛ przesłać wektor wartości do rejestru MMX.
Dostepne
˛
także w SSE.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
Wykrywanie technologii SSE
Przed użyciem zaawansowanych instrukcji trzeba
sprawdzić, czy procesor ja˛ obsługuje. W naszej pracowni
sa˛ różne procesory!
Do sprawdzania służy instrukcja cpuid.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
CPUID
Instrukcja CPUID zwraca informacje o procesorze. Podobne
informacje w Linuksie przez
cat /proc/cpuinfo
Aby sprawdzić, czy procesor reaguje na CPUID, należy
spróbować, czy da sie˛ zmodyfikować bit 21 w słowie stanu
procesora (EFLAGS)
pushfd
pop eax
mov ecx,eax
xor eax,200000h
push eax
popfd
pushfd
pop eax
cmp eax,ecx
je niema
Zbigniew Jurkiewicz, Instytut Informatyki UW
;wyjmujemy flagi
;zachowanie flag
;zmiana bitu 21
;z powrotem
;jeszcze raz pobieramy
Programowanie w asemblerze Architektury równoległe
CPUID
Użycie CPUID (gdy jest)
mov eax,funkcja
cpuid
Dla funkcji 0 dostajemy
w EAX maks. numer funkcji (co najmniej 0 ;-)
w EBX|ECX|EDX nazwa˛ procesora, np. „Genuine Intel”
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
CPUID
Dla funkcji 1 dostajemy w EDX
bit 0: czy jest FPU
bit 11: czy działa SYSCALL/SYSRET
bit 15: czy jest CMOV
bit 23: czy jest MMX
bit 25: czy jest SSE
bit 26: czy jest SSE2
a w ECX
bit 0: czy jest SSE3
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
CPUID
Dla funkcji 4 dostajemy w EAX
bity 26..31: liczba procesorów (cores)
Reszta (dużo wieksza)
˛
w dokumentacji.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
Rejestry XMM
Używane w zbiorze instrukcji SSE, SSE2, SSE3, SSSE3,
SSE4.1, SSE4.2, SSE5, Advanced Vector Extensions
W trybie 32-bitowym 8 rejestrów 128-bitowych
XMM0–XMM7
W trybie 64-bitowym 16 rejestrów 128-bitowych
XMM0–XMM15
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
Rejestry XMM
Przechowuja˛
wektor 16 wartości 8-bitowych całkowitych
wektor 8 wartości 16-bitowych całkowitych
wektor 4 wartości 32-bitowych całkowitych lub
zmiennoprzecinkowych
wektor 2 wartości 64-bitowych całkowitych lub
zmiennoprzecinkowych
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
Przesłania
Instrukcje arytmetyczne operuja˛ tylko na wyrównanych do
16 bajtów adresach w pamieci.
˛
Dwa rodzaje przesłań do/z rejestrów:
MOVDQU jeśli adres nie jest wyrównany (Unaligned)
MOVDQA jeśli adres jest wyrównany (Aligned)
Zerowanie rejestru
pxor xmm1,xmm1
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
Dodawanie
Dla wektorów całkowitych już w MMX
SSE dodaje operacje dla wektorków liczb rzeczywistych
pojedynczej precyzji (Single), np. ADDPS (gdzie P jest od
Packed)
W SSE2 rozszerzone na liczby podwójnej precyzji
(Double), np. ADDPD.
Dodano też operacje dla pojedynczych wartości, tzw.
skalarów (Scalar), np. ADDSS i ADDSD.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
Dodawanie: przykład
Załóżmy, że mamy dodać dwa wektory trójwymiarowe,
reprezentowane w pojedynczej precyzji.
Musza˛ one być reprezentowane na 128 bitach, wiec
˛
przyjmijmy, że „górna” wartość jest wyzerowana.
movups
movups
addps
movups
xmm0,[eax]
xmm1,[ebx]
xmm0,xmm1
[edx],xmm0
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
Mnożenie
Podobnie jak dodawanie: MULPS/MULPD dla wektorów,
MULPSS/MULSD dla skalarow
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
Operacje skalar/wektor
Przed dodaniem do wektora należy skalar zreplikować,
żeby wygladał
˛
jak wektor
Najprościej bedzie,
˛
gdy użyjemy operacji „tasowania”:
shufps xmm1,xmm2,maska
Operacja ta w pierwszym argumencie rozrzuca dwie kopie
skalara z pierwszego argumentu i dwie kopie z drugiego.
O wyborze skalarów decyduje maska 8-bitowa.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
Tasowanie
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
Dodawanie skalara do wektora
Przy tasowaniu pierwszy argument może być taki sam jak
drugi.
movss xmm0,fscalar
shufps xmm0,xmmo,00000000B
addps xmm0,xmm1
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
Porównania
Operacje porównywania w SSE nie ustawiaja˛ flag (nie ma
tylu flag).
W pierwszym argumencie umieszczana jest prawda (same
jedynki) albo fałsz (same zera) — oczywiście osobno dla
każdego elementu.
Tak wiec
˛ operacja porównywania jest destrukcyjna!
cmpd
movmskpd
cmp
jne
xmm0,xmm1
eax,xmm0
eax,0
tam
;wynik w xmm0
Uwaga: dla skalarów instrukcje COMISD i UCOMISD
bezpośrednio zmieniaja˛ EFLAGS, wiec
˛ po nich zwykły skok
warunkowy.
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
Porównania
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
SSE3
Zawiera zbiór skalarnych operacji na liczbach
zmiennopozycyjnych pojedynczej i podwójnej precyzji
trzymanych w dolnych cz˛eściach rejestrów XMM.
Operacje zmiennopozycyjne typu rejestr-rejestr (a nie
stosowe), np. G CC używa FPU już tylko w rzadkich,
specjalnych przypadkach.
Stałe zmiennopozycyjne musza˛ być pobierane z pamieci,
˛
nie można ich umieszczać bezpośrednio w instrukcjach.
Przy porównywaniu liczb zmiennopozycyjnych cztery
wyniki (także w C): <, =, > oraz „żadna z tych możliwości”
(gdy któraś z liczb to NaN).
Zbigniew Jurkiewicz, Instytut Informatyki UW
Programowanie w asemblerze Architektury równoległe
SSE3
Wprowadzono bardzo ciekawe instrukcje dodawania
horyzontalnego HADDPS/HADDPD, dodajac
˛ a˛ sasiaduj
˛
ace
˛
pary liczb w argumentach i zapisujac
˛ a˛ wynik w pierwszym
argumencie.
Użyjemy jej do policzenia iloczynu skalarnego naszych
wektorów
movups
movups
mulps
haddps
haddps
movss
xmm0,[eax]
xmm1,[ebx]
xmm0,xmm1
xmm0,xmm0
xmm0,xmm0
[edx],xmm0
Zbigniew Jurkiewicz, Instytut Informatyki UW
;Pierwszy wektor
;Drugi wektor
;Iloczyny
;Półsumy
Programowanie w asemblerze Architektury równoległe