Metody mnożenia liczb ze znakiem w U2

advertisement
Propozycja metody mnoŜenia liczb ze znakiem
Sławomir Gryś
Politechnika Częstochowska, Wydział Elektryczny
Abstract:
An efficient technique of signed binary multiplication using unsigned multiply
instruction was presented in this paper. A performance of the proposed technique
was compared to the software emulated versions of classical techniques such as:
radix-2 Booth method, reversal of sign method (negative to positive conversion)
and sign extension method. Numerous examples were provided to show the
efficiency of the technique in the context of practical software implementation. The
proposed algorithm is suitable for embedded systems based on the widespread
microprocessors/microcontrollers which have an unsigned multiplication in their
instruction set but they lack signed multiply instruction. The samples of code
presenting the solution of signed multiplication problem using various techniques
were prepared in an assembly language for MCS 8051 compatible
microcontroller. The comparison of the performance of algorithms was carried out
also for 8051 core treated as reference microcontroller architecture but the
obtained conclusions are potentially general and not only limited to this
microcontroller.
Keywords:
arithmetic algorithms, signed multiplication, embedded systems, assembly
language
1. Wprowadzenie
Istnieją zastosowania soystemów wbudowanych (ang. embedded systems), w
których zdolność do wykonywania działań arytmetycznych przez mikrprocesor,
będący „sercem” systemu wbudowanego, lub specjalizowany układ arytmetyczny,
odgrywa kluczową rolę w zapewnieniu wymaganej funkcjonalności i wydajności
urządzenia. Do tego obszaru zastosowań naleŜy zaliczyć, m.in.: systemy
pomiarowo-sterujące, urządzenia medyczne, inteligentne sterowniki silników,
systemy bezpieczeństwa, układy elektroniki komercyjnej, itp. Jednym z
elementarnych działań arytmetycznych jest mnoŜenie liczb ze znakiem, zapisanych
w powszechnie stosowanym kodzie uzupełnień do dwóch (ang. two’s complement).
Rozwiązania czysto sprzętowe w formie układów mnoŜących wykonanych w
technologii VLSI, przedyskutowano w wielu publikacjach, m.in. [1-6]. Przykładowo
do najszybszych zalicza się układ mnoŜący Wallace [7-9], czy rozwiązanie
zaproponowane przez Baugh’a i Wooley’a w pracy [10].
Niniejszy artykuł poświęcono programowym rozwiązaniom operacji mnoŜenia,
przeznaczonym do implementacji w relatywnie prostych systemach wbudowanych
wyposaŜonych w 8/16 bitowe mikroprocesory, które nie posiadają w liście
rozkazów mnoŜenia liczb ze znakiem. Reprezentantami tej grupy mikroprocesorów
są m.in.: 8051, Freescale 68HC08 i HCS12, Atmel ATtiny, Zilog eZ8core!,
STMicroelectronics ST7, Microchip PIC16/18, Texas Instruments MSP430, NEC
78K0S/0R i in.
Zadanie mnoŜenia liczb ze znakiem, przykładowo c=a*b, przy spełnieniu
poniŜszych załoŜeń:
- mnoŜna, mnoŜnik i wynik mnoŜenia są przechowywane za pomocą k bitów,
- szerokość rejestru (sprzętowa długość słowa) jest równa k bitów,
- wynik mieści się w zakresie liczbowym wynikającym z ilości przyjętych k bitów,
jest realizowalne bezpośrednio za pomocą rozkazu mnoŜenia liczb bez znaku.
Ten przypadek obrazuje poniŜszy fragment programu napisany w języku C –
podpunkt a.
a)
b)
void main()
void main()
{
{
int a;
int a;
int b;
int b;
int c;
long c;
c=a*b;
c=a*b;
}
}
W wielu praktycznych sytuacjach trudno jednak przyjąć tak optymistyczne
załoŜenia. Nie mogąc przewidzieć zakresu zmienności argumentów wejściowych,
powstaje ryzyko przekroczenia przyjętego zakresu liczbowego przez wynik
mnoŜenia i w konsekwencji utratę danych. Sposobem na uniknięcie takiej sytuacji
jest zarezerwowanie dla wyniku większej liczby bitów niŜ dla argumentów
wejściowych. Oznacza to przyjęcie róŜnych typów dla danych numerycznych
– podpunkt b, co komplikuje niestety kwestię realizacji mnoŜenia na poziomie listy
rozkazów procesora.
Języki wysokiego poziomu uŜywają róŜnych, klasycznych technik emulacji
programowej brakującego rozkazu mnoŜenia liczb ze znakiem. Są to m.in.:
kodowanie Bootha, rozszerzenie znaku, konwersja liczb ujemnych do dodatnich.
Artykuł w dalszej części jest zorganizowany wg następującego planu. Rozdział
2 prezentuje podstawę matematyczną proponowanego algorytmu zakładając, Ŝe
argumenty wejściowe jak i wynik mnoŜenia jest zapisany w kodzie uzupełnienia do
dwóch. RównieŜ w tym rozdziale opisano moŜliwe uproszczenia złoŜoności
algorytmu. W celu porównania właściwości proponowanej metody z innymi,
powszechnie stosowanymi, rozwiązaniami stworzono w języku asemblerowym
podprogramy, realizujące zadanie mnoŜenia dwóch 8 bitowych liczb ze znakiem.
Krótki opis trzech referencyjnych metod wraz z podprogramami i wynikami
porównania opisano w rozdziale 3. Rozdział 4 zawiera wnioski z badań.
RozwaŜania teoretyczne zostały zilustrowane licznymi przykładami liczbowymi w
celu ułatwienia ewentualnej analizy zamieszczonych listingów podprogramów.
2. Propozycja metody mnoŜenia liczb ze znakiem
2.1. Wyprowadzenie metody
Niech A i B oznaczają liczby ze znakiem w kodzie uzupełnienia do dwóch,
oznaczanych dalej U2, składających się z n bitów w części całkowitej i m w części
ułamkowej. Ilość bitów A i B w ogólnym przypadku moŜe się róŜnić, stąd A(n1, m1)
i B(n2, m2). Wartości liczb są określone następująco:
n1−2
~
AU2 = −a n1-1 ⋅ 2 n1−1 + ∑ ai ⋅ 2 i = − a n1-1 ⋅ 2 n1−1 + A
B U2 = −bn 2-1 ⋅ 2
n 2 −1
i = − m1
n 2− 2
(1)
~
+ ∑ bi ⋅ 2 i = −bn2-1 ⋅ 2 n2−1 + B
i =−m2
~
~
Symbole A i B reprezentują składową dodatnią liczb A i B. UŜywając oznaczeń
jak w (1) iloczyn A i B moŜe być zapisany:
~
~
AU2 ⋅ BU2 = − an1-1 ⋅ 2n1−1 + A ⋅ − bn2-1 ⋅ 2n2−1 + B =
~
~
= an1-1 ⋅ 2n1−1 ⋅ bn2-1 ⋅ 2n2−1 + an1-1 ⋅ 2n1−1 ⋅ B + bn2-1 ⋅ 2n2−1 ⋅ A +
(2)
~ ~
~
~
+ A ⋅ B − 2 ⋅ bn2-1 ⋅ 2n2−1 ⋅ A − 2 ⋅ an1-1 ⋅ 2n1−1 ⋅ B =
~
~
= ABIN ⋅ BBIN − bn2-1 ⋅ 2n2 ⋅ A − an1-1 ⋅ 2n1 ⋅ B =
= pseudoiloczyn − (korekcja_ A + korekcja_ B)
MoŜna zauwaŜyć, Ŝe wyznaczanie wyniku mnoŜenia odbywa się dwuetapowo.
W pierwszym kroku mnoŜone liczby A i B są traktowane jak liczby bez znaku
wyraŜone w naturalnym kodzie dwójkowym. Taki wstępny wynik mnoŜenia
ABIN·BBIN nazwano “pseudoiloczynem”. Jeśli obie liczby A i B są dodatnich znaków,
wówczas “pseudoiloczyn” staje się wynikiem mnoŜenia. W najgorszym przypadku
dwie dodatkowe operacje odejmowania są konieczne, nazwane “korekcja_A” i
“korekcja_B” w celu otrzymania prawidłowego wyniku. Wspomniane korekcje
obliczane są jako iloczyn trzech składników:
(
)(
)
~
korekcja _ A = bn 2-1 ⋅ 2 n 2 ⋅ A
n1 ~
korekcja _ B = a n1-1 ⋅ 2 ⋅ B
(3)
Działanie metody zobrazowano przykładem liczbowym.
Przykład 1. Wyznaczyć iloczyn liczb A i B wyraŜonych za pomocą najmniejszej
ilości bitów.
a) A=-8DEC B=-3DEC
b) A =-3.5DEC B=+1.5DEC
Rozwiązanie
A =1000U2
n1=4 m1=0
Rozwiązanie
A =100.1U2
n1=3 m1=1
B=101U2
n2=3 m2=0
B=01.10U2
n2=2 m2=2
1
1 0 0 0 = AU2
*
1 0 1 = BU2
*
0
0 0 0 0
0 1 1 0. 1
− 0 0 0 0. 0
1
0
− 1 1 0 0. 0
1 0 1 0. 1
0
1
0 = pseudoiloc zyn
0 = korekcja_A
0 = korekcja_B
+
1 0 1 0 0 0 = pseudoiloc zyn
− 0 0 0 0 0 0 = korekcja_A
− 0 1 0 0 0 0 = korekcja_B
0 1 1 0 0 0 U2
0. 1 = AU2
1 0 = BU2
0
1
1 0 0 0
0 0 0 0
+ 1 0 0 0
0
0 1.
0 0
0 0
0 1
1
1 0
0 U2
gdzie
gdzie
korekcja_ A = 1 ⋅ 2 3 ⋅ 000 = 000000
korekcja_ B = 1 ⋅ 2 4 ⋅ 01 = 010000
A _ correction = 0 ⋅ 2 2 ⋅ 00 .1 = 0000 .000
B _ correction = 1 ⋅ 2 3 ⋅ 1.10 = 1100 .000
AU2·B U2=011000U2=+24DEC
AU2·B U2=1010.110U2=-5.25DEC
2.2. Implementacja metody
W praktycznych zastosowaniach mnoŜone liczby są zwykle przechowywane w
pamięci procesora jako stałe lub liczby tego samego formatu, zatem n1=n2=n
i m1=m2=m. Równanie (2) przybiera wówczas uproszczoną postać:
~
~
~
~
(4)
AU2 ⋅ BU2 = − an-1 ⋅ 2 n −1 + A ⋅ (− bn-1 ⋅ 2 n −1 + B ) = ABIN ⋅ BBIN − 2 n ⋅ bn-1 ⋅ A + a n -1 ⋅ B
(
)
(
)
Wymagana liczba bitów wyniku mnoŜenia jest równa 2⋅(n+m), jeśli kaŜda z
mnoŜonych liczb jest rozmiaru n+m. Korekcje “pseudoiloczynu” (warunkowe
odejmowania, zaleŜne od znaków A i B) są wykonywane wyłącznie na starszej
~
~
części “pseudoiloczynu”, zgodnie ze wzorem (4), w którym człon bn-1 ⋅ A
+ an -1 ⋅ B
n
jest skalowany przez współczynnik 2 . Kolejna moŜliwa redukcja złoŜoności
algorytmu wymaga rozwaŜenia kombinacji znaków liczb. Jak zostało zaznaczone
wcześniej, jeśli A i B są liczbami dodatnimi korekcje pseudoiloczynu stają się
zbyteczne. Natomiast, jeśli liczby są róŜnych znaków, wtedy naleŜy wykonać jedną
z dwóch korekcji. Następujące cechy rzeczywistego procesora: stała, określona
długość rejestrów, automatyczne wypełnianie zerami bitów o większych wagach od
najstarszego bitu, określonego argumentem wejściowym rozkazu procesora
pozwalają na dalszą redukcję złoŜoności metody, w kontekście jej implementacji.
Jeśli zauwaŜyć dodatkowo, Ŝe najstarszy bit dodatniej liczby w kodzie uzupełnień
~
~
do dwóch jest równy zero, wtedy A i B w wyraŜeniach na „korekcję_A” i
„korekcję_B” mogą być zastąpione przez A i B:
(5)
AU2 ⋅ BU2 = ABIN ⋅ BBIN − 2 n ⋅ (bn-1 ⋅ A + a n-1 ⋅ B )przy pewnych załoŜeniach
Ta sytuacja została pokazana w przykładzie 2, w którym podkreślono bity
automatycznie ustawiane przez procesor na zero (zerowane).
Przykład 2. Wyznaczyć iloczyn liczb A i B przyjmując n=3 oraz m=1 do wyraŜania
wartości liczb. Niech A = -3.5DEC i B = 3.0DEC
Rozwiązanie
A =100.1U2
B =011.0U2
a) według wzoru (4)
+
0
− 0
− 0
1
0
0
0
1
1
1
0
1
0
1
0
1
* 0
0
1 0
0 0
0 0
1 0
0 0
0 0
1 0
0
1
0
0
1
1.
0.
0.
1.
b) według wzoru (5)
0. 1 = AU2
1. 0 = BU2
0 0
1
1
0
0
1
0 = pseudoprod uct
0 = A_correctio n
0 = B_correctio n
0 U2
+
0
− 0
− 0
1
0
0
0
1
1
1
0
1
0
1
0
1
* 0
0
1 0
0 0
0 0
1 0
0 0
0 0
1 0
0
1
0
0
1
0. 1 = AU2
1. 0 = BU2
0 0
1
1.
0.
0.
1.
1
0
0
1
0 = pseudoprod uct
0 = A_correctio n
0 = B_correctio n
0 U2
gdzie
gdzie
A _ correction = 0 ⋅ 2 3 ⋅ 00 .1 = 00000 .00
B _ correction = 1 ⋅ 2 3 ⋅ 11 .0 = 11000 .00
A _ correction = 0 ⋅ 2 3 ⋅100.1 = 000000.00
B _ correction = 1 ⋅ 2 3 ⋅ 011.0 = 011000.00
AU2·B U2=110101.10U2=-10.5DEC
AU2·B U2=110101.10U2=-10.5DEC
Wykonując obliczenia zarówno wg zaleŜności (4) i (5) otrzymano identyczny
wynik, zgodnie z oczekiwaniami. Niewielka modyfikacja uczyniona w (4) i
pokazana w (5) jest słuszna równieŜ w przypadku, gdy obie liczby są ujemne.
PowyŜsze stwierdzenie moŜna udowodnić na podstawie następującej obserwacji.
Mianowicie, jeśli bit poŜyczki z najstarszej pozycji wyniku zostanie odrzucony to
prawdą jest, Ŝe
bit-0-0=bit-1-1=bit
(6)
Przykład 3 pokazuje zasadę działania proponowanej metody właśnie dla przypadku
obu liczb ujemnych. Jak i poprzednio, równieŜ otrzymano prawidłowy wynik
zarówno obliczając iloczyn wg wzoru (4) jak i (5).
Przykład 3. Wyznaczyć iloczyn liczb A i B przyjmując n=4 i m=0 do wyraŜania
wartości liczb. Niech A =-6DEC i B =-3DEC.
Rozwiązanie
A =1010U2
B =1101U2
a) według wzoru (4)
*
+
1
− 0
− 0
0
1
0
0
1
0
1
0
0
1
0
0
0
0
1
0
0
1
1
1
1
1
0
1
0
0
0
0
0
0
1
0
0
0
0
0
0
0
b) według wzoru (5)
1 0 = AU2
0 1 = B U2
1 0
0
1
0
0
1
0 = pseudoprod uct
0 = A_correctio n
0 = B _correctio n
0 U2
+
1
− 1
− 1
0
1
0
0
1
0
1
0
0
1
0
0
1
* 1
1
0 0
0 1
1 0
0 0
0 0
1 0
1 0
0
1
0
0
0
1 0 = AU2
0 1 = B U2
1 0
0
0
0
0
0
1
0
0
1
0 = pseudoprod uct
0 = A _correctio n
0 = B_correctio n
0 U2
gdzie
gdzie
A _ correction = 1 ⋅ 2 4 ⋅ 010 = 0100000
B _ correction = 1 ⋅ 2 4 ⋅ 101 = 0100000
A _ correction = 1 ⋅ 2 4 ⋅ 1010 = 10100000
B _ correction = 1 ⋅ 2 4 ⋅ 1101 = 11010000
AU2·BU2=00010010U2=+18DEC
AU2·BU2=00010010U2=+18DEC
3. Porównanie właściwości róŜnych metod
3.1. Metody klasyczne
W literaturze znane jest wiele sposobów mnoŜenia liczb ze znakiem
realizowanych w technice programowalnych układów cyfrowych [1-10] jak i
programowo [11-15]. Z grupy rozwiązań programowych, trzy z wielu moŜliwych
zostało wybranych jako metody względem, których zostaną przedyskutowane
właściwości metody proponowanej. Są to:
• klasyczna metoda Bootha,
• metoda rozszerzenia znaku,
• metoda konwersji liczb ujemnych na dodatnie.
UwaŜna analiza kodu maszynowego wygenerowanego przez kompilatory
języków wysokiego poziomu, takie jak: C, BASIC, pokazuje, Ŝe powyŜsze metody
są powszechnie uŜywane. Przykładowo, metoda Bootha jest zalecana przez firmę
Atmel dla niektórych z jej 8/16 bitowych mikrokontrolerów [16]. Zasada działania
wybranych do testowania metod zostanie zaprezentowana skrótowo, gdyŜ zdaniem
autora niniejszego artykułu, są one wystarczająco scharakteryzowane w literaturze.
Generalnie, oryginalna metoda Bootha [17], jej modyfikacje, np. algorytm
McSorley’a [18] i uogólnienie dla kodowania wielobitowego [19] i wiele innych
[20-24], są oparte na analizie grupy bitów. Podstawowa metoda Bootha oblicza
iloczyn liczb przez cykliczne przesuwanie mnoŜnika i dodawanie lub odejmowanie
mnoŜnej, zaleŜnie od kombinacji dwóch sąsiednich bitów mnoŜnika (patrz punkt nr
3 i 4 algorytmu przedstawionego poniŜej). Jedną z moŜliwych implementacji,
wyraŜonej w stylu zbliŜonym do języka niskiego poziomu, zaproponowano w [14]:
1. zeruj starszą część wyniku i bit pomocniczy;
2. za młodszą część wyniku przyjmij mnoŜnik;
3. jeśli poprzedni najmłodszy bit mnoŜnika (bit pomocniczy) jest ustawiony,
dodaj mnoŜną do starszej części wyniku;
4. jeśli bieŜący najmłodszy bit mnoŜnika jest ustawiony, odejmij mnoŜną od
starszej części wyniku;
5. przesuń w prawo młodszą część wyniku, wychodzący bit jest wpisywany
do bitu pomocniczego;
6. przesuń w prawo starszą część wyniku z powieleniem bitu znaku
(najstarszy bit), wychodzący bit jest wpisywany na pozycję najstarszego
bitu młodszej części wyniku;
7. powtarzaj czynności od punktu 3 dla wszystkich bitów mnoŜnika.
Działanie powyŜszego algorytmu zobrazowano w przykładzie 4, w którym
pomocniczy bit został wyróŜniony podkreśleniem. Co więcej, najmłodszy bit
młodszej części wyniku oraz bit pomocniczy są ujęte w nawias klamrowy a ich
k
wartości są brane pod uwagę w punktach 3 i 4 algorytmu. Symbolem ‘ →
’
oznaczono operację przesunięcia w prawo iloczynu zgodnie z punktem 4, gdzie k
jest numerem porządkowym przesunięcia.
Przykład 4. Wyznaczyć iloczyn A i B oraz B i A stosując metodę Bootha.
Niech A =-3DEC i B =+3DEC
Rozwiązanie
A =1101U2
a) A·B
B =0011U2
b) B·A
0011 = B U2
1101 = AU2
* 0011 = BU2
0000001{10}
−
1101
1
0011001{10} 
→
2
0001100{11} 
→
0000110{01}
+ 
1101
3
1101110{01} 
→
*
1101 = AU2
0000110 {10}
−
0011
1
→
1101110 {10} 
1110111 {01}

0011
2
0001111 {01} 
→
0000111 {10}
+
−
4
1110111{00} 
→
11110111U2
0011
3
1101111 {10} 
→
4
1110111 {11} 
→
11110111 U2
AU2·B U2= BU2·A U2=11110111U2=-9DEC
Metoda rozszerzania znaku polega na zapisaniu mnoŜnej i mnoŜnika za pomocą
podwójnej ilości bitów. Dodatkowe bity przyjmują wartość najbardziej znaczącego
bitu, czyli dla U2 bitu znaku. Nie powoduje to zmiany wartości liczb. Tak
przygotowane liczby, są mnoŜone jak liczby dodatnie bez znaku. Tylko mniej
znacząca część wyniku niesie uŜyteczną informację i stanowi prawidłowy wynik
mnoŜenia. Starsza część musi być odrzucona. PowyŜszą zasadę ilustruje przykład 5,
w którym dodatkowe bity (bity rozszerzenia) zostały podkreślone ‘_’ a nadmiarowe
bity wyniku przekreślono ‘/’.
Przykład 5. Wyznaczyć iloczyn liczb A i B metodą rozszerzania znaku.
Niech A =-4DEC i B =+5DEC.
Rozwiązanie
A =1100U2
B =0101U2
1
∗ 0
1
0 0
+ 1 1 1
0 0 0 0
1/ 0/ 0/ 1
1
0
1
0
1
0
1
1
0
1
0
1
0
1
1
0
1
0
1
0
0
1
0
1
0
0
0
1
1
1
1
0
0
0
1
0 0 = AU2
0 1 = BU2
0 0
0
0 0 U2
AU2·B U2=11101100U2=-20DEC
Metoda zmiany znaku wykorzystuje zasadę konwersji kaŜdej liczby ujemnej do
dodatniej. Następnie są one mnoŜone jak liczby dodatnie bez znaku. Jeśli oryginalne
znaki mnoŜnej i mnoŜnika były róŜne, naleŜy dodatkowo zmienić znak otrzymanego
wyniku tak, aby otrzymać wartość liczby w kodzie uzupełnień do dwóch. Metoda
jest intuicyjna i nie wymaga dodatkowego ilustrowania przykładem.
3.2. Przyjęte załoŜenia do analizy porównawczej
Porównanie właściwości testowanych algorytmów wymaga przyjęcia załoŜeń,
co do architektury procesora, najlepiej abstrakcyjnej maszyny referencyjnej. Z
praktycznego punktu widzenia, dobrze byłoby, aby cechy tej maszyny, występowały
w wielu rzeczywistych procesorach z wymienionej w rozdziale pierwszym grupy
procesorów. W artykule zdecydowano dokonać oceny algorytmów dla architektury
zgodnej z listą rozkazów 8051. Podstawową przesłanką, która zdecydowała o
wyborze 8051 jako maszyny referencyjnej była jej duŜa popularność i silna pozycja
na rynku systemów wbudowanych, przy czym pod pojęciem 8051 naleŜy rozumieć
klasyczną architkturę MCS 8051.
Analiza działania algorytmów została wykonana przy następujących
załoŜeniach:
• argumenty wejściowe A i B to liczby 8 bitowe przechowywane w rejestrach A i B;
• iloczyn jest przechowywany w parze rejestrów B i A, gdzie B – bardziej
znaczący bajt (MSB), A – mniej znaczący bajt (LSB).
Podprogramy zostały starannie przygotowane w języku asemblerowym procesora
8051 dla czterech metod, nazwanych: “m_proponowana”, “m_rozszerzania_znaku”,
“m_zmiany_znaku” i “m_Bootha”. Zostały one umieszczone w Tabeli 1 wraz ze
wspólnym fragmentem kodu, odpowiedzialnym za przygotowanie danych
wejściowych w rejestrach A i B.
Tabela 1. Listingi podprogramów mnoŜenia liczb ze znakiem w języku asemblerowym
mikroprocesora 8051
3.3. Wyniki porównania
Obszerność programu musi być brana pod uwagę szczególnie w systemach
z niewielką ilością pamięci, stąd rozmiar kodu otrzymanego w wyniku asemblacji
kodu źródłowego jest jednym z istotnych ilościowych wskaźników oceny
algorytmu. Rozmiar kaŜdego z podprogramów wyraŜony w bajtach został
przedstawiony na rys. 1. Metoda proponowana charakteryzuje się najmniejszą
zajętością pamięci programu.
Rysunek 1. Rozmiar kodu maszynowego, bajty
Innym, istotnym wskaźnikiem jest czas wykonania, który jest skorelowany z
liczbą cykli mikroprocesora. Ilość cykli została wyznaczona dla zadanych wartości
A i B, biorąc pod uwagę moŜliwe kombinacje znaków. Rysunek 2 przedstawia
wyniki analizy. Bardzo widoczna róŜnica pomiędzy wynikiem dla metody Bootha a
pozostałymi wynika z jej w pełni programowej emulacji. Postałe trzy metody
korzystają z rozkazu mnoŜenia liczb bez znaku, realizowanego sprzętowo przez
wbudowany w procesor układ mnoŜący.
Rysunek 2. Względny czas wykonania (cykle procesora) dla róŜnych kombinacji znaków
mnoŜnej i mnoŜnika, gdzie “w.c.” znaczy “worst case (mnoŜnik=-1DEC)” i “b.c.” znaczy “best
case (mnoŜnik=0)”
Brak wyników „słupków” na rysunku 2, dla niektórych kombinacji znaków mnoŜnej
i mnoznika odnośnie metody Bootha, jest spowodowany niemoŜnością wyraŜenia
liczby o zadanym znaku dla przyjętego przypadku „w.c.” lub „b.c.”. PoniewaŜ w
pewnych przypadkach czas wykonania algorytmu zaleŜy od konkretnych wartości A
i B, dodatkowo na rys. 2 przedstawiono wartość przeciętną, liczoną jako średnia
arytmetyczna czterech przypadków kombinacji znaków. Jest to wyjątkowo istotne
dla metody Bootha, w której niektóre partie kodu maszynowego są wykonywane
warunkowo, zaleŜnie od wartości bieŜącego i poprzedniego bitu mnoŜnika. Punkty 3
i 4 metody Bootha (opisanej w podrozdziale 3.1), w kaŜdym obiegu pętli, są
pomijane, jeśli mnoŜnik wynosi 0 i są wykonane, jeśli aktualny bit mnoŜnika jest
równy 1. Podobnie jak poprzednio, proponowana metoda charakteryzowała się
najkrótszym czasem wykonania. Dla niektórych kombinacji znaków czasy były
porównywalne jak dla „metody zmiany znaku”.
Dodatkowo, na rys. 3 przedstawiono zapotrzebowanie na rejestry
mikroprocesora, czy w ogólnym przypadku komórki pamięci wewnętrznej. Jak
moŜna zauwaŜyć z rysunku otrzymany wynik dla “metody proponowanej” był
nieznacznie gorszy niŜ dla “metody zmiany znaku” a porównywalny z „metodą
Bootha”.
Rysunek 3. Liczba uŜytych rejestrów (komórek pamięci) procesora
4. Wnioski
Na podstawie otrzymanych wartości przyjętych wskaźników oraz właściwości
metod mnoŜenia scharakteryzowanych w poprzednim rozdziale moŜna wyciągnąć
pewne wnioski. Zaproponowana w artykule metoda charakteryzuje się pewnymi
zaletami w porównaniu do innych metod (przy załoŜeniach przyjętych w
podrozdziale 3.2.) Oto one:
• najmniejszy rozmiar kodu (najmniejsza zajętość pamięci programu);
• najkrótszy czas wykonania (najszybsza metoda);
• prawidłowy wynik mnoŜenia dla dowolnej kombinacji liczb w przeciwieństwie
do metody Bootha, która nie działa prawidłowo dla mnoŜnej postaci 10...0U2;
• brak konstrukcji typu „pętla” w przeciwieństwie do metody Bootha;
• mniejsza zajętość rejestrów (pamięci w ogólnym przypadku) w porównaniu do
metody rozszerzonego znaku.
Do wad metody proponowanej naleŜy zaliczyć:
• konieczność wykonania dwóch lub mniej korekcji wyniku (odejmowań)
“pseudoiloczynu”, będącego wynikiem iloczynu liczb potraktowanych jak liczby
bez znaku;
• lista rozkazów procesora musi obejmować operację mnoŜenia bez znaku (w
przeciwnym razie niezbędna jest jej programowa emulacja);
• zmienny czas wykonania (cykle procesora) zaleŜny od kombinacji znaków liczb,
przeciwnie niŜ w metodzie rozszerzonego znaku.
Z powyŜej wymienionych cech nasuwa się zasadniczy wniosek:
Implementacja programowa proponowanej metody mnoŜenia liczb ze znakiem w
języku asemblerowym lub pośrednio w językach wysokiego poziomu, np. C, moŜe
znacząco zwiększyć wydajność oprogramowania systemów wbudowanych przez
zmniejszenie czasu wykonania oraz zajętości pamięci. Metoda nie ma istotnych wad
i ograniczeń, stąd moŜe być zastosowana w kaŜdym systemie pod warunkiem, Ŝe
procesor posiada w zestawie instrukcji rozkaz mnoŜenia liczb bez znaku.
Potencjalny zakres zastosowań metody to systemy wbudowane, w których mnoŜenie
arytmetyczne liczb ze znakiem stanowi istotny element oprogramowania, a ryzyko
wystąpienia nadmiaru arytmetycznego jest nieakceptowane i w rezultacie wynik
mnoŜenia musi być wyraŜony w formacie stałopozycyjnym podwójnej szerokości w
stosunku do rozmiaru argumentów wejściowych.
Bibliografia
[1] Wallace C. S. A suggestion for a fast multiplier. IEEE Trans. Comput. No 13
(2)/1964, 1964, s. 14-17.
[2] Dadda L. Some schemes for parallel multiplier. Alta Frequenza, Vol. 34, 1992,
s. 349-356.
[3] Millar B., Madrid P., Swartzlander E. A fast hybrid multiplier combining booth
and Wallace/ DADDA algorithms. The 35th Midwest Symposium on Circuits
and Systems, 1992, s. 158-165.
[4] Ercegovac M. D., et al. Fast multiplication without carry-propagate addition.
IEEE Trans. Comput. Vol. 39, No 11/1990, 1990, s. 1385-1390.
[5] Dae Won Kim, Jun Rim Choi. Variable radix-2 multibit coding for 400
Mpixel/s DCT/IDCT of HDTV video decoder. Integration, the VLSI journal,
Vol. 35, 2003, s. 47-67.
[6] Li C. W., Wah B. W. Optimal bit-level processor arrays for matrix
multiplication. Proc. of the 11th International Conference on Systems
Engineering, 1996, s. 596-601.
[7] Smith S. C., et al. NULL convention multiply and accumulate unit with
conditional rounding, scaling, and saturation. Journal of Systems Architecture,
Vol. 47, 2002, s. 977-998.
[8] da Costa E., Monteiro J., Bampi S. A new array architecture for signed
multiplication using Gray encoded radix-2m operands. Integration the VLSI
journal, Vol. 40, 2007, s. 118-132.
[9] Yu Z., Wasserman L., Willson A. A painless way to reduce power by over 18%
in booth-encoded carry-save array multipliers for DSP. Workshop on Signal
Processing Systems, 2000, s. 571–580.
[10] Baugh C. R., Wooley B. A. A two’s complement parallel array multiplication
algorithm. IEEE Transactions on Computers. C-22, December 1973, p. 10451047.
[11] Omondi A. R. Computer Arithmetic Systems, Algorithms, Architecture and
implementations. Series in Computer Science Prentice-Hall International,
Englewood Cliffs, New York, 1994.
[12] Parhami B. Computer Arithmetic. Algorithms and Hardware Designs. Oxford
University Press, New York, 2000.
[13] Koren I. Computer Arithmetic Algorithms. A. K. Peters, Natick, MA, 2002.
[14] Gryś S. Arytmetyka komputerów – w praktyce. Wyd. Naukowe PWN,
Warszawa, 2007.
[15] Biernat J. Metody i układy arytmetyki komputerowej. Wyd. Politechniki
Wrocławskiej, Wrocław, 2001.
[16] Booth A. D. A signed binary multiplication technique. Journal of Applied
Mathematics, Vol. 4, No 2/1951, 1951, s. 236–240.
[17] McSorley O.L. High speed arithmetic in binary computers. Proceedings of
IRE, January 1961, s. 67-91.
[18] Sam H., Gupta A. A generalized multibit coding of two’s complement binary
numbers and its proof with application in multiplier implementation. IEEE
Trans. Comput., Vol. 39, No 8/1990, 1990, s. 1006-1015.
[19] Efstathiou C., Vergos H. Modified booth 1’s complement and modulo 2n-1
multipliers. The 7th IEEE International Conference on Electronics Circuits and
Systems, 2000, s. 637-640.
[20] Gallagher W., Swartzlander E. High radix booth multipliers using reduced area
adder trees. The 28th Asilomar Conference on Signals, Systems and Computers,
1994, s. 545-549.
[21] Goldovsky A., et al. Design and implementation of a 16 by 16 lowpower two’s
complement multiplier. IEEE Int. Symp. Circuits Syst., 2000, s. 345-348.
[22] Seidel P., McFearin L., Matula D. Binary multiplication radix-32 and radix256. 15th Symposium on Computer Arithmetic, 2001, s. 23-32.
[23] Cherkauer B., Friedman E. A hybrid radix-4/radix-8 low power, high speed
multiplier architecture for wide bit widths. IEEE Int. Symp. Circuits Syst.,
1996, s. 53-56.
[24] Wang Y., Jiang Y., Sha E. On area-efficient low power array multipliers. The
8th IEEE International Conference on Electronics, Circuits and Systems, 2001,
s. 1429-1432.
Download