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