2012-06-16 14 views
9

Pracuję nad optymalizacją wydajności kodu ARM C/C++, skompilowanego z GCC. Procesor to Tegra 3. Jak wiem flagi -mumumb oznacza generowanie starych 16-bitowych instrukcji Thumb. Przy różnych testach mam 10-15% wzrost wydajności z -marm przeciwko -mithumb.GCC - pomyłka przeciwko -marm

Czy -mthumb jest używany tylko w celu zapewnienia zgodności i wydajności - czy zawsze jest lepiej? Pytam, ponieważ android-cmake używał -mthumb w trybie Release i -marm w debugowaniu, jest to bardzo kłopotliwe dla mnie.

Odpowiedz

21

Kciuk nie jest starszym zestawem instrukcji, ale w rzeczywistości nowszym. Bieżąca wersja to Thumb-2, który jest mieszanym 16/32-bitowym zestawem instrukcji. Zestaw instrukcji Thumb1 był skompresowaną wersją oryginalnego zestawu instrukcji ARM. CPU pobierze instrukcję, rozpakuje ją na ARM, a następnie ją przetworzy. Te dni (ARMv7 i wyżej), Thumb-2 jest preferowany dla wszystkiego oprócz krytycznego działania lub kodu systemowego. Na przykład GCC domyślnie wygeneruje Thumb2 dla ARMv7 (podobnie jak twoja Tegra3), ponieważ wyższa gęstość kodu zapewniona przez 16/32-bitowy ISA pozwala na lepsze wykorzystanie icache. Ale to jest coś, co jest bardzo trudne do zmierzenia w normalnym benchmarku, ponieważ większość benchmarków i tak pasuje do L1 icache.

Aby uzyskać więcej informacji sprawdź na stronie Wikipedia: http://en.wikipedia.org/wiki/ARM_architecture#Thumb

+1

Doskonała odpowiedź. Gameboy Advance ma przeważnie 16 bitowy, nie zerowy czas oczekiwania, magistrale danych i wydajność kciuka była znacznie lepsza niż ARM. kciuk ma więcej instrukcji niż ramię, więc jest wolniejszy pod tym względem. thumb2 jest rozszerzeniem do kciuka, wciąż masz instrukcje dotyczące kciuka, thumb2 używa wcześniej nieokreślonych, a wiele z nich to instrukcje 32-bitowe. –

+0

Dobra pigułka Pytania i odpowiedzi – tniles09

Powiązane problemy