2013-04-06 13 views
6

Pracuję na kontrolerze ARM Cortex-M3, który ma zestaw instrukcji Thumb-2.Wydajność ARM Thumb/Thumb-2

Tryb Kciuk służy do kompresji instrukcji do 16-bitowego rozmiaru. Rozmiar kodu jest więc mniejszy. Ale w normalnym trybie kciuk, dlaczego mówi się, że wydajność jest zmniejszona?

W przypadku Thumb-2, to powiedział, wydajność jest lepsza, jak na te dwa linki:

Poprawa wydajności w przypadku gdy pojedyncza 16 -bitowa instrukcja ogranicza funkcje dostępne dla kompilatora.

Określonym celem dla Thumb-2 było osiągnięcie gęstości kodu podobnej do Thumb z wydajnością podobną do instrukcji ARM ustawionej na 32-bitowej pamięci.

Czym dokładnie jest to przedstawienie? Czy ktoś może podać kilka przykładów z tym związanych?

+1

Wydajność jest zawsze względna. W wielu przypadkach kod 'thumb' działa lepiej niż' arm'. Głównie jeśli szyna pamięci jest szyjką butelki. Ogólnie rzecz biorąc, 'kciuk' nie ma tylu rejestrów, więc nawet jeśli zestaw instrukcji jest bardziej zwarty, z niektórymi algorytmami będzie musiał częściej uzyskiwać dostęp do pamięci w celu rozlewania rejestrów. –

+1

Jeśli mam ciężarówkę dostawczą A i ciężarówkę dostawczą B, która jest o połowę mniejsza niż A. Jeśli ilość dostarczanych towarów pasuje do ciężarówki A, ale jest dwa duże dla ciężarówki B, to zabiera ona ciężarówkę B dwa razy więcej do zrobienia ta sama praca. Kciuk nie jest w połowie tak wydajny jak ARM, bardziej przypomina o 10-15% więcej instrukcji, żeby zrobić to samo co ARM. –

+0

Zobacz także: Stackoverflow's [Gcc -mthumb vs -marm] (http://stackoverflow.com/questions/11062936/gcc-mthumb-against-marm) i [Arizona paper] (http: //www.cs.arizona .edu/~ arvind/papers/lctes02.pdf) na kompilacjach sterowanych kciukiem i ARM. –

Odpowiedz

6

W porównaniu z 32-bitowym zestawem instrukcji ARM, zestaw 16-bitowych instrukcji kciuka (nie mówiąc już o rozszerzeniach thumb2) zajmuje mniej miejsca, ponieważ instrukcje są o połowę mniejsze, ale ogólnie występuje spadek wydajności, ponieważ wymaga więcej instrukcji, aby zrobić to samo, co na ramieniu. W zestawie instrukcji jest mniej funkcji, a większość instrukcji działa tylko na rejestrach r0-r7. Porównanie jabłek z jabłkami więcej instrukcji, aby zrobić to samo, jest wolniejsze.

Teraz rozszerzenia thumb2 poprzednio nieokreślone instrukcje kciuka i tworzenie 32-bitowych instrukcji kciuka. Zrozum, że istnieje więcej niż jeden zestaw rozszerzeń thumb2. ARMv6m może dodać kilkadziesiąt. ARMv7m dodaje coś takiego jak 150 instrukcji do zestawu instrukcji kciuka, nie wiem, co ARMv8 lub przyszłość trzyma. Zakładając ARMv7m, zminimalizowali różnicę pomiędzy tym, co możesz zrobić w kciuku, a tym, co możesz zrobić w ARM. Zatem thumb2 jest zredukowanym zestawem instrukcji ARM, jak kciuk, ale nie tak zredukowanym. Więc nadal może potrzebować więcej instrukcji, aby zrobić to samo na kciuku 2 (załóż plus kciuk) w porównaniu z ARM robiąc to samo.

Daje to poczucie problemu, jedną instrukcję w ramieniu i jej odpowiednik w kciuku.

ARM 

and r8,r9,r10 

THUMB 

push {r0,r1} 
mov r0,r8 
mov r1,r9 
and r0,r1 
mov r1,r10 
and r0,r1 
mov r8,r0 
pop {r0,r1} 

Teraz kompilator nie byłby to zrobić, kompilator będzie wiedział, że jest kierowana kciuk i robić rzeczy inaczej, wybierając inne rejestry. Masz jeszcze mniej rejestrów i mniej funkcji za instrukcją:

mov r0,r1 
and r0,r2 

Wciąż trwa dwie instrukcje/cykle egzekucji do rejestrów i dwa razem, bez modyfikacji argumentów i umieścić wynik w trzecim rejestrze. Thumb2 ma trzy rejestry, więc powracasz do pojedynczej instrukcji za pomocą rozszerzeń thumb2. I ta instrukcja thumb2 pozwala na r0-r15 na każdym z tych trzech rejestrów, w których kciuk jest ograniczony do r0-r7.

Spójrz na Podręcznik Architektoniczny ARMv5, pod każdą instrukcją kciuka pokazuje równoważną instrukcję ARM. Następnie przejdź do instrukcji ARM i porównaj to, co możesz zrobić z tą instrukcją ramienia, której nie możesz wykonać za pomocą instrukcji obsługi kciuka. Jest to ścieżka jednokierunkowa. Instrukcje dotyczące kciuka (nie kciuka2) mają związek jeden do jednego z instrukcją ARM.wszystkie instrukcje kciuka mają równoważną instrukcję ramienia. ale nie wszystkie instrukcje ramion mają równoważną instrukcję kciuka. Powinieneś być w stanie zobaczyć z tego ćwiczenia ograniczenie kompilatorów podczas korzystania z zestawu instrukcji kciuka. Następnie pobierz podręcznik ARMv7m Architectural Reference Manual i spójrz na zestaw instrukcji, i porównaj kodowania "all thumb warianty" (te, które zawierają ARMv4T) i te, które są ograniczone do ARMv6 i/lub v7 i zobacz rozszerzanie funkcji między kciukiem i kciukiem2, jak również instrukcjami dotyczącymi tylko kciuka2, które nie mają odpowiednika kciuka. To powinno wyjaśnić, z czym muszą pracować kompilatory między kciukiem a kciukiem2. Możesz następnie posunąć się tak daleko, aby porównać kciuk + kciuk2 z pełnymi poleceniami ARM (ARMv7 AR jest tak zwany?). I zobacz, że kciuk2 jest o wiele bliżej ARM, ale tracisz na przykład warunkowe warunki dla każdej instrukcji, więc warunkowa realizacja w kciuku staje się porównaniem z rozgałęzieniem nad kodem, gdzie w ARM możesz czasami mieć if-then-else bez rozgałęzień.

+0

także być bardzo ostrożnym, cortex-m3 i cortex-m4 to ARMv7m, cortex-m0 i -m1 to ARMv6m, duża różnica między rozszerzeniami thumb2 na tych zestawach instrukcji, a także kompilatory z dodatkiem cortex-m3 i dodał kilka rzeczy z kciukiem2, a nie mogłeś użyć kciuka2 na kortex-m0, kiedy wyszedł. Nie jestem pewien, czy kompilatory (gcc/clang) zostały całkowicie zablokowane. Podobnie kortex-m4 ma (może mieć) zmiennoprzecinkowy, który jest zredukowanym aromatem Cortex-A, a kompilatorzy zmagali się z zmiennym punktem na korowo-m4, kiedy wyszedł. nie jestem pewien, czy złapali –

+0

, jeśli kciuk ma dostęp tylko zarejestrować R0-R7 ... to jak w twoim przykładzie używasz instrukcji mov na rejestrze r8, r9 i r10 ... proszę zasugerować? – Katoch

+0

* MOST * instrukcje dla kciuka kilka może w szczególności konkretny ruch wysoki do/z niskiego –

6

Thumb-2 wprowadził instrukcje o zmiennej długości do oryginalnego Thumb; teraz instrukcje mogą być mieszanką 16-bitową i 32-bitową. Oznacza to, że zachowujesz przewagę wielkości oryginalnego Kciuka w codziennym kodzie, ale teraz masz dostęp do prawie pełnego zestawu funkcji ARM w bardziej złożonym kodzie, ale bez kosztów współdziałania ARM wcześniej poniesionych przez Thumb.

Oprócz wyżej wspomnianego dostępu do pełnego zestawu rejestrów ze wszystkich operacji rejestracyjnych, Thumb-2 dodawał bezkształtne warunkowe wykonanie w postaci bloku IF-THEN (IT). Oryginalny kciuk usunął cechę ARM warunkowego wykonywania na prawie wszystkich instrukcjach; jest to teraz osiągane w Thumb-2 przez poprzedzanie instrukcji IT warunkami dla maksymalnie czterech kolejnych instrukcji.

Ponadto sam zestaw instrukcji został znacznie rozszerzony; na przykład Cortex-M4F implementuje rozszerzenie DSP, jak również rozszerzenie zmiennoprzecinkowe FPv4-SP. W rzeczywistości uważam, że nawet NEON można zakodować w Thumb2.