XIV International PhD Workshop OWD 2012, 20 23 October 2012 NOWOCZESNE TECHNIKI WYKONYWANIA ZAAWANSOWANYCH OBLICZEŃ NUMERYCZNYCH MODERN ADVANCED COMPUTATIONAL METHOD Konrad Andrzej Markowski, Warsaw University of Technology Abstract In different areas of science appears more and more numerical problems which cannot be solved analytically by hand. In this paper a new computational method for solving numerical problem using GPGPU will be presented. The presented method is illustrated by numerical examples. Streszczenie W wielu obszarach nauki pojawia się coraz więcej złożonych problemów obliczeniowych, które możemy rozwiązać tylko i wyłącznie za pomocą odpowiednich metod numerycznych wykorzystując komputer. Głównym celem artykułu jest uporządkowanie wiedzy na temat nowoczesnych technik wykonywania zaawansowanych obliczeń numerycznych oraz pokazanie możliwości jakie one za sobą niosą. 1. Wprowadzenie W ostatnich dekadach rozwój technologiczny oraz informatyzacja wielu dziedzin życia doprowadziła do gromadzenia coraz większej liczby informacji. Dodatkowo pojawia się coraz więcej złożonych problemów, których nie sposób rozwiązać bez pomocy komputera. Czynniki te spowodowały dynamiczny rozwój różnorodnych technik wykonywania obliczeń numerycznych. Historycznie wszystko rozpoczęło się od pojedynczych komputerów odpowiednio oprogramowanych. Następnie komputery te połączono w klastry obliczeniowe. Obecnie od kilku lat najszybciej rozwijającymi się technikami obliczeniowymi są metody oparte o obliczenia na jednostkach graficznych GPU wyposażonych w szybkie procesory strumieniowe. Coraz bardzie popularne stają się rozwiązania dające możliwość wykorzystania jednostek CPU i GPU w postaci klastrów obliczeniowych. 2. Procesory CPU Wszystkie współczesne procesory mają podobną architekturę oparta na superskalarnym jądrze RISC. RISC-owa konstrukcja umożliwia stosowanie wysokich częstotliwości zegara. Ze względu na stosunkowo małą liczbę równoległych rdzeni pojedynczego procesora dedykowane algorytmy CPU są sekwencyjne. Oznacza to wykonywanie kolejnych instrukcji w porządku chronologicznym zgodnie z zapisaną sekwencją. Algorytmy pozwalające na równoległe obliczenia mogą być w pełni wykorzystane dopiero przez procesory wielordzeniowe lub systemy typu GRID. Główną miarą wydajności, stosowaną obecnie dla współczesnych systemów komputerowych, jest liczba wykonywanych w ciągu sekundy operacji na liczbach zmiennoprzecinkowych (FLOPS). Mierzy się ją za pomocą odpowiednich testów wzorcowych. Najpopularniejszym takim testem jest LINPACK, mierzący szybkość rozwiązywania gęstych układów równań liniowych za pomocą metody Gaussa. Ponieważ wiele problemów stawianych superkomputerom daje się sprowadzić do rozwiązywania takich równań, test ten jest wygodną abstrakcją pomiaru efektywności w rozwiązywaniu takich problemów. Inną miarą wydajności superkomputerów jest miara FLOPS/wat, uwzględniająca oprócz szybkości wykonywania obliczeń również zużycie prądu przez superkomputery. Więcej informacji na temat obliczeń za pomocą procesorów CPU można znaleźć w pozycji: [4]. 3. Procesory GPU Najnowsze układy CPU i GPU są układami wielordzeniowymi. Ideą przewodnią dla technologii obliczeń na GPU jest współpraca procesora centralnego (CPU) z układem GPU w ramach środowiska obliczeniowego o heterogenicznym modelu przetwarzania. Sekwencyjna część aplikacji 515
wykonywana jest przez układ CPU, zaś za złożone obliczeniowo fragmenty odpowiada układ GPU. Z punktu widzenia użytkownika aplikacja działa po prostu szybciej, ponieważ dzięki wykorzystaniu wysokowydajnego układu GPU wydajność przetwarzania wzrasta. Więcej informacji na temat obliczeń za pomocą procesorów GPU można znaleźć w pozycji [5]. 3.1 Jednostki nvidia Akceleratory z serii Tesla zostały wprowadzone na rynek jesienią 2006 r. Opierały się na zmodernizowanych układach graficznych 8800 GTX, a ich procesory GPGPU oznaczone były symbolem Tesla T8P. Najnowsze akceleratory obliczeniowe nvidii opierają się wyłącznie na układach GF100 zgodnych z architekturą Fermi. W sprzedaży dostępne są akceleratory obliczeniowe z wyjściem graficznym DVI, które przeznaczone są do budowy wysokowydajnych obliczeniowych stacji roboczych Tesla C2050 i Tesla C2070 (modele te różnią się wielkością wbudowanej pamięci odpowiednio 3 i 6 GB). Dzięki nim standardowy pecet dysponuje mocą obliczeniową zarezerwowaną do niedawna dla superkomputerów i klastrów obliczeniowych Akceleratory Tesla zgodne z architekturą Fermi cechują się wydajnością obliczeń zmiennoprzecinkowych o podwójnej precyzji na poziomie 515 GFLOPS (FLOPS FLoating point Operations Per Second, operacji zmiennoprzecinkowych na sekundę) i ok. 1 TFLOPS w trybie z pojedynczą precyzją. Dla porównania, moc obliczeniowa czterordzeniowego procesora Intel Core i7 965 XE to zaledwie 70 gigaflopów dla obliczeń zmiennoprzecinkowych o podwójnej precyzji i to mniej więcej przy porównywalnej wielkości układu graficznego i tradycyjnego czterordzeniowego procesora. Procesory Tesla [8] są na tyle szybkie i na tyle dobrze uzupełniają tradycyjne CPU, że coraz częściej wykorzystuje się je do budowy najszybszych na świecie superkomputerów. I tak, zajmujący obecnie na liście TOP 500 drugie miejsce (do niedawna był to najszybszy superkomputer na świecie), znajdujący się od 2010 roku w National Supercomputing Center in Tianjin w Chinach superkomputer Tianhe-1A zbudowany został na podstawie 7168 procesorów Nvidia Tesla M2050 oraz 14336 procesorów Intel Xeon X5670 2,93 GHz. Jego łączna moc obliczeniowa to 2,507 petaflopsa. 3.2 Jednostki AMD Podobną, ale znacznie mniej popularną konstrukcją jest przygotowana przez firmę AMD seria pecetowych kart akceleratorów graficznoobliczeniowych AMD FireStream, oparta na układach graficznych z serii Radeon HD. Pierwszym akceleratorem, jeszcze pod nazwą ATI FireStrem, czyli przed przejęciem firmy ATI prze AMD, był FireStream 580 oparty na układzie RV580 (Radeon X1900 XTX). Obecnie w sprzedaży dostępna jest już czwarta generacja akceleratorów AMD FireStream. Są to AMD FireStream 9350 i 9370, które opierają się na układzie graficznym Cypress (RV870) karty graficzne Radeon HD 5850 i HD 5870. Składają się one odpowiednio z 1440 i 1600 prostych procesorów strumieniowych. Ich moc obliczeniowa to 2016 i 403,2 GFLOPS przy obliczeniach zmiennoprzecinkowych pojedynczej i podwójnej precyzji dla AMD FireStream 9350 oraz odpowiednio 2640 i 528 GFLOPS dla modelu 9370. 4. Architektura CUDA i OpenCL 4.1 nvidia CUDA CUDA [1,2] to opracowana przez firmę Nvidia uniwersalna architektura procesorów wielordzeniowych (głównie kart graficznych) umożliwiająca wykorzystanie ich mocy obliczeniowej do rozwiązywania ogólnych problemów numerycznych w sposób wydajniejszy niż w tradycyjnych, sekwencyjnych procesorach ogólnego zastosowania. Integralną częścią architektury CUDA jest oparte na języku programowania C środowisko programistyczne wysokiego poziomu, w którego skład wchodzą m.in. specjalny kompilator, debugger, profiler oraz interfejs programowania aplikacji. Dostępne są również biblioteki, które można wykorzystać w językach Python, Fortran, Java, C# oraz Matlab. W przeciwieństwie do języka OpenCL, CUDA jest dostępna tylko dla kart graficznych produkowanych przez nvidia począwszy od serii GeForce 8 w tym Quadro oraz Tesla. 4.2 OpenCL OpenCL [3] to zbiór standardów pomagających w programowaniu na heterogeniczne platformy obliczeniowe. Definiuje on standardowy, abstrakcyjny model heterogenicznej platformy obliczeniowej i zależne od niego modele dla kodu źródłowego programu, wykonania i hierarchii pamięci. Kod źródłowy składa się z programu hosta, który używając API OpenCL, uruchamia na urządzeniach obliczeniowych kernele obliczeniowe. Takie podejście standaryzuje to, co producenci kart graficznych udostępniali przez swoje specyficzne narzędzia i języki programowania. Z jednej strony dzięki standaryzacji, a z drugiej odpowiednim sterownikom, program napisany w OpenCL powinien być przenośny nie tylko między kartami graficznymi różnych producentów, ale między urządzeniami obliczeniowymi różnych typów W standardzie tym specyficzne jest definiowanie jedno-, dwu-, lub trójwymiarowej przestrzeni indeksów pozwalających odróżniać poszczególne instancje 516
kernela. Jest to wielowymiarowy i konfigurowalny system identyfikacji wątków. Wielowymiarowe indeksy pozwalają numerować wątki w zależności od dziedziny problemu. Zatem w maksymalnej konfiguracji rozwiązanie ma następująca moc obliczeniową: 84 rdzenie jakie dają nam procesory CPU oraz 32 karty graficzne wyposażone w 14 336 rdzeni CUDA. 5. Oprogramowanie inżynierskie 5.1 Matlab Matlab [7] jest środowiskiem obliczeniowym przeznaczonym dla inżynierów i naukowców, umożliwiającym przeprowadzanie obliczeń matematycznych, analizy numerycznej, wizualizacji otrzymanych wyników w postaci dwu i trójwymiarowych wykresów funkcji, wizualizację wyników obliczeń w postaci rysunków statycznych i animacji, jak również tworzenie algorytmów i programów. Matlab wiąże analizę numeryczną, obliczenia macierzowe, przetwarzanie sygnałów i grafikę w sposób przyjazny dla użytkownika, gdzie zarówno zadania jak i rozwiązania są zapisane matematycznie bez uwzględnienia zasad tradycyjnego programowania. Wykorzystując porty, możliwe jest pobieranie danych pomiarowych z urządzenia zewnętrznego w celu ich obróbki i analizy. Wszystko to powoduje, że program ten znajduje bardzo szerokie zastosowanie. Matlab zawiera wiele narzędzi zgrupowanych w pakiety (ang. toolbox), ukierunkowane na konkretne obszary zastosowań, np. pakiet symulacji Simulink, biblioteki do modelowania układów sterowania, narzędzia projektowania systemów przetwarzania sygnałów i obrazów. Z punktu widzenia zaawansowanych obliczeń numerycznych szczególna uwagę należy zwrócić na następujące toolboxy: Parallel Computing Toolbox oraz Matlab Distributed Computing Server. Parallel Computing Toolbox [6] daje możliwość: wykorzystywania do obliczeń maksymalnie do ośmiu rdzeni procesora CPU oraz wykonywanie obliczeń bezpośrednio na procesorach GPU. Wykorzystując Matlab Distributed Computing Server możemy zarządzać maksymalnie ośmioma maszynami z zainstalowanym oprogramowaniem Matlab Parallel Computing Toolbox, który jest w stanie obsłużyć do ośmiu rdzeni CPU oraz cztery karty graficzne typu nvidia [8]. Przykładowo używając ośmiordzeniowego procesora CPU typu AMD FX-8150 oraz czterech kart graficznych typu Tesla C2075 dostajemy potężną moc obliczeniową. Używane komputery 5.2 Mathematica Pakiet Mathematica [9] podobnie jak Matlab jest unikalnym środowiskiem do realizacji obliczeń matematycznych jak również publikowania wyników. Program został stworzony do prowadzenia obliczeń symbolicznych. Podstawowe cechy programu Mathematica to: oszczędność czasu, różnorodność procedur obliczeniowych, prezentacje graficzne, symboliczne rozwiązywanie problemu, dokładność obliczeń numerycznych, wszechstronność środowiska, druk publikacji, elektroniczna wymiana dokumentacji W tym miejscu należy wspomnieć, iż zarówno Matlab jak i Mathematica wspierają możliwość wykonywania obliczeń na wielu rdzeniach w obrębie jednego procesora jak również obliczeń na kartach graficznych. 6. Przykład Niech będzie dany układ m równań z n niewiadomymi opisany w postaci macierzowej Ax=b. Układ ten możemy tak przekształcić aby wyznaczyć niewiadome x w następujący sposób x=a-1b. Obliczenia przeprowadzono w środowisku Matlab. Macierze A i b generowane były w sposób losowy. Do obliczeń wykorzystano trzy takie same komputer o parametrach określonych w Tabeli 1 wyposażone w kartę graficzną GeForce nvidia 560Ti, GeForce nvidia 680 oraz PNY TeslaC2075 o parametrach określonych w Tabeli 2. Obliczenia były przeprowadzane dla danych o pojedynczej precyzji. Badane były następujące rozmiary układu: 1024, 2048, 3072, 4096, 5120, 6144, 7168, 8192, 9216, 10240, 11264, 12288, 13312, 14336, 15360, 16384, 17408, 18432, 19456, 20480, 21504 oraz 22528. Celem badan było sprawdzenie wydajności obliczeń oraz sprawdzenie szybkości obliczeń. Na Rysunku 2 przedstawiono zestawienie uzyskanych wyników natomiast Rysunek 1a oraz Rysunek 1b prezentują odpowiednio wykresy badania wydajności obliczeń oraz badanie szybkości obliczeń. Computers Nazwa Serwer 1 Serwer 2 Serwer 3 Procesor HexaCore AMD Phenom II X6 1075T, 3524 MHz (17.5 x 201) Zainstalowana pamięć RAM Karta graficzna NVIDIA GeForce GTX 560 Ti (1024 MB) Kingston 4x4GB DDR3-1333 DDR3 SDRAM NVIDIA GeForce GTX 680 (2048 MB) Tab.1. PNY Tesla C2075, 6GB GDDR5 ECC, 448 rdzeni, 517
Nazwa Silnik GPU Pamięć Karty graficzne Graphic cards Parametr GTX 560 Tesla GTX 680 Ti C2075 CUDA Cores 384 1536 448 Częstotliwość taktowania rdzenia graficznego (MHz) 822MHZ 1006 MHz 1,15GHz Częstotliwość taktowania procesora (MHz) 1648 Brak danych Brak danych Częstotliwość taktowania pamięci (MHz) 4008 Brak danych 1,5GHz Standardowa konfiguracja pamięci 1024MB 2048MB 6GB Szerokość interfejsu pamięci 256 bit 256 bit 384 bit Przepustowość pamięci (GB/sec) 128,0 192,2 144 Tab.2. (a) (b) Rys.1. (a) Szybkość obliczeń układu równań (b) Badanie wydajności obliczeń 518
(a) (b) Rys. 2. Zestawienie uzyskanych wyników 519
Z przeprowadzonych badań można wyciągnąć następujące wnioski: Zakres obliczeń uzyskany na poszczególnych kartach graficznych (GTX 560Ti układ równań o rozmiarze 9216, GTX 680 układ równań o rozmiarze 13312 oraz tesla C2075 układ równań o rozmiarze 22528) zależy od ilości pamięci w jaką jest wyposażona karta graficzna. Karta Cuda C2075 mimo relatywnie małej liczby CUDA Cores (448) bardzo dobrze wypada w stosunku do karty GTX680 posiadającej aż 1536 CUDA Cores. Czasy obliczeń uzyskiwane na kartach graficznych zależą od: szybkości przesyłania danych na kartę graficzną oraz szybkości obliczeń. Te dwa czasy składają się na całkowity czas obliczeń wykonywanych za pomocą karty graficznej Szybkość przesyłania danych na kartę graficzną zależy od szybkości łącza PCIe x16. W związku z tym należy pamiętać, żeby kart graficznych umieszczać w gniazdach PCI-Express x16 wyposażonych w 16 linii transmisyjnych a nie w gniazda PCI-Express x16 pracujących w trybie x4 lub x1. Obliczeni na kartach graficznych GPU w stosunku do obliczeń na CPU dają bardzo dobre progresy czasowe przykładowo dla układu o rozmiarze 22528 na CPU uzyskujemy czas obliczeń równy prawie 82 sekundy a na jednostce graficznej uzyskujemy czas prawie 26 sekund co daje nam lepszy czas o 315%. 6. Podsumowanie Rozwój technologii kart graficznych doprowadził do momentu, w którym zaczęły być one wykorzystywane nie tylko do gier komputerowych ale również do rozwiązywania złożonych problemów numerycznych z różnych obszarów nauki. W artykule pokazano jak wiele możemy zyskać w obliczeniach stosując tego typu mechanizmy. Patrząc na problemy, które obecnie należą do grupy trudno rozwiązywanych analitycznie, można przypuszczać, iż technologia ta mogłaby pomóc szczególnie w tych obszarach. Z przeprowadzonych badań możemy śmiało powiedzieć iż, obliczenia na kartach graficznych warte są dokładniejszej uwadze (w obecnym okresie kiedy stawiamy na przetwarzanie coraz większej liczby danych i informacji) w aspekcie rozwiązywania złożonych problemów numerycznych oraz stanowią bardzo dużą konkurencję dla istniejących metod obliczeniowych Podziękowania Badanie zrealizowano dzięki stypendium naukowemu w ramach projektu pn. Technologie informacyjne: badania i ich interdyscyplinarne zastosowania współfinansowanego ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego, Program Operacyjny Kapitał Ludzki (Umowa nr UDA-POKL.04.01.01-00-051/10-00) Literatura 1. Farber R.: CUDA Application Design and Development, Elsevier, 2011 2. Sanders J., Kandrot E.: CUDA by Example, Addison-Wesley, 2011 3. Gaster B.: Heterogeneous Computing with OpenCL, Elsevier, 2011 4. Herlihy M., Shavit N.: The Art of Multiprocessor Programming, Elsevier, 2008 5. Sheppard A.: Programming GPUs, O'Reilly Media, 2012 6. Attaway S.: Matlab, Second Edition: A Practical Introduction to Programming and Problem Solving, Butterworth-Heinemann, 2011 7. http://www.mathworks.com Dokumentacja oprogramowania Matlab. 8. http://www.nvidia.com Strona producenta kart graficznych. 9. http://www.wolfram.com/ - Dokumentacja oprogramowania Mathematica Adres służbowy Autora: dr inż. Konrad Andrzej MARKOWSKI Politechnika Warszawska, Wydział Elektryczny, ISEP ul. Koszykowa 75 00-662 Warszawa tel. (022) 234 56 25 fax (022) 625 62 78 email: Konrad.Markowski@ee.pw.edu.pl 520