Wysokowydajna implementacja kodów nadmiarowych typu "erasure codes" z wykorzystaniem architektur wielordzeniowych Ł. Kuczyński, M. Woźniak, R. Wyrzykowski Instytut Informatyki Teoretycznej i Stosowanej Politechnika Częstochowska {roman, lkucz, marcell}@icis.pcz.pl
Plan prezentacji 1) Zastosowanie kodów nadmiarowych typu EC 2) Kody Reeda-Solomona (RS) 3) Odwzorowanie algorytmu implementującego kody Reeda-Solomona na procesory graficzne GPU 4) Modyfikacja Cauchy kodów Reeda-Solomona 5) Realizacja kodów Cauchy Reeda-Solomona na procesorach graficznych 6) Wykorzystanie procesora Cell/B.E. do realizacji kodów Reeda-Solomona oraz Cauchy Reeda-Solomona.
Zastosowanie kodów EC (1) Klasyczne podejście do budowy systemów zarządzania danymi odpornych na awarie bazuje na replikacji danych pomiędzy kilkoma serwerami. Kody korekcyjne typu EC (Erasure Codes) umożliwiają poprawę niezawodności rozproszonych systemów składowania danych dzięki rozbiciu danych na fragmenty, zakodowaniu ich w sposób nadmiarowy, a następnie rozdystrybuowaniu otrzymanych fragmentów pomiędzy różnymi serwerami. F 3
Zastosowanie kodów EC (2) Każdy przechowywany plik zostaje podzielony na n fragmentów o długości B bajtów. D0, D1,..., Dn-1 W procesie kodowania wyznaczane zostają m sum kontrolnych (długości B bajtów). C0, C1,..., Cm-1 Dane można odzyskać po awarii dowolnych m węzłów. B = F / n F B bajtów B bajtów B bajtów B bajtów n B bajtów B bajtów B bajtów B bajtów m 4
Zastosowanie kodów EC (3) Kody Reeda-Solomona wykorzystywana arytmetyka ciała Galois GF(2w) gdzie 2w n+m Kody LDPC (Low-Density Parity-Check) np. kody Tornado (DFC Digital Fountain Codes) Kody Cauchy Reeda-Solomona sprowadzenie operacji wykonywanych w arytmetyce ciała Galois GF(2w) do operacji typu XOR lub AND wykonywanych bit po bicie. 5
Kody Reeda-Solomona KODOWANIE wyznaczanie sum kontrolnych cm: n słów z danymi mnożonych jest przez specjalnie dobraną macierz F(n+m)xn gdzie: Macierz F oparta na macierzy Vandermonde'a DEKODOWANIE odtworzenie niedostępnych elementów wektora dn gdzie Φ oznacza macierz F z usuniętymi wierszami odpowiadającymi brakującym węzłom 6
Algorytm wektoryzacji obliczeń c := [0,0,...,0] dla i=0,1,...,m-1 wykonaj { dla j=0,1,...,n-1 wykonaj { ci := ci f*i,j dj } } ci i-ty wektor sum kontrolnych o rozmiarze B bajtów dj j-ty wektor z danymi o rozmiarze B bajtów Operacja oznacza operację mnożenia dwóch wektorów (element po elemencie) realizowaną w arytmetyce ciała Galois (2w). Operacja oznacza sumowanie wektorów, również wykonywane element po elemencie, przy czym suma dwóch elementów wyznaczana jest jako wynik operacji XOR wykonywanej bit po bicie. 7
w Mnożenie w arytmetyce ciała Galois GF(2 ) W badaniach przyjęto wartość w = 8 8 2 n+m można obsłużyć w sumie do 256 węzłów danych i sum kontrolnych operacja mnożenia w arytmetyce ciała Galois GF(28) realizowana w sposób tablicowy: c=f*d => c = gfilog( gflog( f ) + gflog( d ) ) - gdzie gflog i gfilog oznacza odpowiednio logarytm i antylogarytm, zdefiniowany dla ciała Galois GF(28) - do reprezentacji dowolnego elementu ciała Galois GF(28) wystarczy słowo długości jednego bajta. 8
Architektura GT200 - Tesla C1060 GPU: NVIDIA Tesla C1060 30 multiprocesorów 240 rdzeni 4GB pamięci GDDR3 Compute Capability 1.3 CPU: AMD Phenom II X4 955 3.2 GHz 2048 KB cache L2 9
Struktura pamięci GPU 10
Odwzorowanie algorytmu implementującego kody Reeda-Solomona na procesory graficzne GPU c := [0,0,...,0] dla j=0,1,...,n-1 wykonaj { GPU kernel dtmp = gflog(dj) dla i=0,1,...,m-1 wykonaj { ci ^= gfilog( dtmp + gflog( fi,j ) ) } ci i-ty wektor sum kontrolnych o rozmiarze B bajtów dj j-ty wektor z danymi o rozmiarze B bajtów przyjmując przetwarzanie 1bajt/wątek należy uruchomić B wątków Bmax = 65535 * 512 = 33 553 920 } pojedynczy wątek GPU wykona: ci,thrid ^= gfilog( gflog( dj,thrid ) + gflog( fi,j )) gflog i gfilog - tablice logarytmów i antylogarytmów zdefiniowane dla GF(28) przechowywane w pamięci teksture memory lub constant memory 11
Odwzorowanie algorytmu implementującego kody Reeda-Solomona na procesory graficzne GPU Uzyskane wyniki Rozmiar Liczba pliku bloków [MB] 0,09 0,19 0,38 0,75 1,5 3 6 12 24 48 96 192 24 48 96 192 384 768 1536 3072 6144 12288 24576 49152 CPU+GPU CPU 0,392 0,584 0,819 0,949 1,297 1,428 1,387 1,324 1,365 1,366 1,366 1,368 0,122 0,121 0,121 0,121 0,120 0,120 0,118 0,116 0,114 0,109 0,107 0,107 Uzyskane przepustowości dla CPU oraz przy użyciu GPU jako akceleratora w zależności od rozmiaru przetwarzanych plików przepustowość 1,6 CPU+GPU 1,4 1,2 1 0,8 0,6 0,4 CPU 0,2 0 0,01 0,1 1 10 100 1000 rozmiar przetwarzanego pliku [MB] 12
Kody Cauchy Reeda-Solomona Zamiast macierzy Vandermonde'a wykorzystywana jest jedna z macierzy Cauchy o rozmiarze m x n Elementy ciała Galois GF(2w) zastąpione specjalnie dobranymi projekcjami, co pozwala na sprowadzenie operacji mnożenia w GF(2w) do operacji XOR lub AND wykonywanych bit po bicie. dowolny element ciała Galois GF(2w) reprezentowany przez binarną macierz o rozmiarze w x w bitów GF(23), n = 5, m=2 13
Implementacja algorytmu kodowania Cauchy Reeda-Solomona f binarna macierz Cauchy przechowywana w pamięci Constant lub Texture c wektor sum kontrolnych Global Memory d wektor z danymi wejściowymi - Global Memory - operacja XOR 14
Implementacja algorytmu kodowania Cauchy Reeda-Solomona Uzyskane wyniki (1) n=4, m=4, w=3 Rozmiar Liczba pliku bloków [MB] Macierz Cauchy gęsta Macierz Cauchy rzadka Przepustowość Przepustowość Kernel CPU+GPU CPU Kernel CPU+GPU CPU 0,09 4 0,166 0,132 0,114 0,164 0,131 0,116 0,19 8 0,321 0,253 0,312 0,247 0,38 16 0,585 0,423 0,048 0,589 0,423 0,048 0,75 32 0,841 0,615 0,048 0,819 0,605 0,049 1,5 64 1,129 0,890 0,048 1,133 0,909 0,048 3 128 1,455 1,254 0,046 1,456 1,239 6 256 1,500 1,380 1,497 1,373 12 512 2,039 1,913 2,060 1,933 24 1024 2,088 2,017 0,046 2,096 2,024 0,048 48 2048 2,133 2,092 2,129 2,088 0,046 96 4096 2,145 2,120 2,140 2,117 192 8192 2,148 2,133 0,044 2,147 2,131 0,046 384 16384 2,149 2,134 2,149 2,131 0,048 15
Implementacja algorytmu kodowania Cauchy Reeda-Solomona Uzyskane wyniki (2) n=8, m=4, w=4 Rozmiar Liczba pliku bloków [MB] Macierz Cauchy gęsta Macierz Cauchy rzadka Przepustowość Przepustowość Kernel CPU+GPU CPU Kernel CPU+GPU CPU 0,06 2 0,040 0,042 0,039 0,042 0,13 4 0,090 0,077 0,036 0,096 0,080 0,036 0,25 8 0,178 0,150 0,022 0,178 0,146 0,022 0,5 16 0,314 0,256 0,012 0,314 0,257 0,016 1 32 0,442 0,369 0,007 0,440 0,367 0,006 2 64 0,577 0,509 0,006 0,577 0,504 0,006 4 128 0,738 0,674 0,739 0,671 8 256 0,754 0,716 0,751 0,711 16 512 1,124 1,078 1,119 1,073 32 1024 1,131 1,105 1,143 1,116 64 2048 1,162 1,147 1,159 1,144 128 256 4096 8192 1,171 1,173 1,165 1,168 1,171 1,171 1,163 1,166 0,011 16
Architektura Cell/B.E. Architektura 1 procesor ogólnego przeznaczenia (PPE) 8 jednostek wektorowych (SPE) Wydajna magistrala komunikacyjna (EIB) Kontrolery DMA Kontroler dostępu do pamięci Kontroler wejścia wyjścia Wydajność Obliczenia zmiennoprzecinkowe pojedynczej precyzji: 204,8 GFLOPS Obliczenia na liczbach o podwójnej precyzji: 14,6 GFLOPS Przepustowość magistrali EIB: 204.8 GB/s 17
Odwzorowanie algorytmu kodowania Reeda-Solomona na architekturę Cell/B.E. Opracowana implementacja wykorzystuje wszystkie dostępne poziomy zrównoleglania oferowane przez procesor Cell: - dane rozdzielone pomiędzy 8 SPE - wektoryzacja obliczeń w obrębie pojedynczego SPE - pełniejsze wykorzystanie obu potoków 18
Odwzorowanie algorytmu kodowania Reeda-Solomona na architekturę Cell/B.E. Opcja kompilatora Wariant 1 Wariant 2 10 bloków 1 blok 10 bloków 1 blok Wariant 3 10 bloków 1 blok O1 223 2118 201 2078 214 2211 O2 215 1990 198 1710 215 1770 O3 215 1990 198 1710 215 1770 n=4, m=4 Tabela przedstawia liczbę cykli zegarowych (Lc) koniecznych do przetworzenia na pojedynczym rdzeniu SPE jednego (LB=1) oraz dziesięciu (LB=10) bloków danych o rozmiarach n x 16 B. Dla ośmiu rdzeni SPE maksymalna przepustowość wynosi: b8rs = (8 3.2 LB n 16)/LC = 9.58 Implementacja kodów Cauchy Reeda-Solomona pozwala na osiągnięcie maksymalnej przepustowości: CRS b8 = (8 3.2 LB n w 16)/LC Po podstawieniu zmierzonych wartości Lc otrzymano: b8,dcrs = 13.65 Otrzymane wyniki odpowiadają maksymalnej możliwej do uzyskania przepustowości, bez uwzględnienia strat wynikających z transferu danych do pamięci głównej. 19
Podsumowanie Uzyskane w trakcie badań wyniki potwierdziły możliwość praktycznego, efektywnego zastosowania procesorów graficznych oraz układów Cell/B.E. w systemach, gdzie do zwiększenia bezpieczeństwa danych wykorzystywane są kody nadmiarowe typu erasure codes. Wysoka wartość uzyskanych przepustowości przetwarzania oznacza, że w rzeczywistych warunkach przestaje ona ograniczać wydajność funkcjonowania systemu zarządzania danymi. Takim ogranicznikiem staje się wówczas np. przepustowość samej sieci rozległej WAN lub magistrali zewnętrznej procesora. 20
Dziękuję za uwagę. 21