Производительность Android с плавающей запятой

у меня есть приложения для Android который использует NDK для выполнения большого количества математики с плавающей запятой.

Я только что приобрел новый Galaxy Nexus. К моему удивлению, мое приложение работает намного медленнее, чем должно. Я подозреваю, что это потому, что большинство устройств используют аппаратное ускорение, а Galaxy Nexus-нет. Если я выполняю операцию, которая не требует математики с плавающей запятой, Galaxy Nexus выполняет то, что я ожидал.

вот спецификации CPU / GPU и пример таймингов для нескольких устройств. Я нормализовал статистику, чтобы учесть разрешение дисплея:

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

у меня есть эта конфигурация в моем :

APP_ABI := armeabi armeabi-v7a

Я не перекомпилировал свой код с NDK-r7, но я не понимаю, почему это будет иметь такое драматическое значение. Есть идеи, что случилось?

3 ответов


вы можете попробовать использовать APP_ABI := armeabi-v7a принудительно использовать только инструкции v7a.
Я мог бы представить, что новый процессор не обнаружен как поддерживающий инструкции v7a и что, таким образом, код no-FPU используется во время выполнения в качестве резервного.


этот вопрос StackOverflow может быть причиной низкой производительности на вашем Galaxy Nexus: Galaxy Nexus-неправильный процессор ABI выбирается во время установки.

кажется, это ошибка. Я также протестировал его, создав небольшой проект с использованием собственного кода, и действительно Galaxy Nexus выбирает неправильную библиотеку (armeabi вместо armeabi-v7a).

Я сообщил об этой ошибке в http://code.google.com/p/android/issues/detail?id=25321, с пример проекта, прикрепленный к ошибке. Пожалуйста, звезда его, чтобы привлечь внимание к инженерам Android.


Я думаю, проблема в том, что в процессоре есть 2 ядра. Таким образом, у вас есть 600 МГц для одного ядра. Поэтому, если ваш математический метод использует только один поток, это может быть ответом. Хотя, я не понимаю, почему это в 2 раза медленнее (можно объяснить сопоставимое время).