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