Reduced Adder Graph

Transkrypt

Reduced Adder Graph
Reduced Adder Graph
Implementacja algorytmu RAG
Maciej Piotr Jankowski
2005.12.22
Maciej Piotr Jankowski
1
Plan prezentacji
1. Wstęp
2. Implementacja
3. Usprawnienia optymalizacyjne
3.1. Tablica ekspansji
3.2. Faktoryzacja
4. Wyniki testów
5. Instrukcja obsługi programu
6. Podsumowanie
2005.12.22
Maciej Piotr Jankowski
2
Wstęp
Algorytm RAG został wymyślony dla usprawnienia procesu
projektowania filtrów cyfrowych. Pozwala on tworzyć kolejne
współczynniki filtru na podstawie współczynników poprzednich, np. przy
wystąpieniu współczynników {3, 25} możemy zamiast
25 = 16 + 8 + 1
zapisać
25 = 8 * 3 + 1
Elementem wymagającym optymalizacji jest w tym przypadku ilość
wystapień sumatorów (czyli działań +/-) w układzie.
Niestety, problem takiej optymalizacji układu jest NP-zupełny i wymaga
odpowiednich narzędzi usprawniających działanie algorytmu.
2005.12.22
Maciej Piotr Jankowski
3
Implementacja
Algorytm zaimplementowałem w C++. Stworzyłem jedną klasę RAG,
która zajmuje się całym procesem. Przy pisaniu starałem się opierać na regułach
heurystycznych, tzn. w pierwszej kolejności realizowane są współczynniki o
najmniejszym koszcie (koszt = ilość sumatorów potrzebnych do realizacji).
Jednakże duża złożoność obliczeniowa decyzji, które współczynniki
realizować w dalszej kolejności oraz w jaki sposób, skłoniła mnie do
poszukiwania metod usprawniających ten proces. Dodałem dwa elementy:
- tablicę ekspansji
- faktoryzację współczynników
Wyniki uzyskane dzięki tym metodom uważam za całkiem przyzwoite,
co dobrze widać w testach (pkt 4.) W dalszej części prezentacji przedstawię
bardziej szczegółowo powyższe metody.
2005.12.22
Maciej Piotr Jankowski
4
Usprawnienia optymalizacyjne
Tablica ekspansji
Tablica ekspansji pozwala na bardzo szybką ocenę złożoności realizacji
danego współczynnika. Jest to konieczne przy decyzji, który ze
współczynników realizować w następnej kolejności.
Tablica ta zawiera w polu o numerze n ilość sumatorów koniecznych do
realizacji współczynnika n.
Na samym początku tablica ta uzupełniana jest na podstawie możliwości
kombinacji potęg dwójki (ponieważ nie mamy jeszcze żadnych
współczynników). Kilka jej pierwszych pól wygląda następująco:
1
2
3
4
5
6
7
8
9
0
0
1
0
1
1
1
0
1
2005.12.22
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
1
2
1
2
1
1
0
1
Maciej Piotr Jankowski
1
2
1
2
2
2
1
2
2
2
5
Tablica ekspansji – cz. 2.
Zgodnie z założeniami tablica ta w polach odpowiadających potęgom dwójki
ma wartość 0, gdyż nie potrzebujemy żadnego sumatora do ich realizacji.
Natomiast w polu 19 mamy wartość 2, ponieważ potrzebujemy dwóch
sumatorów:
19 = 16 + 2 + 1
Aktualizacja tablicy ekspansji
W momencie, gdy zrealizujemy jakiś współczynnik, tablica musi zostać
uaktualniona. Polega to na porównaniu jej starych wartości z realizacjami
uwzględniającymi nowy współczynnik. W przypadku, gdy nowa realizacja
jest korzystniejsza dla np. liczby k, pole w tablicy tab[k] zmniejsza swoją
wartość. I następnie jest sprawdzane, czy liczba k nie powoduje poprawy
realizacji jakiegoś współczynnika.
2005.12.22
Maciej Piotr Jankowski
6
Tablica ekspansji – cz. 3.
Przykład
Mamy na początku tablicę uzupełnioną wartościami z potęg dwójki.
Następnie realizujemy współczynnik k=5 jako 5=4+1. Następne, co musimy
zrobić, to zaktualizować tablicę ekspansji:
W tym celu należy porównać wartości stare z wartościami przesuniętymi
o k w prawo i zwiększonymi o 1, jak na rysunku. Jeśli powstały w ten
sposób wynik jest lepszy (jak dla 13 lub 21) to jest zapisywany i następny
krok to k = 13. To samo powtarzamy dla 2k, 4k, 8k, 16k itd.
1
2
3
4
5
6
7
8
9
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
0
0
1
0
1
1
1
0
1
1
5
6
7
8
9
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
0
1
1
2
1
2
2
2
1
2
2
1
1
2
1
2
0
3
1
2
1
3
2
2
1
2
2
1
2
2
2
2
1
3
2
2
2
3
2
3
+1
13 = 5 + 8
2005.12.22
Maciej Piotr Jankowski
21 = 5 + 16
7
Tablica ekspansji – cz. 3.
Podsumowanie i parametry
Ciągła aktualizacja tablicy ekspansji jest niewątpliwie sporym obciążeniem dla
całego projektu. Jednak pożyteczność tej tablicy jest tak duża, że wydaje mi się
iż opłaca się to w zupełności.
Dodatkowo, żeby nieco poprawić szybkość, wprowadziłem różne
usprawnienia, między innymi zapamiętuję wartości minimalne dla realizacji z
jednym sumatorem, dwoma itd.(granice dolne) W miarę uzupełniania tablicy
wartości te dość szybko rosną, co pozwala przyspieszyć działanie programu.
Parametrem tablicy ekspansji jest jej długość, określona jako log2 z faktycznej
długości tablicy. Większa tablica może dawać czasem (raczej dość rzadko)
lepsze rezultaty, ale wydłuża też czas obliczeń, więc wybór należy do
użytkownika. Nie należy też przesadzać, by wartości współczynników
pomocniczych (tworzonych pośrednio podczas procesu) nie były zbyt duże.
2005.12.22
Maciej Piotr Jankowski
8
Faktoryzacja
Faktoryzacja polega na rozłożeniu liczby na liczby pierwsze. Dzięki temu, a
następnie połączeniu tych liczb w odpowiednie grupy można niekiedy
uzyskać wyniki lepsze niż wynikające z tablicy ekspansji.
Przykład.
Liczba 715 zapisana za pomocą potęg dwójki w sposób normalny ma postać:
715 = 512 + 128 + 32 + 8 + 1 = 512 + 256 – 64 + 8 + 2 + 1 = ...
Jakby nie ustawiać, zawsze wychodzi 5 sumatorów.
Po zastosowaniu faktoryzacji otrzymujemy:
715 = 5*11*13 = 55*13 = 65*11 = 5*143
Odpowiedni algorytm wyszukuje najlepszą kombinację czynników
pierwszych i mamy:
715 = 65*11 = (64 + 1)*(8 + 2 + 1)
Efekt widać na pierwszy rzut oka – ilość sumatorów z 5 zmalała do 3.
2005.12.22
Maciej Piotr Jankowski
9
Faktoryzacja – cz. 2.
Uwagi:
Rozkład na czynniki pierwsze uzyskałem stosując metodę Monte Carlo.
Najbardziej złożonym elementem tej części projektu jest funkcja
generująca wszystkie możliwe iloczyny czynników pierwszych i licząca
zarazem ich minimalną realizację.
Należy zauważyć, że wśród czynników końcowego iloczynu tylko jeden z
nich może korzystać z wcześniej zrealizowanych współczynników – reszta
musi być tworzona z potęg dwójki, gdyż tylko wtedy taki iloczyn będzie
możliwy w realizacji.
2005.12.22
Maciej Piotr Jankowski
10
Wyniki testów
Testy zostały przeprowadzone na zupełnie losowych danych
wygenerowanych przez program gen_filtr. Wyniki są uśrednione z 5
przykładów dla każdego przypadku.
2005.12.22
współczynników
sumatorów
Sumatorów/wsp.
10
14,6
1,46
20
23,2
1,16
30
30,8
1,03
40
37,8
0,95
50
47,4
0,95
60
54,2
0,9
70
62,6
0,89
80
70,8
0,89
90
80,8
0,9
100
86,4
0,86
Maciej Piotr Jankowski
11
Przykładowe realizacje
{3, 25, 75, 150,256}
X
4
2
8
75X
3X
25X
2005.12.22
2
Maciej Piotr Jankowski
150X
256
256X
12
Przykładowe realizacje – cz. 2.
{99, 715}
X
4
8
32
(faktoryzacja)
8
715X
8
99X
2005.12.22
Maciej Piotr Jankowski
13
Instrukcja obsługi programu
wybór wielkości
tablicy ekspansji
rozpoczyna
obliczenia
pasek postępu
pozwala na ponowne
obliczenia (np. po zmianie
wielkości tablicy)
parametry
wynikowe
okienko z
wynikami
Obsługa programu jest dość intuicyjna i myślę, że nie wymaga
dodatkowych wyjaśnień.
2005.12.22
Maciej Piotr Jankowski
14
Instrukcja obsługi programu – cz. 2.
Interpretacja wyników
Wyniki są wypisane w postaci sieci równań, które kompletnie opisują
graf powstały w wyniku działania algorytmu. W równaniach tych
pojawiają się współczynniki pomocnicze, które są używane w dalszej
części. Kolejność realizacji powinna się odbywać zgodnie z kolejnością
wypisania współczynników. Oraz zgodnie z zasadami arytmetyki (tzn. W
pierwszej kolejności wartości w nawiasach!).
Z pewnych względów nie są wypisywane współczynniki będące
potęgami dwójki.
Format danych wejściowych
W pierwszym wierszu pliku powinna znajdować się liczba współczynników, w następnych wierszach poszczególne współczynniki.
2005.12.22
Maciej Piotr Jankowski
15
Instrukcja obsługi programu - cz.3.
Obsługa programu gen_filtr.exe
Program ten generuje losowe współczynniki filtru. Sposób użycia:
gen_filtr nazwa_pliku ilość_współczynników
2005.12.22
Maciej Piotr Jankowski
16
Podsumowanie
Informacje, które zawarłem w tej prezentacji opisują mój projekt oraz samą
istotę algorytmu Reduced Adder Graph bardzo powierzchownie. Problem
ten jest jednak na tyle złożony, że potrzeba znacznie więcej miejsca i czasu
żeby go opisać.
Wyniki, jakie uzyskałem przy pomocy tego programu wskazują, że
rzeczywiście warto jest się zainteresować tego typu rozwiązaniem, gdyż
dla większej ilości współczynników otrzymujemy graf, w którym na każdy
współczynnik przypada mniej niż jeden sumator – to tak, jakby każdą
liczbę dało się zapisać za pomocą sumy dwóch potęg dwójki.
2005.12.22
Maciej Piotr Jankowski
17