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