Получение аппаратной плавающей запятой с помощью Android NDK
-
25-09-2019 - |
Вопрос
Начал играться с андроидом NDK.Одна из вещей, которую я только что узнал, — это создание файла application.mk для указания abi Armv7.
Я создаю пример Сан-Анджелеса со следующими параметрами.
APP_MODULES := sanangeles
APP_PROJECT_PATH := $(call my-dir)/../
APP_OPTIM := release
APP_ABI := armeabi-v7a
Однако, похоже, это работает с той же скоростью, что и раньше (т.е. плохо).Я просто ограничен GL, а не процессором, или здесь что-то не так?
Я заметил, что при компиляции я получаю следующие параметры командной строки:
-march=armv7-a -mfloat-abi=softfp -mfpu=vfp -mthumb
Что меня беспокоит, так это «softfp».ЕСТЬ упоминание о v7 abi, VFP fpu, и я предполагаю, что «большой палец» относится к инструкциям «thumb-2» (хотя я не знаю, что именно это такое).Однако этот «softfp» меня беспокоит.Разве это не должно быть «hardfp»?
У кого-нибудь есть идеи по этим вопросам?Я думаю, что я, вероятно, готов приступить к реализации кода GL ES 2.0 для моего HTC Desire, но мне хотелось бы убедиться, что я получаю от этого максимально возможную скорость :)
Заранее здравствуйте!
Решение
Опции, которые вы предоставляете NDK, будут влиять только на способ компиляции вашего кода.Это не изменит библиотеки GL или что-либо еще, являющееся частью платформы, которые всегда генерируются соответствующим образом.Если вы просто добавляете геометрию в оборудование GL, вы не увидите разницы.
Если вы хотите увидеть, дают ли ваши варианты эффект, загрузите (или создайте) простой тест, который выполняет множество операций со значениями с плавающей запятой двойной точности, и определите, сколько времени потребуется для выполнения до и после.
Аргумент -mfloat-abi=softp определяет, как значения с плавающей запятой передаются между функциями.softfp означает, что они всегда передаются в целочисленных регистрах или в стеке.Если бы Android не указал softfp, версия библиотеки ARMv7-A ожидала бы, что в аппаратных регистрах появятся числа с плавающей запятой, и любой код, созданный для ARMv5TE, сломался бы.
«softfp» добавляет немного накладных расходов к некоторым функциям, но инструкции по перемещению значений в регистры fp и из них обходятся дешево на ARM, а обеспечиваемая совместимость с ABI делает это стоящим.
«-mthumb» включает генерацию кода Thumb/Thumb2.Код Thumb имеет тенденцию быть немного медленнее, но немного меньше, чем эквивалентный ARM;иногда меньший размер означает, что вы лучше поместитесь в i-кэш процессора и фактически будете работать быстрее.На этих устройствах размер всегда имеет значение, поэтому Thumb включен по умолчанию.
Если вы сомневаетесь, «arm-eabi-objdump -dwhatever.o» покажет вам дизассемблирование вашего кода.
Обновлять: НДК r9b добавлена поддержка -mhard-float.Это позволяет создавать библиотеки NDK с жесткими соглашениями API для целей Armeabi-v7a.