Krzysztof Krzewniak - Projekt przenośnej biblioteki do równoległych

Transkrypt

Krzysztof Krzewniak - Projekt przenośnej biblioteki do równoległych
Wysokopoziomowa biblioteka do równoległych
obliczeń numerycznych z wykorzystaniem Qt4
Krzysztof Krzewniak1
1 Wydział Inżynierii Mechanicznej i Informatyki
Kierunek Informatyka, Rok V
[email protected]
Streszczenie
Celem pracy jest prezentacja projektu oraz możliwości przenośnej biblioteki Qpnc,
wspomagajacej
˛ równoległa˛ implementacj˛e algorytmów numerycznych. Zjawisko gwałtownego wzrostu popularności i dost˛epności systemów wieloprocesorowych w wyraźny sposób zwi˛ekszyło nacisk na wykorzystanie technik przetwarzania równoległego podczas implementacji programów na platform˛e PC. Niestety wykorzystanie
potencjału przetwarzania równoległego zwiazane
˛
jest z korzystaniem z wielu niskopoziomowych mechanizmów. Stosowanie niskopoziomowych mechanizmów jest
cz˛esto zadaniem bardzo problematycznym i cz˛esto narażajacym
˛
niedoświadczonych
programistów na popełnienie trudnych do odszukania bł˛edów. Zadaniem biblioteki
Qpnc jest stworzenie przyjaznej warstwy abstrakcji, ukrywajacej
˛ przed użytkownikiem wi˛ekszość niskopoziomowych aspektów programowania równoległego.
1 Wst˛ep
W obecnych czasach główny nacisk firm odpowiedzialnych za projektowanie i produkcj˛e najbardziej popularnych procesorów opartych o architektur˛e x86, skierowany jest nie
na osiagni˛
˛ ecie coraz wyższych cz˛estotliwości taktowania lecz na wprowadzaniu na rynek procesorów składajacych
˛
si˛e z coraz wi˛ekszej ilości jednostek obliczeniowych. Krok
w tym kierunku podyktowany był faktem obserwowania dużego wzrostu wydzielanego
ciepła oraz zapotrzebowania na energi˛e elektryczna˛ jednostek obliczeniowych wraz ze
wzrostem taktowania ich zegarów.
Efektem tego trendu jest błyskawiczny wzrost zapotrzebowania na oprogramowania
mogace
˛ wykorzystać potencjał drzemiacy
˛ w nowoczesnych konstrukcjach opartych o procesory wielordzeniowe. Wykorzystanie pełnej mocy maszyn wielordzeniowych zwiazane
˛
jest z koniecznościa˛ wykorzystania technik przetwarzania równoległego. Niestety zmusza to programistów mi˛edzy innymi do korzystania z niskopoziomowych mechanizmów
synchronizacyjnych oraz odpowiedniego zaplanowania podziału zadań pomi˛edzy obecne
w systemie jednostki obliczeniowe. Zadaniem biblioteki Qpnc jest zdj˛ecie z programisty
odpowiedzialności właśnie za podział zadań oraz ukrycie wszelkich niskopoziomowych
mechanizmów synchronizacyjnych.
1
Fundament biblioteki stanowi, rozwijana przez firm˛e Nokia, technologia Qt4. Zastosowanie dostarczonego wraz z nia˛ mechanizmu sygnałów i slotów pozwoliło na znaczne
uproszczenie zasad działania Qpnc. Qt jest powszechnie postrzegane jako technologia służaca
˛ tylko i wyłacznie
˛
do tworzenia aplikacji typu GUI. Zastosowanie to było w prawdzie
głównym celem powstania Qt, jednak posiada ono bardzo bogaty zestaw bibliotek oraz
rozwiazań
˛
przydatnych nie tylko dla programistów GUI. Qt może być z powodzeniem
stosowane do pisania bardzo szerokiej gamy oprogramowania.
2 Meta-obiekty i mechanizm sygnałów i slotów
Meta-obiekt jest obiektem opisujacym
˛
obiekt. W Qt wszystkie meta-obiekty sa˛ instancjami klasy QMetaObject i przechowuja˛ informacje takie jak na przykład nazwa klasy,
informacje na temat jej klas bazowych oraz posiadane przez klas˛e sygnały i sloty. Zaimplementowany w Qt system meta-obiektów składa si˛e z trzech elementów:
• Klasa QObject. Jest to klasa bazowa udost˛epniajaca
˛ system meta-obiektów.
• Makro Q_OBJECT odpowiedzialne za uruchomienie systemu meta-obiektów na
rzecz danej klasy.
• specjalny pre-kompilator meta-obiektów, odpowiedzialny za generowanie kodu implementujacego
˛
system meta-obiektów dla każdej klasy dziedziczacej
˛ po QObject.
Przed właściwa˛ kompilacja˛ narz˛edzie „moc” przeszukuje pliki źródłowe w poszukiwaniu deklaracji klas zawierajacych
˛
makro Q_OBJECT. Nast˛epnie [narz˛edzie] generuj˛e dodatkowe pliki źródłowe zawierajace
˛ implementacje meta-obiektów dla wszystkich klas
zawierajacych
˛
poszukiwane makro. Wyprodukowane w ten sposób pliki sa˛ nast˛epnie dołaczane
˛
do plików źródłowych klas lub kompilowane i linkowane do ich implementacji.
Klasy dziedziczace
˛ po QObject nieposiadajace
˛ w swojej deklaracji makra Q_OBJECT
przez system meta-obiektów traktowane sa˛ jako najbliższa klasa bazowa posiadajace
˛ implementacj˛e meta-obiektu. Dlatego też zalecane jest umieszczanie makra Q_OBJECT w
deklaracji każdej klasy dziedziczacej
˛ po QObject, nawet jeśli nie b˛edzie ona wykorzystywała mechanizmu sygnałów i slotów.
Bez watpienia
˛
najbardziej przydatnym mechanizmem, który Qt wprowadza do C++,
jest mechanizm sygnałów i slotów. Mechanizm ten w znacznym stopniu ułatwia projektowanie złożonych systemów jednocześnie dajac
˛ możliwość ponownego użycia zaimplementowanych elementów. Z punktu widzenia programisty sygnały sa˛ metodami, które
w czasie wywołania sa˛ emitowane raczej niż wykonywane. Programista zobligowany jest
jedynie do zadeklarowania zestawu sygnałów posiadanych przez klas˛e, ich późniejsza˛ implementacja˛ zajmuje si˛e narz˛edzie „moc”. Mianem slotu określane sa˛ metody składowe
klasy mogace
˛ być wywołane w rezultacie emisji sygnału.
Do skojarzenia emisji sygnału z wywołaniem slotu służy metoda QObject::connect.
b o o l c o n n e c t ( c o n s t Q O b j ect ∗ s e n d e r , c o n s t char ∗ s i g n a l ,
c o n s t Q O b j ect ∗ r e c e i v e r , c o n s t char ∗ s l o t ,
Qt : : C o n n e c t i o n T y p e t y p e = Qt : : A u t o C o n n e c t i o n )
2
Dost˛epnymi typami połaczeń
˛
sa:
˛ Qt::DirectConnection, Qt::QueuedConnection,
Qt::BlockingQueuedConnection, Qt::AutoConnection, Qt::UniqueConnection. W przypadku wykorzystania połaczenia
˛
typu Qt::QueuedConnection typy przekazywane przez
sygnał musza˛ być znane systemowi meta-obiektów. Wynika to z konieczności wykonania
kopi dla odbiorcy. Aby powiadomić system meta-obiektów o istnieniu typu utworzonego przez użytkownika należy użyć funkcji qRegisterMetaType. Mechanizm sygnałów i
slotów pozwala również na użycie metody connect w celu skojarzenia ze soba˛ dwóch
sygnałów, w takim przypadku emisja danego sygnału spowoduje emisj˛e sygnału z nia˛
skojarzonego. Do emisji sygnałów służy słowo kluczowe emit.
Implementacja sygnałów i slotów w Qt opiera si˛e na wykorzystaniu wskaźników do
funkcji[1]. Użycie słowa kluczowego emit jest w efekcie wywołaniem metody sygnału wygenerowanej przez pre-kompilator meta-obiektów. Metoda ta wywołuje wszystkie
sloty skojarzone z danym sygnałem, poprzez wykorzystanie meta-obiektów obiektów połaczonych
˛
slotów. Meta-obiekty przechowuja˛ wskaźniki do slotów wraz z ich nazwami i
typami przyjmowanych argumentów jaki list˛e dost˛epnych sygnałów również z nazwami
oraz typami argumentów. Wywołanie metody connect wia˛że si˛e z operacja˛ dodania konkretnego slotu do listy wywoławczej sygnału przez odpowiedni meta-obiekt. Skojarzenie
zostanie przeprowadzone pomyślnie tylko w wypadku zgodności argumentów slotu oraz
sygnału. Podczas rozstrzygania zgodności pod uwag˛e brane sa˛ jedynie argumenty wywołania slotu, wynikiem tego jest możliwość skojarzenia slotu nieprzyjmujacego
˛
żadnych
argumentów z dowolnym sygnałem. Argumenty nie wykorzystywane przez slot sa˛ pomijane.
3 Cele biblioteki
Pracom nad projektem oraz implementacja˛ biblioteki Qpnc przyświecała ch˛eć osiagni˛
˛ ecia
jak najlepszego kompromisu pomi˛edzy szeregiem niżej wymienionych celów.
Osiagni˛
˛ ecie maksymalnej uniwersalności. Celem nadrz˛ednym było stworzenie biblioteki wspomagajacej
˛ implementacje równoległa˛ jak najszerszej gamy algorytmów
numerycznych. Oczywistym stał si˛e fakt, iż biblioteka nie może dostarczać w pełni
gotowych rozwiazań
˛
w postaci na przykład równoległych implementacji najpopularniejszych algorytmów numerycznych. Dlatego też podj˛eto decyzj˛e o zbudowaniu
warstwy abstrakcji nad poszczególnymi, wykonywanymi równolegle operacjami na
macierzach. Decyzja ta podyktowana była założeniem że ogromna cz˛eść algorytmów numerycznych może zostać rozbita na pojedyncze operacje macierzowe.
Stworzenie przyjaznego i prostego w użyciu API. Ponieważ założeniem projektu było
stworzenie biblioteki wysokiego poziomu, stworzone rozwiazanie
˛
skierowane jest
do mniej doświadczonych programistów cz˛esto nieposiadajacych
˛
dużej wiedzy na
temat działania mechanizmów równoległych. Naturalna˛ decyzja˛ było wi˛ec ukrycie
przed potencjalnym użytkownikiem wszystkich aspektów przetwarzania równoległego oraz udost˛epnienie niedużej liczby prostych w użyciu klas.
Osiagni˛
˛ ecie dobrej wydajności obliczeniowej. Jako rozwiazanie
˛
wysokiego poziomu biblioteka Qpnc nie jest w stanie osiagn
˛ ać
˛ wydajności oferowanej przez grup˛e rozwiazań
˛
niższego poziomu. Jednak aby jej wykorzystanie wiazało
˛
si˛e z wymiernymi
3
korzyściami, konieczna była minimalizacja narzutów powodowanych przez stworzona˛ warstw˛e abstrakcji oraz wprowadzenie jak najlepszej optymalizacji przy jednoczesnym zachowaniu uniwersalności.
Zapewnienie pełnej przenośności. Nie kluczowa˛ ale jednak dalej ważna˛ cecha˛ biblioteki miała być maksymalnie duża przenośność pomi˛edzy różnymi platformami systemowymi. Cel ten został niejako osiagni˛
˛ ety dzi˛eki wykorzystaniu technologii Qt,
dzi˛eki której zbudowana˛ bibliotek˛e powinno si˛e dać wykorzystać nawet podczas
pisania aplikacji dla urzadzeń
˛
mobilnych.
W celu uzyskania uniwersalności oraz utrzymania prostego w użyciu API, stworzony
został zestaw klas szablonowych reprezentujacych
˛
operacje macierzowe. Baz˛e dla wszystkich klas operacji stanowi klasa QpncAbstractOperation. Aby w pełni wykorzystać zestaw
wszystkich zawartych w bibliotece operacji, poza bazowa˛ klasa operacji abstrakcyjnej
użytkownik musi znać jeszcze tylko trzy b˛edace
˛ jej specjalizacjami klasy. Klasami tymi
sa:
˛
• QpncCompositeAbstractOperation, klasa stanowiaca
˛ baz˛e wszystkich operacji kompozytowych,
• QpncSingleMatrixAbstractOperation, klasa bazowa dla operacji wykonywanych na
pojedynczej macierzy,
• QpncRowAbstractOperation, klasa bazowa dla wszystkich operacji wierszowych.
Dzi˛eki zastosowaniu wzorca fabryki użytkownik nigdy nie b˛edzie zmuszony do bezpośredniego operowania skonkretyzowanymi klasami operacji.
Uzyskanie równoległości na poziomie pojedynczej operacji zwiazane
˛
jest z koniecznościa˛ przydzielenia odr˛ebnego zestawu watków
˛
pracujacych
˛
nad jej wykonaniem. W takim przypadku bezpośrednie użycie klasy QThread wprowadzało by istnienie widocznych
narzutów, zwiazanych
˛
z koniecznościa˛ każdorazowego tworzenia nowych watków
˛
wykorzystywanych tylko do wykonania pojedynczej operacji. Doskonałym rozwiazaniem
˛
tego
problemu okazał si˛e mechanizm obiektów wykonywalnych, reprezentowany przez obiekty klas implementujacych
˛
interfejs QRunnable oraz dedykowana˛ pul˛e watkow
˛
a.˛ Rozwia˛
zanie to pozwoliło na efektywne wykorzystanie znacznie mniejszej liczby watków.
˛
Aby
zapobiec niepotrzebnemu zapychaniu globalnej puli dost˛epnej w każdej korzystajacej
˛ z
Qt aplikacji, wraz z biblioteka˛ dostarczone jest odr˛ebna dedykowana pula dost˛epna za
pośrednictwem implementujacej
˛ wzorzec Singleton klasy QpncWorkerPool.
4 Dost˛epne operacje macierzowe
Podstawa˛ wszystkich operacji dostarczonych w ramach Qpnc jest abstrakcyjna klasa QpncAbstractOperation. Dostarcza ona podstawowy interfejs pozwalajacy
˛ na zainicjowanie,
uruchomienie oraz uzyskanie informacji na temat reprezentowanej przez dany obiekt operacji. Najważniejszymi metodami tej klasy z punktu widzenia użytkownika sa:
˛
• metoda init, implementujaca
˛ najbardziej podstawowy proces inicjalizacji obiektu
klasy dziedziczacego
˛
po QpncAbstarctOperation, do swojego działania wykorzystujacy
˛ chroniona˛ metod˛e wirtualna˛ initAction,
4
• nieblokujaca
˛ metoda start, umożliwiajaca
˛ uruchomienie równoległego wykonania
operacji,
• oraz metoda getResault, umożliwiajaca
˛ dost˛ep do obiektu reprezentujacego
˛
macierz
wynikowa˛ operacji.
Dodatkowo w celu zapewnienia implementacji mechanizmu sygnałów i slotów, do którego działania konieczne jest istnienie meta obiektu. Konieczne było zastosowanie dziedziczenia przez klas˛e QpncAbstractOperation po utworzonej specjalnie w tym celu klasie
QpncOperationSignalSender. Zabieg ten był konieczny ponieważ nie istnieje możliwość
utworzenia meta obiektu opisujacego
˛
bezpośrednio żadnego obiektu klasy szablonowej.
Dzi˛eki zastosowaniu wyżej opisanego zabiegu, możliwe stało si˛e emitowanie przez obiekty reprezentujace
˛ operacje sygnału finished, oznaczajacego
˛
zakończenie ich wykonywania.
Niestety cz˛eść interfejsu odpowiedzialna za inicjalizacje, dostarczona przez klas˛e QpncAbstractOperation, jest przydatna tylko dla podstawowej grupy operacji. Z tego powodu konieczne było wprowadzenie pewnej ilości abstrakcyjnych klas dziedziczacych
˛
po
QpncAbstractOperation, udost˛epniajacych
˛
wyspecjalizowana˛ wersj˛e metody init. Fakt istnienia dodatkowych wyspecjalizowanych typów abstrakcyjnych, został w dużym stopniu
ukryty przed użytkownikiem, przez metody służace
˛ do tworzenia i jednoczesnej inicjalizacji obiektów operacji, dostarczone wraz z klasa˛ QpncOperationFactory. Biblioteka
została wyposażona w przestrzeń nazw QpncOperations, w celu umożliwienia prostej
konstrukcji pożadanych
˛
przez użytkownika obiektów operacji. W przestrzeni tej zawarto specjalne typy wyliczeniowe identyfikujace
˛ poszczególne grupy oraz typy operacji Na
chwil˛e obecna˛ w Qpnc wyróżnić można cztery grupy operacji.
Operacje zwykłe. Dziedziczace
˛ bezpośrednio po QpncAbstractOperation, posiadajace
˛
metod˛e init wymagajac
˛ a˛ podania dwóch obiektów reprezentujacych
˛
macierze, podanie obiektu reprezentujacego
˛
macierz wynikowa˛ nie jest obligatoryjne.
Operacje wykorzystujace
˛ pojedyncza˛ macierz. Grupa operacji dziedziczacych
˛
po wyspecjalizowanej klasie QpncSingleMatrixAbstractOperation, posiadajacej
˛ metod˛e
init wymagajac
˛ a˛ podania tylko jednej macierzy wraz z opcjonalna˛ wartościa˛ skalarna,˛ podanie obiektu macierzy wynikowej jest opcjonalne.
Operacje wierszowe. Grupa operacji dziedziczacych
˛
po wyspecjalizowanej klasie QpncRowAbstractOperation, posiadajacej
˛ metod˛e init wymagajac
˛ a˛ podania tylko jednej
macierzy wraz z numerem wiersza, wartościa˛ skalarna˛ oraz ewentualnym numerem
wiersza docelowego, podanie obiektu macierzy wynikowej jest opcjonalne.
Operacje kompozytowe. Najliczniejsza˛ grup˛e stanowia˛ operacje dziedziczace
˛ po wyspecjalizowanej klasie QpncCompositeAbstractOperation, której metoda init wymaga podania dwóch, zainicjowanych obiektów klas dziedziczacych
˛
po QpncAbstractOperation oraz opcjonalnego obiektu reprezentujacego
˛
macierz wynikowa.
˛
5 Zastosowanie operacji kompozytowych
Całe działanie Qpnc oparte jest na wykorzystaniu warstwy abstrakcji pozwalajacej
˛ na
równoległe wykonanie prostych operacji macierzowych. Do wykonania każdej opera5
cji konieczny jest obiekt reprezentujacy
˛ znajdujac
˛ a˛ si˛e w pami˛eci macierz. Oznacza to
że podczas implementacji jakiegokolwiek algorytmu numerycznego, jedna˛ z odpowiedzialności programisty b˛edzie dostarczenie na czas odpowiedniej macierzy koniecznej
do wykonania zadanej operacji, która cz˛esto okazuje si˛e być wynikiem innej operacji
wchodzacej
˛ w skład implementowanego algorytmu. Odpowiednia synchronizacja wykonania poszczególnych operacji oraz przekazanie ich wyników innym operacjom, może
podczas implementacji prostych algorytmów wydawać si˛e zadaniem trywialnym. Jednak najcz˛eściej algorytmy numeryczne, z których implementacja˛ przyjdzie zmierzyć si˛e
programiście, składaja˛ si˛e z całkiem pokaźniej liczby operacji. Podczas implementacji
takich zagadnień cz˛esto dochodzi do sytuacji w której to właśnie synchronizacja wykonania operacji okazuj˛e si˛e być zadaniem najbardziej pracochłonnym i zarazem narażajacym
˛
programist˛e na popełnienie trudnego do znalezienia bł˛edu.
Zadaniem wzorca obiektu kompozytowego jest dostarczenie klasy, implementujacej
˛
pewien interfejs, zdolnej do kompozycji wi˛ekszej liczby klas implementujacych
˛
ten sam
interfejs. Efektem zastosowania tego wzorca jest możliwość posiadania obiektu ukrywajacego
˛
przed użytkownikiem fakt istnienia, nawet bardzo skomplikowanego, zestawu
obiektów implementujacych
˛
dany interfejs, umożliwiajacego
˛
wywołanie pewnej metody
na rzecz całego zestawu za pośrednictwem wywołania tej samej metody z poziomu pojedynczego obiektu.
Zastosowanie podczas implementacji klasy QpncCompositeAbstractOperation wzorca obiektu kompozytowego, stworzyło możliwość udost˛epnienia mechanizmu w dużym
stopniu automatyzujacego
˛
synchronizacj˛e wykonania operacji. Wyspecjalizowana metoda init, wchodzaca
˛ w skład interfejsu tej klasy, pozwala na inicjalizacj˛e obiektu dwoma
innymi obiektami dziedziczacymi
˛
po klasie QpncAbstractOperation. Rezultatem wywołania, należacej
˛ do obiektu kompozytowego, metody start jest natychmiastowe wywołanie
metod start obu podanych na etapie inicjalizacji obiektów. Wykonanie działania macierzowego zwiazanego
˛
z samym obiektem kompozytowym, zostanie automatycznie odwleczone w czasie do momentu zakończenia przetwarzania komponowanych operacji. Dla
zapewnienia wygody oraz wydajnego wykorzystania pami˛eci obiekt kompozytowy automatycznie usunie komponowane operacje z chwila˛ zakończenia ich przetwarzania.
Ponieważ wszystkie klasy dziedziczace
˛ po QpncCompositeAbstractOperation, automatycznie w sposób pośredni dziedzicza˛ po bazowej klasie QpncAbstractOperation, możliwe jest zainicjowanie obiektu kompozytowego innym obiektem kompozytowym. Pozwala to na odwzorowanie wykonania algorytmu numerycznego na pewnego rodzaju
struktur˛e drzewiasta.˛ Reprezentacja algorytmu numerycznego stosujaca
˛ logiczna˛ struktur˛e drzewiasta,˛ w znacznym stopniu ułatwia jego implementacj˛e oraz późniejsza˛ analiz˛e. Jednocześnie dzi˛eki sposobowi w jakim działaja˛ operacje kompozytowe, użytkownik
otrzymuje gwarancje prawidłowej kolejności wykonania wszystkich operacji.
6 Wykorzystanie metody sprz˛eżonych gradientów
W celu sprawdzenia przydatności biblioteki podczas implementacji algorytmów numerycznych, wykonana zostanie seria testów polegajaca
˛ na rozwiazaniu
˛
układów równań
przy użyciu metody sprz˛eżonych gradientów[2]. W celu określenia przyśpieszenia oraz
efektywności implementacji tego algorytmu z wykorzystaniem Qpnc, wszystkie układy
zostana˛ rozwiazane
˛
również przez implementacj˛e sekwencyjna˛ oraz równoległa˛ wyko-
6
rzystujac
˛ a˛ mechanizm watków
˛
standardu POSIX. Do wykonania wszystkich obliczeń testowych posłuży system, w którego skład wchodzi cztero-rdzeniowy procesor Phenom
II, z tego powodu obliczenia testowe zostana˛ przeprowadzone z wykorzystaniem czterech oraz ośmiu watków.
˛
Do obliczenia przyśpieszenia oraz efektywności wykorzystane
zostana˛ nast˛epujace
˛ wzory.
• Przyspieszenie:
Sp =
T1
Tp
Sp - przyspieszenie, T1 - czas wykonania sekwencyjnego, Tp - czas wykonania wersji równoległej.
• Efektywność:
Ep =
Sp
p
E p - efektywność, Sp - przyspieszenie, p - liczba procesorów lub watków.
˛
Jako pierwsze analizie poddane zostały wyniki testu polegajacego
˛
na rozwiazaniu
˛
układu równań składajacego
˛
si˛e z 5000 niewiadomych. W przypadku tego zestawu program bezpośrednio wykorzystujacy
˛ standard POSIX posiada przewag˛e na poziomie około
9%. Zważywszy na fakt, iż wykorzystywana tu metoda sprz˛eżonych gradientów w dużej
mierze opiera swoje działanie na operacjach wektorowych. W zwiazku
˛
z tym rozwiaza˛
nie układu składajacego
˛
si˛e z 5000 niewiadomych nie jest zadaniem wystarczajaco
˛ dużym
aby pokazać potencjał obu rozwiazań.
˛
—–
POSIX 4
Qpnc 4
POSIX 8
Qpnc 8
Przyspieszenie
2,54
2,33
2,73
2,36
Efektywność
0,64
0,58
0,34
0,3
Efektem stosunkowo niewielkiego nakładu pracy wymaganego do rozwiazania
˛
tego
układu jest uzyskanie dosyć niskiej efektywności obliczeń równoległych.
Dwukrotne zwi˛ekszenie zestawu danych zaowocowało znacznie lepszym wykorzystaniem dodatkowych jednostek obliczeniowych. Zaobserwowano wyraźny wzrost przewagi
obu programów wykorzystujacych
˛
techniki przetwarzania równoległego nad programem
sekwencyjnym. Powi˛ekszenie zestawu danych nie miało jednak znaczacego
˛
wpływu na
różnic˛e w wydajności pomi˛edzy programem wykorzystujacym
˛
Qpnc a programem wykorzystujacym
˛
mechanizm watków
˛
standardu POSIX.
—–
POSIX 4
Qpnc 4
POSIX 8
Qpnc 8
Przyspieszenie
3,19
2,9
3,05
2,86
7
Efektywność
0,8
0,73
0,38
0,36
Zwi˛ekszenie zestawu danych miało bardzo pozytywny wpływ na wartości przyśpieszenia oraz efektywności obu rozwiazań.
˛
Jednak dalej wykorzystanie liczby watków
˛
dwukrotnie wi˛ekszej niż liczba dost˛epnych jednostek obliczeniowych zwiazane
˛
jest z uzyskaniem bardzo słabego wskaźnika efektywności oraz nawet niewielkiego spadku uzyskanego przyśpieszenia. Spadek wydajności programu wykorzystujacego
˛
wi˛eksza˛ liczb˛e
watków
˛
jest tym razem widoczny ze wzgl˛edu na wydłużenia czasu pracy poszczególnych
watków,
˛
przez co możliwe jest wzajemne wywłaszczanie czasu procesora.
Wyniki testu przeprowadzonego na zestawie danych składajacym
˛
si˛e z układu 15000
niewiadomych, potwierdzaja˛ tendencj˛e wyraźnego wzrostu przydatności obu rozwiazań
˛
wraz ze zwi˛ekszeniem rozmiaru zagadnienia. W przypadku takiego rozmiaru zagadnienia
przewaga programu bezpośrednio wykorzystujacego
˛
standard POSIX kształtuje si˛e na
poziomie już tylko około 2,9%.
—–
POSIX 4
Qpnc 4
POSIX 8
Qpnc 8
Przyspieszenie
3,79
3,69
3,73
3,65
Efektywność
0,95
0,92
0,47
0,46
W przypadku obliczeń przeprowadzonych w ramach ostatniego testu uzyskane zostały
bardzo obiecujace
˛ wartości wskaźnika efektywności. Oba programy wykorzystujace
˛ techniki przetwarzania równoległego osiagn˛
˛ eły efektywność przewyższajac
˛ a˛ 90%. Jednocześnie różnica efektywności pomi˛edzy rozwiazaniem
˛
wykorzystujacym
˛
Qpnc a programem
korzystajacym
˛
bezpośrednio z POSIX wynosi zaledwie 3%.
7 Podsumowanie
Wszystkie wyniki przeprowadzonych testów potwierdzaja˛ istnienie narzutów wprowadzonych przez obecna˛ w Qpnc warstw˛e abstrakcji. Jednak wraz ze wzrostem rozmiaru
zadania obserwowano znaczacy
˛ spadek ich procentowego udziału w czasie poświ˛econym
na wykonanie całego zagadnienia testowego. Pozwala to sadzić,
˛
że dla zadań wymagaja˛
cych dużego nakładu pracy korzyści płynace
˛ z zastosowania Qpnc b˛eda˛ tylko minimalnie
mniejsze od tych wynikajacych
˛
z bezpośredniego zastosowania standardu POSIX. Dodatkowo należy pami˛etać że Qpnc jest wysokopoziomowa˛ biblioteka,
˛ w dużym stopniu
ukrywajac
˛ a˛ wi˛ekszość niskopoziomowych aspektów obliczeń równoległych.
Literatura
[1] Johan Thelin, Foundations of Qt Development, Apress 2007.
[2] Jonathan Richard Shewchuk, An Introduction to the Conjugate Gradient Method
Without the Agonizing Pain, Carnegie Mellon University 1994.
8