XIII International PhD Workshop OWD 2011, October 2011 REALIZACJA OBLICZEŃ W ARCHITEKTURZE MASOWO RÓWNOLEGŁEJ W HETEROGENICZNYCH SYSTEMACH

Podobne dokumenty
Porównanie wydajności CUDA i OpenCL na przykładzie równoległego algorytmu wyznaczania wartości funkcji celu dla problemu gniazdowego

i3: internet - infrastruktury - innowacje

Programowanie procesorów graficznych GPGPU

Przetwarzanie Równoległe i Rozproszone

CUDA. cudniejsze przyk ady

Podsystem graficzny. W skład podsystemu graficznego wchodzą: karta graficzna monitor

Programowanie procesorów graficznych GPGPU. Krzysztof Banaś Obliczenia równoległe 1

Tesla. Architektura Fermi

Programowanie z wykorzystaniem technologii CUDA i OpenCL Wykład 1

Skalowalność obliczeń równoległych. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

Budowa komputera. Magistrala. Procesor Pamięć Układy I/O

Moc płynąca z kart graficznych

PROGRAMOWANIE WSPÓŁCZESNYCH ARCHITEKTUR KOMPUTEROWYCH DR INŻ. KRZYSZTOF ROJEK

Nowoczesne technologie przetwarzania informacji

Programowanie procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1

Algorytmy i Struktury Danych

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

Wykorzystanie architektury Intel MIC w obliczeniach typu stencil

Analiza ilościowa w przetwarzaniu równoległym

Programowanie równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

Architektura komputerów

Raport Hurtownie Danych

Budowa komputera. Magistrala. Procesor Pamięć Układy I/O

Metody optymalizacji soft-procesorów NIOS

Sprzęt komputerowy 2. Autor prezentacji: 1 prof. dr hab. Maria Hilczer

Analiza efektywności przetwarzania współbieżnego. Wykład: Przetwarzanie Równoległe Politechnika Poznańska Rafał Walkowiak Grudzień 2015

WIDMOWA I FALKOWA ANALIZA PRĄDU SILNIKA LSPMSM Z WYKORZYSTANIEM OPENCL

Numeryczna algebra liniowa

Sprzęt komputerowy 2. Autor prezentacji: 1 prof. dr hab. Maria Hilczer

Analiza efektywności przetwarzania współbieżnego

Literatura. 11/16/2016 Przetwarzanie równoległe - wstęp 1

Architektura Systemów Komputerowych. Rozwój architektury komputerów klasy PC

Obliczenia Wysokiej Wydajności

10/14/2013 Przetwarzanie równoległe - wstęp 1. Zakres przedmiotu

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1

Systemy na Chipie. Robert Czerwiński

PROGRAMOWANIE WSPÓŁCZESNYCH ARCHITEKTUR KOMPUTEROWYCH DR INŻ. KRZYSZTOF ROJEK

Wysokowydajna implementacja kodów nadmiarowych typu "erasure codes" z wykorzystaniem architektur wielordzeniowych

Podstawy Informatyki Systemy sterowane przepływem argumentów

Architektury komputerów Architektury i wydajność. Tomasz Dziubich

Nowinki technologiczne procesorów

Literatura. 3/26/2018 Przetwarzanie równoległe - wstęp 1

CUDA Median Filter filtr medianowy wykorzystujący bibliotekę CUDA sprawozdanie z projektu

Systemy wbudowane. Uproszczone metody kosyntezy. Wykład 11: Metody kosyntezy systemów wbudowanych

PRZEWODNIK PO PRZEDMIOCIE

Programowanie aplikacji równoległych i rozproszonych

JCuda Czy Java i CUDA mogą się polubić? Konrad Szałkowski

Praca dyplomowa magisterska

Projektowanie algorytmów równoległych. Zbigniew Koza Wrocław 2012

CZYM JEST KARTA GRAFICZNA.

Wydajność obliczeń równoległych. Krzysztof Banaś Obliczenia Wysokiej Wydajności 1

Obliczenia Wysokiej Wydajności

Akademia Górniczo-Hutnicza im. Stanisława Staszica w Krakowie. dr inż. Adam Piórkowski. Jakub Osiadacz Marcin Wróbel

INŻYNIERIA OPROGRAMOWANIA

Programowanie współbieżne Wykład 2. Iwona Kochańska

Redukcja czasu wykonania algorytmu Cannego dzięki zastosowaniu połączenia OpenMP z technologią NVIDIA CUDA

Procesory wielordzeniowe (multiprocessor on a chip) Krzysztof Banaś, Obliczenia wysokiej wydajności.

Programowanie w modelu równoległości danych oraz dzielonej globalnej pamięci wspólnej. Krzysztof Banaś Obliczenia równoległe 1

Nowinki technologiczne procesorów

Implementacja sieci neuronowych na karcie graficznej. Waldemar Pawlaszek

Programowanie Współbieżne

Architektura komputerów

Programowanie kart graficznych

Obliczenia równoległe na klastrze opartym na procesorze CELL/B.E.

Wstęp do obliczeń równoległych na GPU

Programowanie kart graficznych

Budowa i użytkowanie klastrów w opaciu o układy Cell BE oraz GPU

Programowanie procesorów graficznych GPGPU. Krzysztof Banaś Obliczenia równoległe 1

Przykładem jest komputer z procesorem 4 rdzeniowym dostępny w laboratorium W skład projektu wchodzi:

Zastosowanie technologii nvidia CUDA do zrównoleglenia algorytmu genetycznego dla problemu komiwojażera

Zadania badawcze prowadzone przez Zakład Technik Programowania:

ZASTOSOWANIE SZTUCZNYCH SIECI NEURONOWYCH ORAZ ARCHITEKTURY OPENCL W SPEKTRALNEJ I FALKOWEJ ANALIZIE PRĄDU SILNIKA LSPMSM

Nowinkach technologicznych procesorów

Komputerowe wspomaganie eksperymentu 5

SPOSOBY POMIARU KĄTÓW W PROGRAMIE AutoCAD

Programowanie niskopoziomowe. dr inż. Paweł Pełczyński

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

CUDA część 1. platforma GPGPU w obliczeniach naukowych. Maciej Matyka

USŁUGI HIGH PERFORMANCE COMPUTING (HPC) DLA FIRM. Juliusz Pukacki,PCSS

Systemy operacyjne i sieci komputerowe Szymon Wilk Superkomputery 1

Automatyzacja procesu tworzenia sprzętowego narzędzia służącego do rozwiązywania zagadnienia logarytmu dyskretnego na krzywych eliptycznych

Podstawy OpenCL część 2

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Organizacja pamięci w procesorach graficznych

16. Taksonomia Flynn'a.

Adam Korzeniewski - p. 732 dr inż. Grzegorz Szwoch - p. 732 dr inż.

Obliczenia równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

Spis treści. I. Skuteczne. Od autora... Obliczenia inżynierskie i naukowe... Ostrzeżenia...XVII

Architektura komputerów

PROBLEMATYKA OBLICZEŃ MASOWYCH W NAUKACH O ZIEMI. Satelitarny monitoring środowiska

Libra.cs.put.poznan.pl/mailman/listinfo/skisrkolo.

Wybrane metodologie wspierające sprzętową akcelerację obliczeń wielkiej skali

Procesory wielordzeniowe (multiprocessor on a chip) Krzysztof Banaś, Obliczenia wysokiej wydajności.

8. MAGISTRALE I GNIAZDA ROZSZERZEŃ. INTERFEJSY ZEWNĘTRZNE.

Automatyka i Robotyka studia stacjonarne drugiego stopnia

Klaster obliczeniowy

Pojęcie bazy danych. Funkcje i możliwości.

Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa

Wydajność systemów a organizacja pamięci. Krzysztof Banaś, Obliczenia wysokiej wydajności. 1

Transkrypt:

XIII International PhD Workshop OWD 2011, 22 25 October 2011 REALIZACJA OBLICZEŃ W ARCHITEKTURZE MASOWO RÓWNOLEGŁEJ W HETEROGENICZNYCH SYSTEMACH CALCULATIONS IN THE MASSIVELY PARALLEL ARCHITECTURE IN HETEROGENEOUS SYSTEMS Tomasz Przybyła, Opole University of Technology Abstract This paper presents the possibility of the OpenCL standard and massively parallel architecture. OpenCL is a cross-vendor standard that holds tremendous potential to exploit the massiveparallelism of modern processors, embedded devices and graphics processors (GPUs). Implementation of parallel computing in OpenCL starts from defining the problem in the N- dimensional space. In the case of the linear array of data, the problem can be represented in onedimensional space, whereas the images will use the two-dimensional space and the spatial representations of data, such as 3D objects, with use the three-dimensional space. Each independent component in the index space is called a work-item. Each work-item performs the same program kernel, but for different data. OpenCL allows the grouping of work-items in the work-groups. All work-items belonging to the work-group are executed in a single device, giving it the ability to share local memory, and synchronization. To examine the potential of optimization methods on the execution time of the algorithm, a program is written for multiplication of two square matrices. The calculation was carried out on the NVidia GeForce GT540M. Details of the systems are shown in Tab 1. The measurements clearly indicate that workgroup size has a significant impact on the execution time of the algorithm (Fig. 3). To effectively use the GPGPU performance computing systems the size of the work-group should be adapted to the specifications of your task. Performance results show that OpenCL has good potential to be used to implement high performance computing so long as architectural specifics are taken into account in the algorithm design. 30 Streszczenie W artykule przedstawiono sposób realizacji obliczeń w architekturze masowo równoległej układów grafiki. Krótko omówiono dostępne technologie pozwalające programować układy GPU tak, aby mogły realizować obliczenia ogólnego przeznaczenia. Spośród dostępnych technologii wybrano OpenCL i dokonano jego charakterystyki. Wskazano na istotne aspekty związane z programowaniem układów GPU przy wykorzystaniu języka OpenCL. Obliczenia przeprowadzono na karcie NVIDIA GeForce GT540M. Uzyskane wyniki pozwoliły dokonać weryfikacji możliwości układów GPU o architekturze masowo równoległej. 1. Wstęp Dynamiczny rozwój układów GPU (ang. Graphics Processing Unit), który rozpoczął się kilka lat temu, stał się odpowiedzią na ogromne i stale rosnące zapotrzebowanie na moc obliczeniową. Układy niegdyś odpowiedzialne jedynie za generowanie obrazu, stały się w pełni programowalnymi, wielordzeniowymi jednostkami o architekturze masowo równoległej, których wydajność obliczeniowa w znacznym stopniu przewyższa wydajność obecnie produkowanych procesorów CPU (ang. Central Processing Unit) i może być wykorzystana do realizacji obliczeń ogólnego przeznaczenia [1,2]. Układy GPU zdolne do tego typu obliczeń określane są mianem GPGPU (ang. General-Purpose Computing on Graphics Processing Units) [2]. Ogromny potencjał układów o architekturze masowo równoległej wymaga odpowiedniego interfejsu programistycznego, pozwalającego w prosty i szybki sposób przeprowadzić obliczenia. Pierwszą z firm, która umożliwiła wykorzystanie układów GPU do obliczeń ogólnego przeznaczenia,

była NVIDIA, udostępniając platformę CUDA (ang. Compute Unified Device Architecture)[2]. Dzięki dobrej kampanii reklamowej, produkt NVIDII jest obecnie najczęściej wykorzystywanym narzędziem do programowania GPGPU. Konkurencyjnymi rozwiązaniami, co do idei nie odbiegającymi od technologii CUDA, są: AMD Stream, Microsoft DirectCompute oraz OpenCL [2]. Wszystkie z nich, poza ostatnim, posiadają pewne ograniczenia, wynikające z przywiązania do platformy sprzętowej (Stream, CUDA) lub programowej (DirectCompute), co w znaczący sposób ogranicza heterogeniczność systemów w jakich dana technologia może zostać wykorzystana. Tego ograniczenia pozbawiony jest OpenCL, który powstał właśnie z myślą, aby zunifikować przetwarzanie równoległe w heterogenicznych systemach [1, 4, 5]. 2. Charakterystyka OpenCL OpenCL jest otwartym standardem programowania równoległego dla heterogenicznych systemów [1]. Jego rozwojem zajmuje się konsorcjum Khronos, zrzeszające już ponad sto firm. Wśród nich znaleźli się najwięksi producenci kart graficznych i procesorów m.in. AMD, Intel, NVIDIA [2]. Każda z tych firm oferuje dostęp do API standardu. OpenCL umożliwia wykorzystanie wszystkich dostępnych urządzeń obliczeniowych w danym systemie. Obliczenia mogą być realizowane na wielordzeniowych procesorach CPU, układach GPU (które dodatkowo mogą występować w konfiguracji SLI lub CrossFire) lub na innych jednostkach specjalnych nazywanych akceleratorami np. procesorach sygnałowych DSP (ang. Digital Signal Processing), CELL lub układach FPGA (ang. Field Programmable Gate Array) [4, 5, 7]. OpenCL jako standard zorientowany na wysoką wydajność obliczeniową (HPC ang. Highperformance computing) daje możliwość kontroli nad każdym, istotnym aspektem, związanym ze sposobem realizacji obliczeń [1]. Obsługuje zarówno zrównoleglanie funkcjonalne (zrównoleglanie zadań) jak i zrównoleglanie danych [1, 2, 3]. Obecnie architektura masowo równoległa, produkowanych układów GPU, pozwala uzyskać najwyższą wydajność przy wykorzystaniu metody zrównoleglania danych. Język programowania OpenCL bazuje na specyfikacji C99 [1, 4]. Dodano obsługę typów wektorowych, operacji wektorowych oraz funkcji atomowych na liczbach stało i zmiennoprzecinkowych. Zagwarantowano precyzję numeryczną dla operacji zmiennoprzecinkowych w celu zapewnienia spójności danych. 2.1 Model platformy Model platformy OpenCL przedstawiono na rys. 1. Model składa się z hosta dowolnego komputera z zainstalowanym systemem operacyjnym połączonego z jednym lub wieloma urządzeniami OpenCL [1]. Urządzenie obliczeniowe zawiera jedną lub wiele jednostek obliczeniowych. Każda z jednostek posiada jeden lub więcej elementów przetwarzających [4]. Host Urządzenie obliczeniowe obliczeniowa Rys.1. Model platformy OpenCL Fig.1. OpenCL platform model Element przetwarzający obliczeniowa realizuje jeden program na dużym zbiorze danych, przy czym każdy element przetwarzający w danej jednostce wykonuje obliczenia dla różnych danych należących do zbioru. Przykładem takiego modelu przetwarzania danych może być realizacja algorytmu, w którym każdy piksel obrazu wejściowego poddany jest tej samej operacji. W takim przypadku, każdy z punktów obrazu traktowany jest jako odrębny element, dlatego otrzymane rezultaty są od siebie niezależne i nie wpływają na dalsza pracę algorytmu przetwarzania. 2.2 Model realizacji Program napisany w OpenCL składa się z dwóch elementów: kodu kernela oraz kodu hosta [4]. Kernel jest funkcją realizującą obliczenia na jednym lub wielu zarządzeniach OpenCL, natomiast program hosta, pisany w C lub C++, wykonywany jest w systemie hosta i odpowiedzialny jest za tworzenie kontekstu obliczeniowego, kolejki poleceń oraz za wymianę danych między hostem a urządzeniem obliczeniowym. Każda instancja kernela wykonywana w jednostce obliczeniowej nosi nazwę jednostki roboczej (ang. work-item). Wszystkie jednostki robocze należą do N-wymiarowej przestrzeni, definiowanej przez specyfikę danego problemu [1]. Przetwarzając liniowy układ danych, można wykorzystać jednowymiarową przestrzeń zawierającą instancje kernela. W przypadku obrazów, najlepiej zdefiniować dwuwymiarową przestrzeń, natomiast dla przestrzennej reprezentacji danych, należy wykorzystać przestrzeń trójwymiarową. Liczba 31

jednostek roboczych w przestrzeni określana jest przez parametr global_work_size. Przestrzeń globalna może być podzielona na lokalne obszary zwane grupami roboczymi (ang. work-groups). Każda jednostka należąca do danej grupy roboczej może korzystać ze współdzielonej pamięci globalnej oraz lokalnej [1, 2 4]. Podziału można dokonać w sposób bezpośredni lub pośredni. Wybór metody bezpośredniej pozwala programiście określić liczbę jednostek roboczych wchodzących w skład grupy, natomiast metoda pośrednia pozostawia grupowanie jednostek roboczych w gestii OpenCL. Odpowiednie ustawienie parametru local_work_size, wskazuje na wybraną metodę. Każda z grup pracuje w obrębie jednej jednostki obliczeniowej. Nie dopuszczalny jest podział jednej grupy roboczej na dwie jednostki obliczeniowe. Synchronizacja pomiędzy jednostkami roboczymi możliwa jest tylko i wyłącznie w ramach jednej grupy roboczej. Maksymalny, obsługiwany rozmiar grupy ograniczony jest przez urządzenie realizujące obliczenia. Obecnie najnowsze, produkowane procesory oraz karty graficzne zdolne są do obsługi grup roboczych zawierających 1024 jednostki robocze. Każda jednostka obliczeniowa w urządzeniu OpenCL (CPU, GPU) zawiera procesy jednostek roboczych (instancje kernela) wykonywane równolegle. Układ GPU dysponujący 32 jednostkami obliczeniowymi, może jednocześnie realizować 32 instancje kernela. W praktyce, dzięki multipleksacji, procesory graficzne umożliwiają jednoczesne przetworzenie znacznie większej liczby instancji kernela, niż wynikałoby to z ich architektury. Jedynym wymogiem, stawianym przez OpenCL jest to, aby każda grupa wykonywana była na fizycznie jednej jednostce obliczeniowej, co daje możliwość synchronizacji pomiędzy jednostkami roboczymi. 2.3 Model pamięci OpenCL definiuje cztery obszar pamięci: prywatny, lokalny, globalny i stały [1, 4]. dedykowana jest jednostkom roboczym, przy czym każda jednostka ma własną pamięć prywatną i jej zawartość nie jest dostępna dla innych jednostek roboczych. Jednostki robocze należące do tej samej grupy roboczej mogą korzystać z pamięci lokalnej [1]. globalna dostępna jest dla hosta oraz wszystkich jednostek roboczych. Pewnym obszarem pamięci globalnej jest pamięć stała, tylko do odczytu. Ten obszar pamięci, alokowana przez hosta, nie zmienia się w czasie realizacji kernela [4]. Na rys. 2 przedstawiono model pamięci standardu OpenCL. globalna Urządzenie OpenCL ~5GB/s Host obliczeniowa ~150GB/s lokalna hosta Rys.2. Model pamięci OpenCL Fig.2. OpenCL memory model lokalna W przypadku, gdy jednostka chce uzyskać dostęp do pamięci, staje się nieaktywna do momentu zakończenia procedury obsługi pamięci. W tym samym czasie pozostałe jednostki robocze, należące do jednostki obliczeniowej, są aktywne, zapewniając ciągłość realizacji zadania, co znacznie przyspiesza obliczenia. Komunikacja miedzy hostem a urządzeniem obliczeniowym (GPU) odbywa się za pośrednictwem magistrali PCIe (ang. Peripheral Component Interconnect Express). Obecnie większość produkowanych kart graficznych wykorzystuje PCIe 2.0 x16, co pozwala na przesyłanie danych z prędkością 8 GB/s w każdą stronę. Trzecia generacja PCIe pozwala na transfer danych z dwukrotnie większą prędkością, a więc 16 GB/s, co tylko w niewielkim stopniu przyspiesza operację kopiowaniem danych z/do hosta. 3. Obliczenia w architekturze masowo równoległej W większości aplikacji OpenCL obowiązuje ten sam schemat realizacji; określenie platformy, wybór urządzenia bądź urządzeń do utworzenia kontekstu, alokacja pamięci, utworzenie kolejki poleceń, transfer danych oraz realizacja obliczeń. Z racji tego, że w systemie mogą być zainstalowane różne implementacje standardu OpenCL, należy wybrać platformę docelową, na której realizowane będą obliczenia [6, 7]. Można tego dokonać, wskazując numer danej platformy z listy dostępnych platform, zwracanej przez funkcję clgetplatformid. Mimo, że OpenCL został stworzony w celu unifikacji obliczeń równoległych w heterogenicznych systemach, to jednak poszczególne implementacje, udostępnione przez AMD, Intel oraz NVIDIA, ograniczają się jedynie do obsługi oferowanych przez nie urządzeń [9]. Wybór konkretnej platformy ściśle determinuje producenta 32 ~1000GB/s

oraz liczbę obsługiwanych urządzeń obliczeniowych. Jedynie specyfikacja OpenCL, udostępniona przez Apple na systemach MacOS pozwala realizować procedury obliczeniowe na układzie GPU (AMD lub NVIDIA) oraz na procesorach firmy Intel. Efektywne wykorzystanie architektury masowo równoległej wymaga od programistów innego podejścia w projektowaniu aplikacji, niż ma to miejsce w programowaniu sekwencyjnym. Wykorzystując standard OpenCL do obliczeń równoległych, niezwykle ważnym aspektem jest uwzględnienie właściwości charakterystycznych architektury urządzenia obliczeniowego. Pozwoli to dostosować procedurę obliczeniową tak, aby optymalnie wykorzystać potencjał układu. W przypadku architektury masowo równoległej równie istotna jest odpowiednia dekompozycja problemu, rozbicie na podproblemy o grubej ziarnistości wykonywane niezależnie od siebie. 3.1 Prawo Amdahla Klasyfikując efektywność układów wykorzystujących przetwarzanie równoległe zdefiniowano współczynnik przyspieszenia. Do wyznaczenia przyspieszenia algorytmu równoległego, niezbędna jest wiedza na temat udziału części sekwencyjnej w danym algorytmie. Algorytm sekwencyjny poddany zrównolegleniu, będzie składał się z części podlegającej zrównolegleniu oraz z części niepodzielnej, determinującej współczynnik przyspieszenia. Wartość przyspieszenia S wyrażona jest jako stosunek wykonania zadania najlepszym algorytmem sekwencyjnym na pojedynczym procesorze do czasu realizacji tego samego zadania na N procesorach [3] i opisana jest wzorem (1). T(1) S ( n) = (1) T( n) Łatwo zauważyć, że wraz ze wzrostem liczby procesorów n, wartość przyspieszenia będzie dążyła do pożądanej wartości n. Przyspieszenie, w którym S(n) n, nazywamy idealnym. Przyjmując parametr k, wyrażający udział części sekwencyjnej, przyspieszenie można wyrazić wzorem (2). 1 S( n) = 1 k (2) k + n Zależność (2) opisuje prawo Amdahla, mówiące o tym, że przyspieszenie jest funkcja liczby procesorów oraz udziału części nie podlegającej zrównolegleniu [3]. Warto zauważyć, że prawo Amdahla w zasadniczy stopniu opiera się na istnieniu fragmentów sekwencyjnych w algorytmie, pomijając aspekty związane z wymiana danych, komunikacją czy równoważeniem obciążenia jednostek obliczeniowych. Czas wykonania części sekwencyjnej w większości przypadków jest stały i wynosi kt(1), natomiast czas realizacji części podlegającej zrównolegleniu w głównej mierze uzależniony jest od rozmiar zadania. Czas niezbędny do uzyskania wyników obliczeń niejednokrotnie determinuje sens obliczeń komputerowych. To stwierdzenie znajduje odzwierciedlenie m.in. w symulacjach procesów z czasoprzestrzenną dynamiką, w których jedynym rozsądnym rozwiązaniem jest wykorzystanie architektury masowo równoległej. 3.2 Realizacja obliczeń Współcześnie produkowane karty graficzne o architekturze masowo równoległej pozwalają przeprowadzać obliczenia ogólnego przeznaczenia. W celu weryfikacji możliwości tej architektury, napisano program, którego zadaniem jest wykonanie prostej operacji mnożenia macierzy. Algorytm powstał z wykorzystaniem standardu OpenCL. Procedurę obliczeniową modyfikowano, implementując w niej wybrane techniki optymalizacji, dostępne w OpenCL. Realizację obliczeń na procesorze CPU przeprowadzono wykorzystując platformy Intel OpenCL 1.1, a na układzie GPGPU - OpenCL 1.0 CUDA 4.0.1. W tab. 1 zamieszczono szczegółowe dane dotyczące urządzeń obliczeniowych. Szczegółowe dane urządzeń obliczeniowych Nazwa urządzenia Nazwa platformy Liczba jednostek obliczeniowych Liczba elementów przetwarzających Częstotliwość procesora Details of computing devices Host Intel Core i7-2630qm Intel(R) OpenCL 1.1 Tab.1. GPGPU NVIDIA GT 540M OpenCL 1.0 CUDA 4.0.1 8 2 8 96 2000 MHz 1600 MHz Operację mnożenia macierzy zrealizowano na układzie GPU oraz CPU, dla różnych rozmiarów macierzy. W tab. 2 zawarto wyniki uzyskanych czasów realizacji algorytmu (w ms). Tab.2. Czas realizacji algorytmu na procesorze CPU i układzie GPU Execution time of the algorithm on the CPU and GPU Rozmiar CPU GPU Przyspieszenie macierzy 512x512 52,6 21,6 2,43 1024x1024 630,8 182,2 3,46 4096x4096 65845,6 13938,1 4,72 33

Mimo, że wykorzystano do obliczeń układ GPU o stosunkowo niewielkiej wydajności, to jednak można zaobserwować przyspieszenie w realizacji algorytmu. Wraz ze wzrostem liczby danych do przetworzenia, przewaga GPU nad CPU staje się wyraźniejsza. Zaimplementowany algorytm mnożenia macierzy opisano na dwuwymiarowej przestrzeni indeksów w taki sposób, że każda jednostka odpowiedzialna była za obliczenie jednego elementu macierzy wyjściowej C. Dodatkowo jednostki umieszczano w grupach o różnych rozmiarach. Wszystkie dane umieszczono w pamięci globalnej. Na rys 3. przedstawiono czas realizacji algorytmu dla różnych rozmiarów grup roboczych. 8000 7206 7000 6000 2897,3 5000 4000 3000 1810 2000 966 1270 1000 468 0 Auto 2x2 4x4 8x8 16x16 32x32 Rozmiar grupy Czas realizacji [ms] Rys.3. Czas realizacji algorytmu mnożenia macierzy (1024x1024) dla różnych rozmiarach grup roboczych Fig.3. Execution time of the matrix multiplication algorithm (1024x1024) for different sizes of workgroups Uzyskane wyniki obrazują jak istotne jest właściwe grupowanie jednostek roboczych. Mimo, że OpenCL może sam zarządzać grupowaniem jednostek (Auto), to jednak lepsze rezultaty otrzymano dla grup tworzonych samodzielnie. Optymalne rozmiary grup uzależnione są od specyfiki realizowanych obliczeń, dlatego właściwy ich dobór powinien wynikać z przeprowadzonych testów. Grupując jednostki należy pamiętać, aby każdy wymiar N globalnej przestrzeni indeksów był podzielny przez rozmiar lokalnej przestrzeni (grupy roboczej) i nie przekraczał maksymalnej, obsługiwanej przez urządzenie obliczeniowe wartości. Ponieważ procedura obliczeniowa (kernel) nie ma bezpośredniego dostępu do pamięci hosta, dane niezbędne do realizacji obliczeń muszą zostać przesłane do bufora w pamięci urządzenia [8, 9]. Po wykonaniu obliczeń, uzyskane dane należy przesłać do pamięci hosta, który nie ma bezpośredniego dostępu do pamięci urządzenia. Wykonanie tych operacji znacznie wydłuża czas realizacji zadania przez układ GPU, dlatego należy możliwie jak najdłużej przechowywać dane w pamięci urządzenia i wykonywać na nich wszystkie niezbędne operacje. Algorytm zmieniono tak, aby każda jednostka wykonywała obliczenia dla całego wiersza macierzy C. Sposób podziału macierzy na bloki pośrednie zamieszczono na rys. 4. 1024 1024 1024 512 Rys.4. Podziała macierzy na bloki Fig.4. The division of the matrix into blocks 128 32 Wyniki uzyskanych pomiarów przedstawiono na rys. 5. Czas realizacji [ms] 6000 5000 4000 3000 2000 1000 0 3694 2812 2686 2964 3003 Rozmiar grupy pośredniej 5602 Rys.5. Czas realizacji algorytmu dla różnych rozmiarów grup pośrednich Fig.5. Execution time of the algorithm for different sizes of mediate groups Z racji tego, że urządzenie wykorzystane do realizacji obliczeń wyposażone było tylko w dwie niezależne jednostki obliczeniowe, ustawienie rozmiaru grupy na 1024 spowodowało, że druga jednostka była niewykorzystana. Rezultatem tego, jest ponad dwukrotnie dłuższy czas obliczeń. Wprowadzając kolejną zmianę w procedurze obliczeniowe, wykorzystano fakt, że przy wyznaczaniu kolejnych elementów macierzy wyjściowej C, używany jest ten sam wiersz macierzy A. Zatem do przechowywania danego wiersza macierzy A użyto pamięci prywatnej, a ponieważ każda jednostka w grupie korzysta z tej samej kolumny macierzy B, to umieszczono ją w pamięci lokalnej, która jest o rząd wielkości szybsza od pamięci globalnej. Powinno to zaowocować znacznym przyspieszeniem realizacji zadania. Zestawienie czasów wykonania procedury obliczeniowej dla wszystkich przedstawionych metod zamieszczono na rys. 6. 34

Czas realizacji [ms] 3500 3000 2500 2000 1500 1000 500 0 2897,3 2686 468 496 182 Jak wykazały przeprowadzone badania, tylko umiejętne wykorzystanie języka OpenCL oraz dobra znajomość architektury urządzeń obliczeniowych może dać wymierne korzyści. Dynamiczny rozwój układów GPU oraz standardów takich jak OpenCL, pozwala stwierdzić, że realizacja obliczeń inżynieryjnych skłania się w stronę obliczeń wykonywanych w architekturze masowo równoległej. Wersja procedury obliczeniowej Rys.6. Czas realizacji algorytmu Fig.6. Execution time of the algorithm Zastosowanie wszystkich, omówionych technik optymalizacji, pozwoliło skrócić czas realizacji algorytmu do zaledwie 182 ms. 4. Podsumowanie Standard OpenCL definiując abstrakcyjny model heterogenicznej platform obliczeniowej, udostępnił ciekawą alternatywę wobec istniejących, konkurencyjnych rozwiązań pozwalających programować układy GPU o architekturze masowo równoległej. W obliczeniach nastawionych na wysoka wydajność, zasadniczą rolę odgrywa optymalizacja kodu. W przypadku OpenCL, który pozwala na realizację obliczeń w heterogenicznych systemach, optymalizacja przewidziana dla konkretnej architektury, tylko w jej obrębie przyniesie najwięcej korzyści. Wykorzystując układu GPU do obliczeń ogólnego przeznaczenia, należy do minimum ograniczyć wymianę danych pomiędzy hostem a urządzeniem obliczeniowym. Spowodowane jest to tym, że hosta nie ma bezpośredniego dostępu do pamięci urządzenia i odwrotnie, wiec cała wymiana danych odbywa się przez stosunkowo wolną magistralę PCIe. Konsekwencją tego, w przypadku obliczeń o małej złożoności na niewielkiej liczbie danych, może być sytuacja, w której operacja przesyłania danych z /do hosta będzie wykonywana dłużej niż realizacja procedury obliczeniowej. Kolejnym elementem, którego wykorzystanie znacząco przyspiesza obliczenia, jest pamięć lokalna. Niestety implementacja jej obsługi wiąże się z koniecznością wprowadzenia znacznych zmian w procedurze obliczeniowej. Przeprowadzone badania wykazały również, że właściwy dobór parametrów global_work_size oraz local_work_size rzutuje bezpośrednio na czas realizacji zadania (rys. 3). O ile pierwszy z parametrów wynika poniekąd z natury danego problemu, o tyle drugi powinien być dobrany optymalnie do specyfiki realizowanego zadania oraz urządzenia obliczeniowego. 35 Literatura 1. AMD: AMD Accelerated Parallel Processing Programming Guide, Advanced Micro Devices, Sierpień 2011. 2. Kirk David, Wen-Mei W. Hwu: Programming Massively Parallel Processors. A Hands-on Approach, Elsevier LTD, Oxford, 2010. 3. NVIDIA: OpenCL Best Practices Guide Version 3.2, NVIDIA Corporation, 2010 4. Munshi Aaftab: The OpenCL Specification version 1.1, Khronos OpenCL Working Group, 2010. 5. Trevett N., Zeller C.: OpenCL on the GPU, GPU Technology Conference, 2009. 6. Wang P.: OpenCL optimizations, GPU Technology Conference, 2010. 7. Shearer J., Wei-Chao Chen D., Wen-Mei W.: Introduction to GPU Computing with CUDA and OpenCL, University of California, 2010. 8. Mistry P., Greeg Ch., Rubin N., Kaeli D., Hazelwood K.: Analyzing Program Flow within a Many Kernel OpenCL Application, New York, 2011. 9. Grewe D., O'Boyle M..: A Static Task Partitioning Approach for Heterogeneous Systems Using OpenCL, University of Edinburgh, 2010. Adres służbowy Autora: Mgr inż. Tomasz Przybyła Politechnika Opolska ul. Sosnkowskiego 31 45-272 Opole email: tom.info.dok@gmail.com