2011-12-23 10 views
7

Mam Android application, która używa NDK do wykonywania dużej ilości matematyki zmiennoprzecinkowej.Android zmiennoprzecinkowa wydajność matematyczna

Właśnie kupiłem nowy Galaxy Nexus. Ku mojemu zaskoczeniu moja aplikacja działa DUŻO wolniej niż powinna. Podejrzewam, że tak jest, ponieważ większość urządzeń używa akceleracji sprzętowej, a Galaxy Nexus nie. Jeśli wykonam operację, która nie wymaga matematyki zmiennoprzecinkowej, Galaxy Nexus sprawdzi, jak bym się spodziewał.

Oto specyfikacje procesora/procesora graficznego i czasy próbkowania dla kilku urządzeń. Mam znormalizowane statystyki wziąć pod rozdzielczość ekranu rachunku:

Droid 
CPU: TI OMAP 3430 (ARM Cortex-A8 600 MHz underclocked to 550 MHz) 
GPU: PowerVR SGX530 
Instruction Set: ARMv7 
Test Run: 1,980 pixels per second 

Galaxy Nexus 
CPU: TI OMAP 4460 (ARM Cortex-A9 dual-core 1.2 GHz) 
GPU: PowerVR SGX540 
Instruction Set: ARMv7 
Test Run: 2,253 pixels per second 

Droid Incredible 
CPU: QSD8650 (Qualcomm Snapdragon 1 GHz) 
GPU: Adreno 200 
Instruction Set: ARMv7 
Test Run: 4,571 pixels per second 

mam tę konfigurację w moim Application.mk pliku:

APP_ABI := armeabi armeabi-v7a 

nie zostały ponownie skompilowane mój kod z NDK-R7, ale Nie rozumiem, dlaczego spowodowałoby to tak dramatyczną różnicę. Masz pojęcie, co jest nie tak?

+0

Czy można określić ilościowo "DUŻO wolniej"? – WarrenFaith

+0

@WarrenFaith Zaktualizowałem pytanie rzeczywistymi liczbami. – dbyrne

Odpowiedz

5

Możesz spróbować użyć APP_ABI := armeabi-v7a , aby wymusić użycie instrukcji v7a.
Mogę sobie wyobrazić, że nowy procesor nie jest wykrywany jako obsługujący instrukcje v7a, a zatem kod nie-FPU jest używany w środowisku wykonawczym jako element zastępczy.

+0

To działało. Jest to jednak dość przygnębiające, ponieważ teraz nie mam możliwości umieszczenia jednej aplikacji na rynku, którą obsługują wszystkie telefony. Nie chciałbym publikować dwóch różnych aplikacji właśnie z tego powodu. – dbyrne

+0

Osobiście szukałem kierunku renderscript dla kompatybilności. I nie tylko do obsługi różnego rodzaju procesorów, ale również do łatwego wdrażania obsługi wieloprocesorowej i możliwego wykorzystania GPU. – harism

+1

Możesz dołączyć różne wersje natywnej biblioteki w tej samej aplikacji; pamiętaj, że biblioteki są ładowane _at runtime_ poprzez twój kod Java. Być może możliwe jest wykrycie FPU wewnątrz aplikacji, np. jak [opisane tutaj] (http://stackoverflow.com/questions/8161184/detecting-fpu-presence-on-android), a następnie ładuje odpowiednią natywną bibliotekę. – JimmyB

0

Myślę, że problemem jest to, że w procesorze są 2 rdzenie. W ten sposób masz 600 Mhz na jeden rdzeń. Więc jeśli twoja metoda matematyczna używa tylko jednego wątku, może to być odpowiedź. Chociaż nie rozumiem, dlaczego jest 2 razy wolniejszy (można wytłumaczyć porównywalny czas).

+0

Widziałem telefon sprzedawany jako "2 GHz", gdy w rzeczywistości był to telefon dwurdzeniowy 1 GHz, ale zapewniam, że Galaxy Nexus ma dwa procesory 1,2 GHz. – dbyrne

+0

Masz rację: Galaxy Nexus ma proces 1,2 GHz. – Yury

+0

Podkreślasz dobry punkt, że powinienem wielowątkowy mój kod obliczeniowy. Zwłaszcza, że ​​zrównoleglenie byłoby trywialne. – dbyrne

7

To pytanie StackOverflow może być przyczyną słabej wydajności Twojego Galaxy Nexusa: Galaxy Nexus - wrong CPU ABI being selected during install time.

To wydaje się być błędem. Przetestowałem to również, tworząc mały projekt z użyciem natywnego kodu, a nawet Galaxy Nexus wybiera niewłaściwą bibliotekę (armeabi zamiast armeabi-v7a).

Zgłosiłem ten błąd na http://code.google.com/p/android/issues/detail?id=25321, z przykładowym projektem załączonym do błędu. Oznacz to gwiazdką, aby zwrócić uwagę inżynierów Androida.

+0

Tak, to jest dokładnie problem. Oznaczono gwiazdką. – dbyrne

Powiązane problemy