Przemysław Sołtan - kik
Transkrypt
Przemysław Sołtan - kik
Przemysław Sołtan, Oleg Maslennikow, Piotr Ratuszniak Wydział Elektroniki Politechnika Koszalińska, Koszalin Wizualizacja struktur macierzy procesorowych w standardzie SVG STRESZCZENIE W niniejszej pracy omówiono sposób wizualizacji struktur macierzy procesorowych uzyskiwanych w procesie przekształceń grafu zależności informacyjnych (GZI). Zaprojektowana biblioteka wspomaga projektowanie algorytmów algebry liniowej i poddaje je procesowi odwzorowania do postaci grafu GZI. Kolejnym etapem jest wywołanie zaprojektowanych funkcji podziału grafu i generacja struktur macierzy procesorowych. Cały proces przechodzenia od algorytmu do struktury macierzy procesorowej jest wspierany poprzez wizualizację danych XML opisujących graf i struktury przy zastosowaniu transformacji XSLT i uzyskiwaniu wynikowych dokumentów w postaci opisu grafiki wektorowej SVG. WSTĘP Zwiększenie wydajności systemów z klasyczną architekturą typu SISD (ang. Single Instruction stream – Single Data stream) jest możliwe tylko do pewnej granicy określonej prędkością rozpowszechniania sygnału elektrycznego, co wymusza zastosowanie innych mechanizmów przyspieszających pracę systemu. Radykalnym rozwiązaniem tego problemu jest realizacja systemu opartego o architektury równoległe. Jednym z możliwych rozwiązań jest model równoległej architektury z wirtualną topologią i jej praktyczna realizacja w oparciu o nowoczesne rekonfigurowalne (reprogramowalne) układy FPGA (ang. Field Programmable Gate Array). Wybierając taki model równoległego systemu, należy uwzględniać fakt, że zwiększenie częstotliwości pracy układu wymaga zmniejszenia długości wewnętrznych połączeń. Z tego względu przy projektowaniu równoległych architektur należy uwzględniać zasadę lokalności połączeń wewnętrznych. Do wspomagania procesu projektowania algorytmów (np. algebry liniowej) zaprojektowano system bazujący na przetwarzaniu danych i ich wizualizacji. Proces przetwarzania danych polega na otrzymaniu m-wymiarowych struktur macierzy procesorowych (MP) (ang. VLSI Array Processors) poprzez odwzorowanie projektowanego algorytmu do postaci grafu zależności informacyjnych (GZI), a następnie wykonaniu jego podziału na podstawie ustalonych kryteriów. Omówiony proces odwzorowania przedstawiono na rys. 1. Opis algorytmu for (int i=1; i<N;i++) { for (int j=1; j<N;j++) { ... } } Opis grafu GZI Odwzorowanie Odwzorowanie Odwzorowanie m-wymiarowej struktury m-wymiarowej m-wymiarowejstruktury struktury Rys. 1. Proces odwzorowania projektowanego algorytmu na graf GZI i m-wymiarowe struktury Do opisu danych przekazywanych pomiędzy kolejnymi fazami wykorzystano język XML (ang. eXtensible Markup Language). Ponieważ forma danych w postaci graficznej jest bardziej zrozumiała dla człowieka spróbowano dokonać wizualizacji tych danych przy użyciu standardu SVG (Scalable Vector Graphics) przeznaczonego do opisu grafiki wektorowej. Standard został zainicjowany przez konsorcjum W3C w 1999 roku, a aktualna specyfikacja posiada status rekomendacji i z tego względu przeglądarki internetowe nie muszą go jeszcze interpretować. Obsługa standardu odbywa się poprzez dodatkowe moduły (ang. plug-ins), a autorzy publikacji wykorzystywali w tym celu darmowe oprogramowanie Adobe SVG Viewer 3.0 [1]. Dokumenty SVG to nic innego jak dokumenty XML z określoną listą znaczników dokładnie opisanych w specyfikacji W3C [2]. WIZUALIZACJA GRAFU ZALEŻNOŚCI INFORMACYJNYCH – GZI Pierwszym etapem projektowania jest opisanie badanego algorytmu i jego odwzorowanie w graf zależności informacyjnych (GZI). Podczas prac projektowych nad przedstawionym systemem zrezygnowano z realizacji analizatora leksykalnego i semantycznego kodu opisującego badany algorytm. Założono, że projektant będzie używał istniejących języków i narzędzi do programowania. W tym celu dla danego języka (w tym przypadku wybrano język JAVA) zaprojektowano dodatkową bibliotekę, której zadaniem jest generacja grafu GZI podczas uruchomienia programu z projektowanym algorytmem. Uzyskano w ten sposób „zanurzenie” algorytmu i biblioteki w standardowe środowisko projektowe (autorzy do tego celu wykorzystali platformę ECLIPSE) i korzystanie z możliwości wybranego narzędzia (edytora, kompilatora i deguggera). Poniżej przedstawiono przykładowy algorytm eliminacji Gaussa zrealizowany z wykorzystaniem autorskiej biblioteki jgen.core.gzi.user. Podczas jego tworzenia należy wykorzystywać specjalnie zaprojektowane klasy zawarte w bibliotece opisujące „typy danych”: GziMatrix i GziVector. Dokonano opakowania standardowych tablic języka JAVA, uzyskując klasy zawierające dodatkowy kod rejestrujący zachowanie algorytmu. Fragment pliku JAVA z kodem opisującym przykładowy algorytm import jgen.core.gzi.user.*; ... Gzi gzi = new Gzi(); gzi.setName("gauss"); //opcjonalna nazwa grafu gzi.setSize(3); //rozmiaru generowanego grafu int N = 4; GziMatrix a = new GziMatrix("a", 1, N, 1, N); GziMatrix m = new GziMatrix("m", 1, N, 1, N); for (int k1 = 1; k1 <= N - 1; k1++) { for (int k2 = k1 + 1; k2 <= N; k2++) { gzi.setNode(2, k1, k2, k1); m.set(k1,k2,a.get(k2,k1) / a.get(k1,k1)); } for (int k2 = k1 + 1; k2 <= N; k2++) { for (int k3 = k1 + 1; k3 <= N; k3++) { gzi.setNode(1, k1, k2, k3); a.set(k2,k3,a.get(k2,k3) -m.get(k1,k2)/a.get(k1,k3)); } } } gzi.stop(); //finalizacja tworzenia grafu gzi.exportGzi("workspace/gauss.xml"); gzi.gzi2svg3d("workspace/gauss.xml", "workspace/gauss.svg"); Rys. 2. Przykładowy graf zależności informacyjnych (GZI) Rejestracja węzłów grafu polega na wywoływaniu w algorytmie metod setNode(...), a rejestracja łuków poprzez śledzenie wywołań dostępnych metod akcesji set() i get(). Dodatkowo można jednoznacznie określić węzły do których należy doprowadzić dane wejściowe oraz prognozować te węzły na których będzie dostępny wynik wykonania algorytmu. Umożliwia to zgromadzenie informacji o przewidywanej strukturze portów wejściowych i wyjściowych wynikowej macierzy procesorowej. Na etapie projektowania algorytmu można dokonać wstępnego przekształcenia odwzorowania GZI na poziomie kodu algorytmu. Sposobem jest zmiana kolejności wykonywania operacji w algorytmie. Stosuje się tu zasady przemienności wykonywania operacji matematycznych. W wyniku takiego przekształcenia można uzyskać zmiany w przekazywaniu zmiennych pomiędzy wierzchołkami grafu, a nawet zmiany współrzędnych ich ulokowania. Wykonanie tak przygotowanego programu powoduje generację dokumentu XML zawierającego listę łuków i węzłów wraz z ich typami. Poniżej przedstawiono przykładową, uproszczoną strukturę dokumentu XML opisującego graf GZI oraz uproszczony fragment wygenerowanego dokument SVG, którego widok zaprezentowanego na rys. 2. Fragment pliku XML opisującego graf GZI Fragment pliku SVG wizualizacji grafu <?xml version='1.0' encoding='UTF-8'?> <gzi id='1' size='3' ver='2.37' name='gauss' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='graph.xsd'> <nodeTypeList> ... 13 </nodeTypeList> <nodeList> ... <node type='1' ... </nodeList> <edgeList> ... <edge from='2' ... <edge from='4' <edge from='7' ... <edge from='7' <edge from='7' ... </edgeList> </gzi> <?xml version="1.0" encoding="UTF-8"?> <svg height="460" width="400"> <defs> <marker ... /> <radialGradient ... /> <script language="Javascript"> ...kod javaScript </script> </defs> <path <path <path <path <path k1='1' k2='3' k3='2' id='7'/> 4 ... ... ... ... ... to='7' id='6'/> 8 to='7' id='7'/> to='8' id='8'/> to='10' id='13'/> to='13' id='18'/> d="M 150 170 L 230 150" /> /> /> /> /> 7 2 <circle <circle <circle <circle 10 <circle <circle </svg> ... ... ... ... ... ... r="5" cx="150" cy="170"/> r="5" cx="230" cy="150"/> /> /> /> /> Aby być pewnym prawidłowej struktury dokumentów XML korzysta się z dodatkowego plik opisującego ich gramatykę – zasad które określają o występowaniu określonych nazw znaczników, ich zagnieżdżaniu, nazwach atrybutów itd. Opis gramatyki zrealizowano przy pomocy dodatkowego pliku graph.xsd opisanego w standardzie XML Schema. Proces budowania dokumentu SVG na podstawie danych XML polega na transformacji określonych znaczników (np. <node> i <edge>) na ich graficzne odwzorowanie zgodne z SVG. Węzły grafu reprezentowane przez znacznik <node type=”...” k1=”...” k2=”...” k3=”...”> zostają odwzorowane na znacznik <circle cx=”X” cy=”Y” r=”5”>. Określa się współrzędne i promień koła oraz sposób jego wypełnienia, które jest różne dla różnych typów węzłów. Połączenia pomiędzy węzłami <edge from=”...” to=”...”> odwzorowuje się przy użyciu znacznika <path d=”M X1 Y2 L Y1 Y2” marker-end=”...”>. Określa się początek i koniec łuku oraz definiuje się użycie znacznika <marker>, przy pomocy którego uzyskuje się grot strzałki. Znając zasady odwzorowania grafu (z opisu XML do SVG) zaprojektowano styl XSLT (ang. eXtensible Stylesheet Language Transformations) przy pomocy którego dokonuje się transformacji i uzyskuje wizualizację w standardzie SVG. W dokumencie XML opisującego graf GZI od razu uwidacznia się podstawowa zaleta języka XML, w którym nazwy znaczników opisują obejmowaną zawartość. Jest to tekstowy format zrozumiały zarówno dla człowieka jaki i maszyny. O tym, czy dany dokument jest zgodny ze standardem XML informuje prolog zawarty w pierwszym wierszu każdego dokumentu XML: <?xml version='1.0'... ?>. Wynika z tego, że i dokumenty: XSLT, XML Schema i SVG to nic innego jak tekstowe dokumenty XML. W przypadku standardu SVG jest to jego kolejna zaleta w porównaniu z komercyjnym binarnym formatem SWF z pakietu FLASH – Macromedia. PRZEKSZTAŁCANIE GZI W STRUKTURĘ MACIERZY PROCESOROWEJ Otrzymany graf algorytmu w postaci listy węzłów oraz łączących je łuków może zostać poddany przekształceniu (transformacji) w strukturę przystosowaną do wymagań wynikowej architektury systemu [3]. W projekcie zaprojektowano szkielet (ang: framework) aplikacji przedstawiony na rys. 3, który korzystając z opracowanych formatów danych wejściowych opisu grafu w XML oraz dodatkowej biblioteki wspomagających JAMA (Java Matrix – biblioteka wspomagająca operacje na macierzach w języku JAVA) realizuje odwzorowanie w postaci generacji dokumentu wynikowego XML zawierającego opis struktur MP. Dane o kryteriach podziału Jama = Java Matrix class (MathWorks) TEMPLATE Opis grafu (XML) ENGINE Moduły reguł podziału grafu Opis struktur po podziale (XML) Widok struktur (SVG) ŚRODOWISKO GEN (Graph ENgine) Rys. 3. Moduł podziału grafu na macierze procesorowe Zaproponowana architektura systemu pozwala na projektowanie własnych mechanizmów podziału grafu [5] poprzez moduły reguł podziału realizowane w postaci klas JAVA. Można zastosować homomorficzne przekształcenia grafu, łącząc kilka wierzchołków w jeden makrowierzchołek, np. poprzez wykonanie rzutu grafu na pewną hyperpłąszczyznę w celu eliminacji długich łuków. Innym sposobem przekształcenia jest podział grafu na podgrafy jedną z metod dekompozycji – LSGR (lokalnie sekwencyjna – globalnie równoległa) lub LRGS (lokalnie równoległa – globalnie sekwencyjna) [4]. a) b) d) c) e) Rys. 4. Przykładowe architektury macierzy procesorowych: a-b) dla m=1 oraz c-e) dla m=2. Przedstawione na rys. 4 struktury są jedynie wybranymi z całego szeregu wygenerowanych wariantów. Każda z nich cechuje się określonymi parametrami pracy takimi jak: liczba elementów przetwarzających (LEP), stopień równomiernego obciążenia układu, czy też liczba kanałów łączących elementy przetwarzające. Ostatnie kryterium jest o tyle ważne, że można na jego podstawie określić również te warianty architektur dla których nie istnieją kanały zwrotne (jest to związane z podziałem obliczeń w dziedzinie czasu). Wówczas elementy przetwarzające EP w których dokonano już operacji obliczeniowych nie są potrzebne do dalszego przetwarzania. Przy standardowej implementacji w układach FPGA taki blok będzie pracował w dalszych taktach pracy zaprojektowanego systemu w trybie jałowym. W takim przypadku można zastosować wielokontekstowe układy reprogramowalne FPGA posiadające pewną liczbą jednakowych bloków konfiguracyjnych, w których mogą być przechowywane różne jego konfiguracje (konteksty dla każdego elementu przetwarzającego EP) [4]. Zastosowanie standardu SVG do wizualizacji struktur wykorzystuje ten sam mechanizm, który opisano przy wizualizacji grafu GZI. Na podstawie danych wejściowych i zaprojektowanego nowego stylu XSLT dokonuje się transformacji uzyskując wyjściowy plik SVG. ŚRODOWISKO PROJEKTOWE Zaprezentowany projekt zrealizowano w języku JAVA. Wybór języka został podyktowany dostępem do darmowej platformy tego języka umożliwiającej realizację nawet bardzo zaawansowanych rozwiązań programistycznych. Aktualnie jednym z najważniejszych projektów otwartego oprogramowania opartego o język JAVA jest środowisko projektowe, a właściwie cała platform programistyczna o nazwie ECLIPSE. Projekt jest wspierany przez przemysł informatyczny (głównie przez firmę IBM) i wykorzystywany nie tylko do badań, ale jako efektywny system produkcyjny i to nie tylko w języku JAVA [6]. Na rys. 5. przedstawiono widok środowiska ECLIPSE z otwartym przykładowym projektem zawierającym opis algorytmu oraz wizualizację grafu i wybranej macierzy procesorowej. Rys. 5. Platforma ECLIPSE jako baza projektowa generacji i wizualizacji macierzy procesorowych. Podstawowym założeniem podczas tworzenia zaprezentowanego systemu była standaryzacja określonych mechanizmów: przechowywania (serializacji) i przekazywania danych przy użyciu języka XML, sprawdzania gramatyki poprawności dokumentów przy pomocy schematów XML Schema oraz transformacji dokumentów XML przy użyciu styli XSLT w wyniku której uzyskuje się dokumenty zgodne z XML takie jak SVG. ŚRODOWISKO PROJEKTOWE JAVA (PLATFORMA ECLIPSE) Moduł Gzi Opis algorytmu (JAVA) Moduł GziDecomp Opis grafu zależności informacyjnych GZI (XML) Opis struktury macierzy procesorowej (XML) Moduł GziVhdl SYMULATOR VHDL ActiveHdl Opis struktury macierzy procesorowej (VHDL) PARSER SAX Transformacja XSL XML+XSLÆ SVG Transformacja XSL XML+XSLÆ SVG Widok grafu zależności informacyjnych GZI (SVG) Opis struktury macierzy procesorowej (SVG) Adobe SVG Viewer + Przeglądarka WWW Rys. 6. Schemat blokowy elementów składowych projektu jGen. Dokonując transformacji można również otrzymywać dokumenty tekstowe o innej strukturze jak np. opis struktury MP w VHDL - języku opisu sprzętu wysokiego poziomu (ang. Very high level Hardware Description Language). Zadanie to realizuje dodatkowy moduł GziVhdl przedstawiony na rys. 6 schematu blokowego zaprojektowanego środowiska (jGen). WNIOSKI W pracy przedstawiono mechanizm wizualizacji macierzy procesorowych przy użyciu szeroko akceptowalnych i darmowych standardów opartych o XML i język JAVA. Skupiono się głównie na wizualizacji z pominięciem opisu procedur podziału, które omówiono w publikacjach [3] i [4]. Podział projektu na moduły komunikujące się formatem XML umożliwia separację projektu budowania grafu GZI od bibliotek przekształceń macierzy procesorowych MP. Ponadto specyfikacja XSLT ułatwia transformację danych i ich wizualizację w postaci formatu grafiki wektorowej SVG będącego otwartym standardem wspieranym przez konsorcjum W3C. BIBLIOGRAFIA [1] Adobe SVG Viewer 3.0 – www.adobe.com/svg [2] Scalable Vector Graphics (SVG) 1.1 Specification – W3C Recommendation 14 January 2003 – http://www.w3.org/TR/2003/REC-SVG11-20030114/ [3] O. Maslennikow, P. Sołtan. “Środowisko wspomagania projektowania reprogramowalnych systemów czasu rzeczywistego”. Prace II Konferencji Krajowej Elektroniki, KKE’2003, Kołobrzeg, 2003, pp.381-386. [4] R. Wyrzykowski, Ju. S. Kanevski, O.V. Maslennikov, “A New Orthogonal Version of the Gauss-Jordan Algorithm and Its Parallel Implementation”. Proc. 5-th Int. Euromicro Workshop Parallel and Distributed Processing - PDP’97, IEEE Computer Society Press, London, 1997, pp. 445-452. [5] O. Maslennikow, “Realizacja architektur macierzy procesorowych w dynamicznie reprogramowalnych układach FPGA”. Prace VII Konferencji Krajowej „Reprogramowalne układy cyfrowe”, RUC’2004, Szczecin, 2004, pp. 225-232. [6] Eclipse Platform - www.eclipse.org