Wydjność obliczeń sekwencyjnych. Osobliwości prcy z cche - linimi. Typowe lgorytmy lgebry liniowej i oszcownie możliwości ich przyspieszeni y x y y y Ax C C AB Przypomnieć reguły lgebry liniowej: mnożeni mcierzy przez wektor i mcierzy przez mcierz Demonstrcj progrmu Multm: t sm ilość opercji różn wydjność Rozmir zgdnieni: 000 równń - sxpy (sclr α X plus Y) Chrkterystyki komputer: Procesor Intel Core Qud CPU Q6600 @.40 GHz Cche - L1: KB, L:4096 KB Pmięć: DDR 800 MHz 4 GB 1
Wydjność różnych lgorytmów C=C+A*B, MFLOPS 10000 9000 8000 Wydjność, MFLOPS 7000 6000 5000 4000 000 000 clssic ijk clssic ikj (HP) Block cche lb=40 Block_cche_reg lb=176 DGEMM Intel MKL 1000 0 0 500 1000 1500 000 500 Rozmir N
Wydjność dl metody mnożeni block_cche_reg w zleżności od rozmiru bloku C=A*B (Mflops), Nrównn = 000, Rozmir bloku Wydjność, MFLOPS 8x8 615 16x16 4 714 x 5 84 64x64 5 944 18x18 6 70 56x56 6 88 51x51 765 Istnieje optymlny rozmir błoku lb, przy którym osiągmy wydjność mksymlną. Jk będzie podno dlej, ten rozmir zleży od sprzętu, minowicie od rozmiru cche L1 i rozmiru TLB (Trnsltion look-side) bufor.
Oszcownie wydjności lgorytmów Złożeni Odczyt i zpis (cche RAM) i opercje rytmetyczne są wykonywne w czsie sekwencyjne (rezygnujemy z równoległości opercji rytmetycznych i we\wy) Pmięć podręczn (cche) jest rozdzieloną pomiędzy dnymi w njbrdziej skuteczny sposób (procesor i system opercyjny są intelektulne dne złdowne w cche tk, żeby zminimlizowć ilość przesyłek cche RAM) Komputer m tylko rejestry (njbrdziej szybką pmięć), jeden poziom cche (szybk pmięć rezygnujemy z hierrchicznej struktury pmięci podręcznej) i pmięć główną (dostęp do dresów której jest wykonny z szybkością mgistrli). 4
Przyjmujemy: Wszystkie tblicy dnych są umieszczone w pmięci głównej n - rozmir zgdnieni M - objętość pmięci podręcznej (cche), przy czym M << n Będziemy rozwżli tkie przypdki: M n w pmięci podręcznej możn umieścić wiersze mcierzy (młe zgdnienie) M < n dw wiersze mcierzy nie udje się umieścić w cche (duże zgdnienie) 5
Czs wykonni progrmu: t f trith m tbus f trith 1 m f t t bus rith f, m t rith, t bus - ilość rytmetycznych opercji i ilość przesłń dnych cche RAM - trwłość jednej opercji rytmetycznej i trwłość przesłni jednego słow Wskźnik wydjności wykorzystni pmięci szybkiej: q f m 6
7 W Umieszczenie dnych w pmięci: 9 8 7 6 5 4 1 1 1 1 1 11 1 1 x x x 16 15 : 14 1 1 11 : 10 9 8 7 : 6 5 4 : 1 : : : : 44 4 4 41 4 1 4 1 14 1 1 11,,1 1, 1,1 A Mcierze Wektory Podził mcierzy n bloki
SAXPY: y = y+αx //odczyt lph i umieszczenie w rejestrze for(i=1; i<=n; i++) { //odczyt y[i], x[i] y[i] = y[i] + lph*x[i]; //zpis y[i] } Ilość odczytów: α 1; x n; y n Ilość zpisów : y - n Rzem : m = n+1 Ilość mnożeń : n Ilość dodwń : n Rzem : f = n q f m n n 1 1 n 8
9 W Mnożenie mcierzy przez wektor: y = y+ax for(i=1; i<=n; i++) { //odczyt y i i umieszczenie w rejestr for(j=1; j<=n; j++) { //odczyt A ij, x j y i = y i + A ij *x j ; } //zpis y i } y x A 1 1 9 8 7 6 5 4 1 i j i j
Ilość odczytów: y n; x n, jeśli M n, n, jeśli M < n; A n ; Ilość zpisów : y n Rzem : m = n +n (M n) m = n +n (M < n) Ilość mnożeń : n Ilość dodwń : n Rzem : f = n q q f m f m n, n n 1 n n 1, n n n M n M n 10
Wniosek Wydjność drugiego lgorytmu jest brdziej wysoką od pierwszego zgdnieni, le jko w pierwszym zgdnieniu, tk i w drugim wskźnik wydjności nie zleży od rozmiru pmięci podręcznej. To ozncz, że te lgorytmy są skzne n wykonnie z szybkością wolnej mgistrli, nie szybkiego procesor. Zwiększenie częstości zegr procesor, objętości pmięci podręcznej nie powoduje istotnego przyspieszeni obliczeń. Przykłd: przesłnie jednego słow trw ~40 cyklów procesor. Dl lgorytmu q = 1 ozncz, że n jedną opercje rytmetyczną przypd przesłnie jednego słow. Jeden cykl procesor wytrc n opercje rytmetyczną. A pozostłe 9 cyklów? Są puste. Tu nie są uwzględnione prefetch i ten fkt, że łdownie dnych do cche jest wykonywne nie słowo po słowie, grupmi słów, umieszczonych w cche-linie. Przecież nie zmieni to sytucji w cłości. 11
1 W Mnożenie mcierzy przez mcierz: C = C + A*B 1. Metod klsyczn (ijk) B A C 9 8 7 6 5 4 1 9 8 7 6 5 4 1 9 8 7 6 5 4 1 k i i j k j Mcierze są umieszczone w pmięci głównej wiersz po wiersze Wzór mtemtyczny: n j i b c n k kj ik ij, 1,, 1
Algorytm: for(i=1; i<=n; i++) { for(j=1; j<=n; j++) { //odczyt C ij i umieszczenie w rejestrze for(k=1; k<=n; k++) { //odczyt A ik, B kj C ij = C ij + A ik *B kj ; } //zpis C ij } } UWAGA! Przy kżdej zminie indeksu k będzie pobrny element mcierzy B kj z nstępnego wiersz jeśli mcierz jest dość dużą, bez sensu przydzielć cche dl ej elementów wyniknie przełdownie cche przy kżdej zminie indeksu k. Intelektulny procesor i system opercyjny będą pobierli elementy mcierzy B bez buforowni. 1
Ilość odczytów: C n ; A n, jeśli M n, n, jeśli M < n; B n ; Ilość zpisów : C n Rzem : m = n +n (M n) m = n +n (M < n) Ilość mnożeń : n Ilość dodwń : n Rzem : f = n q q f m f m n, n n 1 n n 1 1, n n 1 1 n M n M n 14
Metod klsyczn (ikj) - HP for(i=1; i<=n; i++) { for(k=1; k<=n; k++) { //odczyt A ik i umieszczenie w rejestrze for(j=1; j<=n; j++) { //odczyt C ij, B kj C ij = C ij + A ik *B kj ; //zpis C ij, jk tylko bufor będzie wyczerpny } } } Model nie uwzględni pobierni dnych z pmięci: wskźnik wydjności dl mcierzy dużych (M < n) okzuje się nwet gorzej, niż w przypdku poprzednim to się nie odpowid rzeczywistości. N prktyce ten model liczy szybszej od poprzedniego dl tego, że pozostłe usunięte skoki w dnych 15
Ilość odczytów: C n, jeśli M n, n, jeśli M < n; A n ; B n ; Ilość zpisów : C n, jeśli M n, n, jeśli M < n; Rzem : m = n +n (M n) m = n +n (M < n) Ilość opercji rytmetycznych: f = n q q f m f m n n n n n n 1 n 1 n,, M n M n 16
Metod blokow Mcierz jest podzieloną n bloki o tkim rozmirze, że trzy bloki jednocześnie mogą być umieszczone w pmięć podręczną (cche) jb 1 : 4 1 : 4 1 : 4 5 6 : 7 8 5 6 : 7 8 5 6 : 7 8 C11 C1 A11 A1 B11 B1... :...... :...... :... ib 9 10 : 11 1 ib 9 10 : 11 1 kb 9 10 : 11 1 1 14 : 15 16 1 14 : 15 16 1 14 : 15 16 C C A A B B 1 1 1 C Nb kb Dl mcierzy blokowej zstosowujemy dziłni nd blokmi: C C A A B ib, ib, jb ib, jb ib, kb kb, jb, kb1, jb 1 Nb W obszrze kżdego bloku używmy zwykłe dziłni nd mcierzmi jb B 17
Algorytm (*) for(ib=1; ib<=n b ; ib++) { for(jb=1; jb<= N b ; jb++) { //odczyt bloku C ib,jb i umieszczenie w //cche for(kb=1; kb<= N b ; kb++) { //odczyt bloków A ib,kb, B kb, jb C ib,jb = C ib,jb + A ib,kb *B kb,jb ; } //zpis bloku C ib,jb } } Rozmir kżdego bloku wynosi l b = n/n b, gdzie n rozmir mcierzy, N b - ilość podziłów n bloki wzdłuż jednej iż stron (przypuszczmy, że n jest wielokrotne N b ) Ilość słów w kżdym bloku jest równ l b = n /N b 18
Ilość odczytów: C N b l b = N b n /N b = n ; A N b l b = N b n /N b = N b n ; B N b l b = N b n ; Ilość zpisów : C n ; Rzem : m = N b n + n = (N b +1) n N b n ; Ilość opercji rytmetycznych: f = n q f m n N n b n N b l b ; bloki muszą byc w cche l b M l b M l b M q M ; 19
Wydjność lgorytmów lgebry liniowej jest przyjęte odnosić do jednego z poziomów BLAS (Bsis Liner Algebr Subroutines) zgodnie z rzędem opercji rytmetycznych O(n k ). BLAS1 O(n 1 ), BLAS O(n ), BLAS O(n ) Algorytm sxpy Wzór mtemtyczny y y x q f m Poziom BLAS / 1 O(n) Mnożenie mcierzy przez wektor y y A x (M n) 1 (M<n) O(n ) Mnożenie mcierzy przez mcierz (Clssic) C C AB (M n) 1 (M < n) O(n ) Mnożenie mcierzy przez mcierz (HP) C C AB (M>=n) / (M<n) O(n ) Mnożenie mcierzy przez mcierz (metod blokow) C C AB M O(n ) 0
Wnioski Algorytmy poziomu BLAS 1, - O(n 1 ), O(n ) nie wykzują oszcowni wydjności lepiej od q =. Dl nich podstwowo nie jest możliwe podniesienie wydjności w skutek utrzymni dnych w cche ilość opercji rytmetycznych jest tego smego rzędu, jk i ilość przesłń dnych. Oni są przyrzeczone prcowć z prędkością wolnej mgistrli. Algorytmy poziomu BLAS - O(n ) mogą być zorgnizowne tk, że część dnych, jeden rz umieszczoną w cche, pozostje wykorzystn wielokrotnie (cche reuse). Powoduje to zmniejszenie rzędu ilości przesłń dnych w stosunku do rzędu opercji rytmetycznych oszcownie wydjności jest lepsze od q =. Podstwą dl tworzeni tkich lgorytmów jest podził dnych n bloki. Przy oszcowniu q~ M możn przynjmniej teoretycznie tk dobrć rozmir cche że procesor będzie mił minimlną ilość pustych cykli. Im więcej jest l b (l b <M), tym większ wydjność. 1
Podził n bloki n poziomie rejestrów. (Register s blocking) Przedstwion powyżej procedur podziłu n bloki w tki sposób, żeby jednocześnie w pmięci podręcznej mieścili się bloki, okzł się podstwą dl podniesieni wydjności lgorytmu mnożeni mcierzy przez mcierz rzędu ~O(n ) dziłń rytmetycznych. Procedur t zmniejsz ilość przesłń dnych pmięć główn pmięć podręczn pmięć główn i dostł nzwę cche blocking. Okzuje się że przy przesyłniu dnych pmięć podręczn rejestry pmięć podręczn zstosownie techniki blokowej zmniejsz ilość łdowń rejestrów (register s reuse) i też służy do podniesieni wydjności lgorytmu. Rozwżmy lgorytm C ib,jb = C ib,jb + A ib,kb *B kb,jb - pętl wewnętrzn lgorytmu (*)
Algorytm niwny (mnożenie bloków mcierzy Cib,jb = Cib,jb + Aib,kb*Bkb,jb ) for( i 0; i l { { } } for( j 0; j l r 0; for( k 0; k l { r r } c ij c ij b r; ; i ) ik b ; j ) b b kj ; k ) ; W pętle wewnętrznej: Ilość łdowń rejestrów: 1 odczyt ik + 1 odczyt b ik Ilość opercji rytmetycznych: 1 mnożenie + 1 dodwnie ---------------------------------------------------- q = f/m = / = 1 Ilość potrzebnych rejestrów typu double: 4 r, ik, b ik, tmp ik b ik Żdnego blokowni rejestrów w tym lgorytmie nie m Tu r zmienn klsy register, któr m być przechowywn w rejestrze w ciągu wykonni cłej pętli wewnętrznej, ik, b ik elementy bloków A ib,kb, B kb,jb odpowiednio. Po zkończeniu pętli wewnętrznej wrtość zmiennej r będzie przypisn c ij - elementowi bloku C ib,jb. S. Filko Modelownie zgdnień technicznych
Schemt blokowni rejestrów x for( i 0; i l ; i ) { for( j 0; // B b j l for( k 0; k l ; k ) { // Łdujemy w rejestry kj b { r0 0; r1 0; r 0; r 0; 0 b ; r A B ; 0 r0 r0 r; r A B ; 1 0 0 r r r; ; j ) b // r // r ik b i1, k A 0 kj // r0 r0 b kj // r r ik i1, k ik b ; kj b kj A 1 i1, k ; }// zkonczenie petli k c c ij // Łdujemy w rejestr r r1 r1 r; r r r r; c i1, j A B ; A B ; ij c r0; i1, j r; // r }// zkonczenie petli j }// zkonczenie petli i 0 1 0 0 c // r // r1 r1 // r r i, j1 c c ik i1, j1 B b i1, k i, j1 0 b r1; c b k, j1 ik b k, j1 i1, k i1, j1 k, j1 k, j1 b ; k, j1 r; Rejestry: r0, r1, r, r służą dl przechowywni poprwek do elementów c ij, c i,j+1, c i+1,j, c i+1,j+1 w ciągu iterowni cłej pętli wewnętrznej. A 0, A 1 do przechowywni ik, i+1,k ; B 0 b kj, b k,j+1 ; r pomocniczy rejestr do przechowywni wyników mnożeni. Rzem: 8 rejestrów typu double Frgment kodu dgemm_c 4
W pętle wewnętrznej: Ilość łdowń w rejestry: 4 Ilość opercji rytmetycznych: 8 (4 mnożeni + 4 dodwni) ------------------------------------------------------------------------------------------------ q = f/m = 8/4 = To jest zncznie lepiej, niż dl poprzedniego lgorytmu, przecież potrzebuje 8 rejestrów typu double. i c c i,j i+ 1,j c i,j+ 1 c i+ 1,j+ 1 j += i i,k i+ 1,k k k b b j k,j k,j+ 1 C A B ib,jb ib,kb kb,jb Rozmieszczenie rejestrów double w schemcie blokowni x 5
Blokownie x Możn udowodnić, że blokownie x będzie jeszcze lepiej: w pętle wewnętrznej - 6 odczytów w rejestry, 18 opercji rytmetycznych, q = f/m = 18/6 = Przecież potrzebuje 15 rejestrów typu double: 9 rejestrów dl poprwek do elementów mcierzy C ib,kb, rejestry dl elementów mcierzy A ib,kb, 1 rejestr dl elementów mcierzy B ik,jk i rejestry pomocnicze. Wnioski Blokownie rejestrów zmniejsz ilość przesłń dnych cche-rejestr-cche w skutek utrzymni części dnych w rejestrch. To powoduje zwiększenie współczynnik ilość rytmetycznych opercji/ilość przesłń dnych n poziomie pmięć podręczn rejestr pmięć podręczn. Im więcej rejestrów double zwier procesor, tym większy rozmir bloku ud się zrelizowć, tym brdziej wysoką będzie wydjność. Dl schemtu blokowni n n: q = n /(n) = n /n, ilość potrzebnych rejestrów - n +n 6
Przykłd: Rozmir mcierzy N = 1 000 Algorytm niwny ijk: Blokownie rejestrów x: Blokownie rejestrów x, blokownie cche 64 64 i repck (BLAS 1989, J. Dongrr): 00 MFLOPS 600 MFLOPS 11 MFLOPS Frgment kodu dgemm_dong Komputer: Procesor Intel Core Qud CPU Q6600 @.40 GHz Cche - L1: KB, L:4096 KB; Pmięć: DDR 800 MHz 4 GB Kompiltor: Intel C/C++ 10.1.01 /O /QxT /QxT /Qunroll:10 /Qprllel 7
Zstosownie rejestrów wektorowych Nstępnym etpem podniesieni wydjności jest zstosownie rejestrów wektorowych. Procesory Pentium IV zwierją 8 18-bitowych rejestrów XMM (Streming SIMD Extensions SSE technologii), kżdy z których umieszcz dw słow typu double. Tkie rejestry ndją możliwość z jeden cykl procesor wykonywć dw mnożeni lub dw dodwni. W porównniu ze zwykłymi rejestrmi typu double, które mogą wykonywć tylko jedną opercje (mnożenie lub dodwnie) z jeden cykl procesor, użycie rejestrów wektorowych teoretycznie zezwl n podniesinie wydjności lgorytmów obliczeniowych, jeśli nie powstje przy tym ztrzymnie przesłń dnych RAM cche RAM, cche rejestry - cche. To jest element rchitektury SIMD (single instruction strem multiple dt strem). Wcześniej zstosownie rejestrów XMM było możliwe tylko w języku ssembler. Terz technologii SSE, SSE wspierją możliwość oprogrmowni n poziomie język C/C++. 8
j k j i += i k C ib,jb A B ib,kb kb,jb Rozmieszczenie rejestrów wektorowych w schemcie blokowni x4, używnego dl procesorów Pentium IV rchitektury Prescott и Opteron Przy jednej itercji pętli wewnętrznej mmy: 6 łdowń dnych w rejestry 16 opercji rytmetycznych ------------------------------------------ q = 16/6 =.67 9
#include <emmintrin.h> #include <intrin.h> m18d c1, c, c, c4, w, w1, wt, wt1; //8 registers MMX re needed const int mr = ; const int nr = 4; for(i=0; i<lbv; i+=mr) { for(j=0; j<lbh; j+=nr) { pwt = WT+M*j; //point to block B kb,jb ; M ilość wierszy w mcierzy B kb,jb pw = W+i*M; //point to block A ib,kb ; M ilość kolumn w mcierzy A ib,kb //clening of registers for C ib,kb c1 = _mm_setzero_pd(); c = _mm_setzero_pd(); c = _mm_setzero_pd(); c4 = _mm_setzero_pd(); for(k=0; k<m; k++) { //------------------------ 0 w = _mm_lod1_pd(pw); wt = _mm_lod_pd(pwt); wt1 = _mm_lod_pd(pwt+); w1 = w; w1 = _mm_mul_pd(w1, wt); w = _mm_mul_pd(w, wt1); //lod w <- ik, i,k //lod wt <- b kj, b k,j+1 //lod wt1 <- b k,j+, b k,j+ //w1 <- w //{ ik b kj, ik,b k,j+1 }: w1<-w*wt //{ ik b k,j+, ik,b k,j+ }: w1<-w*wt1 c = _mm_dd_pd(c, w); //{c i,j+, c i,j+ } <- {c i,j+, c i,j+ }+{ ik b k,j+, ik,b k,j+ } c1 = _mm_dd_pd(c1, w1); //{c ij, c i,j+1 } <- {c ij, c i,j+1 }+{ ik b kj, ik,b k,j+1 } 0
w = _mm_lod1_pd(pw+1); // lod w <- i+1,k, i+1,k w1 = w; //w1 <- w w1 = _mm_mul_pd(w1, wt); w = _mm_mul_pd(w, wt1); //{ i+1,k b kj, i+1,k,b k,j+1 }: w1<-w*wt //{ i+1,k b kj, i+1,k,b k,j+1 }: w1<-w*wt c4 = _mm_dd_pd(c4, w); //{c i+1,j+, c i+1,j+ } <- {c i+1,j+, c i+1,j+ }+{ i+1,k b k,j+, i+1,k,b k,j+ } c = _mm_dd_pd(c, w1); //{c i+1,j, c i+1,j+1 } <- {c i+1,j, c i+1,j+1 }+{ i+1,k b kj, i+1,k,b k,j+1 } } pw += mr; pwt+= nr; }//j loop } //i loop pos_cw = mr*j; //unlod registers to C _mm_store_pd(cw+pos_cw, c1); _mm_store_pd(cw+pos_cw+, c); _mm_store_pd(cw+pos_cw+4, c); _mm_store_pd(cw+pos_cw+6, c4); Uwg! Dne tblic B kb,jb, C ib,jb mją być wyrównne po grnice 16 bjtów! A = (double *)_ligned_mlloc((number_of_items)*sizeof(double), 16);. _ligned_free(a); 1
K раз W Dl wciągnięci potokowych technologii procesor rozwijmy pętle wewnętrzne K rzy (ilość używnych rejestrów MMX nie zleży od K): j k j i += i.. K раз k.. C ib,jb A B ib,kb kb,jb W zleżności od typu procesor K może osiągnąć 90 10 rzy. Npisn w tki sposób pętl wewnętrzn dostł nzwę mikrojąndr (Microkernel).
Pkownie dnych Dl tego, żeby zminimlizowć red miss (cche-chybienie przy odczycie), dne mją być umieszczone w pmięci głównej w kolejności ich pobrni będziemy nzywli to kolejnością optymlną. Dne, które pozostłe umieszczone w cche, mją pozostwć tm jk njdłużej. Przecież pierwotne umieszczenie dnych w kżdej z mcierzy i w blokch C ib,jb, A ib,kb, B kb,jb nie odpowid tkiej kolejności wynik konieczność przepkowni dnych. Istnieje kilk różnych schemtów przepkowni.
Początkowe umieszczenie dnych w mcierzy A, B, C kb=1,.,nb //Pck A *,kb jb=1,.,nb //Pck B kb,jb ib=1, Nb C ib,jb +=A ib,kb *B kb,jb end ib end jb end kb Mnożenie w blokch: i=1, lb, j=1, lb, k=1, lb C ij ib,jb+=a ik ib,kb*b kj kb,jb C i+1,j ib,jb+=a i+1,k ib,kb*b kj kb,jb. end k end j end i Pkownie BLAS, ATLAS 4
Pkownie BLAS, ATLAS: W cche L1 mją być umieszczone trzy bloki: A ib,kb, B kb,jb, C ib,kb. Z tego wynik: 1 l L L b 1 lb Przykłd: L1=K = *104 = 768 bjtów lbo 768/8 = 4 096 słów double. l b = 6.95 6 40 To jest optymlny rozmir bloku dl tkiego lgorytmu 5
Intel MKL kb=1,.,nb //Pck B kb ib=1,.,nb //Pck A ib,kb jb=1 C ib +=A ib,kb *B kb end ib end jb end kb Pkownie Intel MKL: gór poziom mcierzy; dół poziom bloków m r n r - schemt blokowni rejestrów; l b szerokość pneli. Z punktu widzeni wydjności obliczeń przy wykonniu pętli wewnętrznej w cche L1 mją być umieszczone bloki dnych, zkreskowne n rys, plus blok m r xn r. To jest brdziej oszczędny sposób użyci ogrniczonej pmięci podręcznej, niż przedstwiony w projektch BLAS, ATLAS 6
Pkownie dnych Intel MKL?gemm dl schemtu blokowni rejestrów wektorowych m r n r. Gór : mnożenie pnelu mcierzy przez blok; Dół bloki, które mją być umieszczone w TLB buforze. 7
Pkownie Intel MKL: W pętle wewnętrznej {k=0; k<lb; } są potrzebne: jeden blok m r l b, jeden blok n r l b i jeden blok m r n r. Z tego wynik: l b m r n r m r n r L 1 l b L1 mr n m n Z innej strony rozmir dnych, umieszczonych w cche L, nie powinien przekroczyć rozmiru TLB Trnsltion Lookside Buffer (Dodtek 1). To jest cche CPU, używny nrzędziem sterowni pmięci dl przyspieszeni trnslcji dresów wirtulnych w trkcie mpowni dresów wirtulnych n pmięć fizyczną. Wielu procesorów, również procesory x86, używją tego urządzeni. Jeśli obszr dnych przekrcz rozmir TLB, dostęp do tych dnych idzie zncznie wolniej. Więc drugi wrunek (dne, oznczone n poprzednim rys, dół): r r r (1) l b n l r b TLB l b n r TLB n r () 8
Z tych dwóch wrunków trzeb wybrć ten, który doprowdzi do mniejszego rozmiru l b. Przykłd: m r =, n r = 4, TLB = 56 K (Pentium IV, Core Duo), L1 = K. To ozncz: L1 = 4096 słów double, TLB = 768 słów double. Ze wzoru (1) : l b = (4 096-*4)/(+4) = 681 Ze wzoru (): l b = [ + 768] - = 179 Optymln wrtość: l b = 176 (musi być wielokrotn do n r = 4) 9
Technologie EM64t (system opercyjny 64 bit) dopuszczją obecność 16 18-bit rejestrów XMM. Więc register s blocking, również i pkownie dnych myszą odpowidć schemtowi 4 4 (m r =n r =4) : Użycie rejestrów: 8 dl elementów mcierzy C ib,jb, 4 dl elementów mcierzy A ib,kb, 4 dl elementów mcierzy B kb, jb. 40
N kżdej itercji pętli wewnętrznej mmy: 8 łdowń w rejestry i opercji rytmetyczne q = /8 = 4 Advnced Vector Extension AVX Podził mcierzy n bloki i odwzorownie dnych n rejestry YMM 41
Łdownie elementów mcierzy w rejestry YMM 4
Mikrojądro wykonne w pętle wewnętrznej po indeksu k: 0 = _mm56_lod_pd(paa); b0 = _mm56_brodcst_sd(pbb); 1 = _mm56_lod_pd(paa+4); b1 = _mm56_brodcst_sd(pbb+1); b = _mm56_brodcst_sd(pbb+); b = _mm56_brodcst_sd(pbb+); mul = _mm56_mul_pd(0, b0); mul1 = _mm56_mul_pd(1, b0); c = _mm56_dd_pd(c, mul1); c1 = _mm56_dd_pd(c1, mul); mul = _mm56_mul_pd(0, b); mul1 = _mm56_mul_pd(1, b); c6 = _mm56_dd_pd(c6, mul1); c5 = _mm56_dd_pd(c5, mul); mul = _mm56_mul_pd(0, b); mul1 = _mm56_mul_pd(1, b); c8 = _mm56_dd_pd(c8, mul1); c7 = _mm56_dd_pd(c7, mul); mul = _mm56_mul_pd(0, b1); mul1 = _mm56_mul_pd(1, b1); c4 = _mm56_dd_pd(c4, mul1); c = _mm56_dd_pd(c, mul); 4
FMA: w jednej instrukcji są wykonne mnożenie i dodwnie. Mikrojądro wykonne w pętle wewnętrznej po indeksu k: 0 = _mm56_lod_pd(paa); 1 = _mm56_lod_pd(paa+4); b0 = _mm56_brodcst_sd(pbb); b1 = _mm56_brodcst_sd(pbb+1); b = _mm56_brodcst_sd(pbb + ); b = _mm56_brodcst_sd(pbb + ); c1 = _mm56_fmdd_pd(0, b0, c1); c = _mm56_fmdd_pd(1, b0, c); c = _mm56_fmdd_pd(0, b1, c); c4 = _mm56_fmdd_pd(1, b1, c4); c5 = _mm56_fmdd_pd(0, b, c5); c6 = _mm56_fmdd_pd(1, b, c6); c7 = _mm56_fmdd_pd(0, b, c7); c8 = _mm56_fmdd_pd(1, b, c8); //c1 = c1 + 0*b0 //c = c + 1*b0 //c = c + 0*b1 // 44
AVX : mnożenie + dodwnie - 8 cykli procesor FMA: _fmdd_pd 5 cykli procesor Przykłd: mnożenie mcierzy kwdrtowych o rozmirze 1 960 1 960. Komputer: Procesor Intel Core i 4010U (Hswell ULT) CPU@1.7 GHz Cche: L1 = KB, L = 56 KB, L = MB RAM: DDR 4.0 GB Wydjność, MFLOPS SSE AVX AVX FMA 5 841 1 047 17 50 Dl porównni. Komputer z procesorem Intel Core i7-760qm@.4/.5 GHz (Sndy Bridge) cche L1= 4 KB, L = 4 56 KB, L = 6 MB, RAM DDR 8.0 GB wspier tylko zestw instrukcji AVX i wykzuje wydjność 19 50 MFLOPS. To jest nie wielu lepiej od procesor i, który n tym teście osiąg trochę mniejszej wydjności przy częstości tktowni pond rzy mniejszej od i7. 45
Litertur do wykłdu: 1. Demmel J. W., Applied Numericl Liner Algebr, SIAM, Phildellphi, 1997, Russin edition, Moscow, Mir, 001.. Golub G.H., vn Lon C. F., Mtrix Computtions. Third edition, The Johns Hopkins University Press, 1996.. Goto K, Vn De Geijn R A (008). Antomy of High-Performnce Mtrix Multipliction. ACM Trnsctions on Mthemticl Softwre. V 4,, 1 5. 4. Yotov K., Roeder T., Pingli K., Gunnels J., Gustvson F., An Experimentl Comprison of Cche-oblivious nd Cche-conscious Progrms. SPAA 07, June 9 11, 007, Sn Diego, Cliforni, USA. 5. Filko S. Blokow wielofrontln metod podstruktur do rozwiązywni dużych ukłdów równń MES. Czsopismo techniczne, 1-NP/009, 175 188. 6. Filko S. Appliction of AVX (Advnced Vector Extensions) for Improved Performnce of the PARFES Finite Element Prllel Direct Solver. Federted Conference on Computer Science nd Informtion Systems, September 8 11, 01. Krków, Polnd. IEEE Xplore Digitl Librry, pp. 447 454. https://fedcsis.org/proceedings/01/pliks/98.pdf 46
Dodtek 1 TLB (Goto K, Vn De Geijn R A (008). Antomy of High-Performnce Mtrix Multipliction. ACM Trnsctions on Mthemticl Softwre. V 4,, 1 5) 4.. TLB considertions. A second rchitecturl considertion reltes to the pge mngement system. For our discussion it suffices to consider tht typicl modern rchitecture uses virtul memory so tht the size of usble memory is not constrined by the size of the physicl memory: Memory is prtitioned into pges of some (often fixed) prescribed size. A tble, referred to s the pge tble mps virtul ddresses to physicl ddresses nd keeps trck of whether pge is in memory or on disk. The problem is tht this tble itself is stored in memory, which dds dditionl memory ccess costs to perform virtul to physicl trnsltions. To overcome this, smller tble, the Trnsltion Look-side Buffer (TLB), tht stores informtion bout the most recently used pges, is kept. Whenever virtul ddress is found in the TLB, the trnsltion is fst. Whenever it is not found ( TLB miss occurs), the pge tble is consulted nd the resulting entry is moved from the pge tble to the TLB. In other words, the TLB is cche for the pge tble. More recently, level TLB hs been introduced into some rchitectures for resons similr to those tht motivted the introduction of n L cche. 47
The most significnt difference between cche miss nd TLB miss is tht cche miss does not necessrily stll the CPU. A smll number of cche misses cn be tolerted by using lgorithmic prefetching techniques s long s the dt cn be red fst enough from the memory where it does exist nd rrives t the CPU by the time it is needed for computtion. A TLB miss, by contrst, cuses the CPU to stll until the TLB hs been updted with the new ddress. In other words, prefetching cn msk cche miss but not TLB miss. S. Filko Modelownie zgdnień technicznych 48