2011-12-05 7 views
28

Apple zaleca kompilowanie dla ARM zamiast kciuka, jeśli wykonywanych jest wiele operacji zmiennoprzecinkowych. Cała moja aplikacja to prawie jedna operacja zmiennoprzecinkowa.Czy istnieje sposób kompilacji dla ARM zamiast Thumb w Xcode 4?

Oto co mówią w iOS App Workflow Development Guide:

urządzenia iOS obsługują dwa zestawy instrukcji ARM i kciukiem. Xcode domyślnie używa instrukcji kciuka , ponieważ użycie Thumb zwykle zmniejsza rozmiar kodu o około 35 procent w stosunku do ARM. Aplikacje z rozszerzonym kodem zmiennoprzecinkowym mogą działać lepiej, jeśli używają instrukcji ARM niż Thumb. Można wyłączyć kciuk do aplikacji , więc kompiluje dla ARM, ustawiając Compile dla kciuka kompilacji ustawienie nr

Jednak nie mogę znaleźć żadnego „Kompilacja dla kciuka” ustawienie w ustawieniach kompilacji . Czy zmienili nazwę? Czy jest to teraz niedostępne w Xcode 4?

Odpowiedz

48

Po pierwsze, rada nie kompilacji zestawu instrukcji Thumb w celu poprawy wydajności zmiennoprzecinkowej ma zastosowanie tylko do starych urządzeń ARMv6.

Sprzęt ARMv7 (iPhone 3G S i nowszy, w tym wszystkie iPady) używa bardziej wydajnego zestawu instrukcji Thumb-2, który nie ma podobnych spowolnień zmiennoprzecinkowych. W przypadku kompilacji ARMv7 zalecane jest prawie we wszystkich przypadkach, że tworzysz dla Thumb. Dostarczam trochę więcej szczegółów na ten temat w mojej odpowiedzi here.

Być może to ustawienie kompilatora nie jest już dostępne jako typowa opcja, ponieważ urządzenia ARMv7 stanowią zdecydowaną większość urządzeń z systemem iOS.

Jeśli chcesz zrobić to tylko dla swoich kompilacji ARMv6, możesz przejść do ustawień kompilacji i przesunąć kursor myszy na opcję "Inne flagi C". Kliknij mały przycisk plus widoczny po prawej stronie tej opcji i dodaj warunek dla architektury ARMv6. Zrób to ponownie, aby utworzyć dla architektury ARMv7. W architekturze ARMv6 dodaj dodatkową flagę kompilatora: -mno-thumb (jak sugeruje Kevin).

Należy skończyć z czymś, co wygląda następująco:

Build settings for ARMv6

zrobić to w jednym z moich wniosków, bo widzieliśmy wzrost wydajności na starszych ARMv6 urządzeń z tym. Jednak inna z moich aplikacji była wolniejsza, gdy nie budowałem dla Thumb na ARMv6, więc najpierw zechcesz ją profilować.

Dodatkowo istnieje currently a bug in the LLVM Compiler 3.0 that ships with Xcode 4.2 (który został już naprawiony w 4.2.1, z tego, co słyszę), gdzie obliczenia zmiennoprzecinkowe są źle skompilowane pod kciukiem dla ARMv6. Jeśli używasz tej konkretnej wersji Xcode, musisz to zrobić, aby zachować prawidłowe działanie na starszych urządzeniach.

+0

Xcode 4.2.1 wydaje się być tylko dla Lion. Użyłby go, gdyby Photoshop i cała masa innych aplikacji nie miała dużych problemów z Lionem. Cholerny. Czy istnieje obejście tego błędu w Xcode 4.2? Czy możesz wskazać, co zrobić w przypadku, gdy Lion nie jest opcją? – openfrog

+1

@openfrog - Po prostu nie buduj dla Kciuka, gdy celujesz w ARMv6 w tym przypadku, tak jak pokazałem powyżej. ARMv7 nie ma takich problemów i można go zbudować za pomocą instrukcji Thumb. Szczerze mówiąc, wyłączenie opcji Kciuk dla ARMv6 nie wpłynie na wielu użytkowników, jeśli spowolni działanie, ponieważ szacuje się, że urządzenia ARMv6 mają 3-5% aktywnych obecnie urządzeń z iOS: http://www.marco.org/ 2011/11/30/więcej-ios-device-and-os-version-stats-from-instapaper –

+0

Sweeeeet! Wielkie dzięki! –

8

Nie wiem, czy "Kompilacja dla Kciuka" ma istnieć w Xcode 4, ale zawsze można dodać -mno-thumb do ustawień kompilacji Inne flagi C.

3

Odnośnie oryginalnego pytania: Zauważyłem, że "Kompilacja dla kciuka" (w sekcji "Generowanie kodu" w "Ustawieniach budowania projektu") w Xcode 4.2.1 jest dostępna tylko w przypadku korzystania z LLVM GCC 4.2 (jeśli ustawione w "Kompilator dla C/C++/Objective-C")!

Jeśli kompilujesz z Apple LLVM 3.0, nie znajdziesz opcji "Kompilacja dla kciuka". Ale - jak już powiedział Brad - nadal możesz zmienić opcję "Inne flagi", aby wyłączyć tryb Kciuk.

Kolejny interesujący punkt: używam źródła amalgamacji sqlite w moim projekcie (potrzebuję fts - wyszukiwanie pełnotekstowe) i od kompilacji z LLVM 3.0 miałem dziwne i raczej przypadkowe awarie na urządzeniach armv6, gdy tylko uzyskiwałem dostęp do bazy danych: Okazuje się, że tryb kciuk nie został wyłączony podczas kompilacji dla urządzeń armv6.

+0

Spodziewałem się również awarii sqlite na armv6, ale tylko wtedy, gdy buduję bibliotekę z lcvm gcc. po przełączeniu na llvm - działa dobrze. –