mul czy shl?

0

co jest lepsze?
mul = 10 cykli
czy przesuwanie w lewo na kazdy bit i dodawanie tego?

jak na logike to mul, bo procesor nie musi ciagle odczytywac instrukcji

zeby uzyc mul musze:
zaladowac eax
w zasadzie tylko 1 krok, moge mnozyc pamiec.

wynik mam w edx:eax
dodac eax do bufora, dodac przeniesienie do wyzszych adresow
dodac edx, i przeniesienie

natomiast shifty:

mov eax,dword [a]
mov ebx,[b]
petla:
xor edx,edx
shrd eax,edx,0...31 w zaleznosci czy ustawiony bit
dodac eax i carry
dodac edx i carry

jmp petla: //32 razy

co wg was jest lepsze i dlaczego?

a jak ma sie sprawa z dzieleniem?

0

praktycznie zawsze sprzętowo jest szybciej niż programowo. 10 cykli na dodawanie, czy 32 * kilka-kilkanaście cykli na pętlę - odpowiedź jest oczywista. to samo odnośnie dzielenia.

0

no tez tak mysle, ale na innym forum twierdza co innego.
jakby cykl cyklowi byl nierowny.

oczywiscie jesli mnoze przez potege liczby 2, to wiadomo ze shift.
jesli mnoznik zawiera wiecej niz 1 bit to juz sie nie oplaca.

procesor przez mul sam przesuwa i dodaje do edx:eax zaczynajac od 0, idealnie, dlaczego kilka osob twierdzi co innego. Nie znam sie na elektronice i nie wiem jak dziala procesor (no podstawy znam), wiec nie bede ocenial czy shift+add dzialaja szybciej czy nie.
Ale wydaje mi sie, ze w 1 cyklu proc moze wykonac czesciowo wiele instrukcji niezaleznych od siebie.
tzw pipelining.
tylko co jest szybsze, pipelining czy mul?

a dzielenie zajmuje przez div 41 cykli. A shiftami nie potrafie tego zapisac, help plz.

0

asmcoder, słuchaj. Na "innym" forum bodajże revolution odpowiada na każde pytanie "co jest szybsze" "it depends". Tu jest tak samo - jeżeli mnożymy przez stałą wartość, to czasami (dla potęgi dwójki i liczb relatywnie małych, tj. do około 2-4k) shl i friends okazują się szybsze, w innych przypadkach lepiej walnąć tego MULa. Z tego co widzę, to tutaj lepszy będzie MUL.
Tam bym ci tego nie napisał, bo mój angielski po prostu ssie ;)

0

tak mi sie zdaje, że nawet pipelining nie pomoże w porównaniu do mul. przecież jak porównywać polecenia to na tym samym sprzęcie. skoro mamy pipelining to i pętla i mul będą nim "przyspieszane" więc równie dobrze można go nie uwzględniać. z kolei też w pętli by trza zrobić shl, and, cmp, jz, shl, adc, adc i w najlepszym wypadku loop. dla dużych liczb są to w spokoju setki cykli więc o co tu w ogóle pytamy...

0

lepiej przesuwac pierwszy czlon w lewo, i dodawac w odpowiednia pozycje do resultu.
moze faktycznie jak sie postarac mul bylo by nieco szybsze, ale ten sposob jest bardziej uniwersalny i prostszy.
mul musisz mnozyc wszsytko przez wszystko, tutaj tylko dodajesz.

1 użytkowników online, w tym zalogowanych: 0, gości: 1