Usiłuję zaprojektować równoległy sumator prefiksów dla sumatora opartego na negabinary. Negabinary to podstawa zamiast znanego binarnego base . Każdy 1-bitowy sumator generuje sumę i dwa (zamiast jednego w formacie binarnym) przeniesienia przechodzą do następnego sumatora.
Aby przyspieszyć dodawanie, chcę użyć równoległej struktury przedrostka, takiej jak podana poniżej struktura Ladnera-Fischera. Znam funkcjonalność fioletowej komórki w systemie binarnym, ale nie jestem pewien, jak mógłbym uzyskać tę samą funkcjonalność w systemie negabinarnym.
Powodem, dla którego to robię, jest po prostu dla zabawy, nie znalazłem jeszcze żadnych zastosowań dla negabary.
Wzory do obliczania sumy i przenosi:
Struktura drzewa Ladner-Fischera:
Jeśli coś jest niejasne, nie wahaj się zapytać.
źródło
Odpowiedzi:
Prawdopodobnie spędziłem więcej czasu na tym pytaniu niż powinienem, ale oto moje ustalenia.
Nie mogę znaleźć żadnego przykładu „czystego” równoległego sumatora przedrostków dla liczb ujemnych. Myślę też, że to otwarty problem, ponieważ nie widziałem żadnego dowodu, że nie jest to możliwe.
Najbliżej, jak mogę cię zdobyć, jest zastosowanie dwuetapowego negatywnego dodatku negabinarnego (często w literaturze skróconego nnba). Opiera się na następującej właściwości:
Niech i . Są to w zasadzie operacje XOR z odpowiednio i . Następnie możesz to udowodnić g ( x ) = x n - 1 ¯ x n - 2 . . . x 1 ¯ x 0fa( x ) = xn - 1¯¯¯¯¯¯¯¯¯¯xn - 2. . . x1¯¯¯¯¯x0 sol( x ) = xn - 1xn - 2¯¯¯¯¯¯¯¯¯¯. . . x1x0¯¯¯¯¯
0xAA...AA
0x55...55
Gdzie lewa strona jest sumą ujemną , podczas gdy po prawej stronie jest normalną sumą binarną.+n b +
Suma ujemna może być po prostu odwrócona przy użyciu tej samej właściwości, ale z operandem zerowym:
Aby więc znaleźć sumę przy użyciu równoległych sumatorów prefiksów, możesz:
0xAA...AB
( ) przy użyciu sumatora równoległego prefiksu, uzyskując drugą sumę pośredniąW rzeczywistości próbowałem znaleźć „czysty” równoległy sumator prefiksów, ale uznałem, że jest to zbyt skomplikowane na czas, jaki chciałem na to poświęcić. Dlatego:
Cały punkt dodawania równoległych prefiksów polega na znalezieniu operacji która pozwala łatwo obliczyć (w tym przypadku 2) przenosi z tych bitów. Jako dodatkowe ograniczenie operacja musi być asocjacyjna, aby mogła być obliczana równolegle. Na przykład, w zasadzie wyklucza to dowolny operator NOT (który nie jest częścią podwójnej negacji). Na przykład: nie jest operatorem asocjacyjnym, ponieważ{ 0 , 1 }n× { 0 , 1 }n→ { 0 , 1 }n a ∘ b = a ⋅ b¯
Zauważ, że operator logiczny dla przeniesień w twoim pytaniu zawiera mieszane terminy i , co uniemożliwia użycie go takim, jakim jest. W przypadku pojedynczego przeniesienia w normalnym dodatku binarnym stało się całkiem oczywiste, jak skonstruować tego operatora, gdy myśli się o nim w kategoriach generowania i propagacji , ale wydaje się, że nie jest to takie oczywiste w przypadku przeniesień ujemnych. c - i ¯ c + ido+jado-ja¯¯¯¯¯ do-jado+ja¯¯¯¯¯
źródło