Szukam tabeli lub czegoś podobnego, który mógłby mi pomóc obliczyć wydajność kodu asemblera.
Jak wiem przesunięcie bitów wymaga 1 zegara procesora, ale naprawdę patrzę, ile kosztuje dodanie (odejmowanie powinno zająć to samo), mnożenie i jak przypuszczalnie obliczyć czas podziału, jeśli znam wartości, które dzielą.
Naprawdę potrzebuję informacji o wartościach całkowitych, ale mile widziane są również czasy wykonania zmiennoprzecinkowego.
Odpowiedzi:
Zasadniczo każda z tych operacji wymaga wykonania jednego cyklu zegara, jeśli argumenty znajdują się w rejestrach na różnych etapach potoku.
Co masz na myśli przez opóźnienie? Ile cykli operacji w ALU?
Ta tabela może być przydatna: http://www.agner.org/optimize/instruction_tables.pdf
Ponieważ współczesne procesory są super skalarne i mogą być wykonywane poza kolejnością, często można uzyskać całkowitą liczbę instrukcji na cykl przekraczającą 1. Argumenty makropolecenia są najważniejsze, ale operacja ma również znaczenie, ponieważ dzielenie trwa dłużej niż XOR (<1 opóźnienie cyklu).
Wiele instrukcji x86 może zająć wiele cykli, aby ukończyć niektóre etapy, jeśli są złożone (na przykład polecenia REP lub gorszy MWAIT).
źródło
div
iidiv
) jest jeszcze gorszy: jest mikrokodowany i ma znacznie większe opóźnienia niżadd
lubshr
, a nawet nie jest w pełni potokowany na żadnym procesorze. Wszystko to pochodzi bezpośrednio z tabel instrukcji Agner Fog, więc dobrze, że to połączyłeś.Obliczanie wydajności kodu asemblera nie jest najlepszym sposobem, aby przejść w dzisiejszych czasach potoku Super Scalar poza wykonaniem. Będzie się różnić w zależności od typu procesora. Będzie się różnić w zależności od instrukcji zarówno przed jak i po (możesz dodać dodatkowy kod i czasami uruchamiać go szybciej!). Niektóre operacje (zwłaszcza podział) mogą mieć zakres czasów wykonania nawet na starszych, bardziej przewidywalnych układach. W rzeczywistości jedynym sposobem jest odmierzanie czasu wielu iteracji.
źródło
Informacje na temat procesora Intel można znaleźć w instrukcjach dla programistów Intel . Na przykład opóźnienie wynosi 1 cykl dla dodawania liczb całkowitych i 3 cykle dla mnożenia liczb całkowitych.
Nie wiem o mnożeniu, ale spodziewam się, że dodanie zawsze zajmie jeden cykl.
źródło