Android математическая производительность с плавающей точкой - PullRequest
7 голосов
/ 23 декабря 2011

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

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

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

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

У меня есть эта конфигурация в моем Application.mk файле:

APP_ABI := armeabi armeabi-v7a

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

Ответы [ 3 ]

7 голосов
/ 09 февраля 2012

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

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

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

5 голосов
/ 23 декабря 2011

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

0 голосов
/ 23 декабря 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...