Получение аппаратной плавающей запятой с помощью андроида NDK

Я начал играть с андроидом NDK. Одна из вещей, которые я только что узнал, - это создание файла application.mk для указания armv7 abi.

Я создаю пример san-angeles со следующими параметрами.

APP_MODULES      := sanangeles
APP_PROJECT_PATH := $(call my-dir)/../
APP_OPTIM        := release
APP_ABI          := armeabi-v7a

Однако это похоже на ту же скорость, что и раньше (т.е. плохо). Я просто ограничен GL, а не CPU, или здесь что-то не так?

Я заметил, когда компилирую, что получаю следующие параметры командной строки:

-march=armv7-a -mfloat-abi=softfp -mfpu=vfp -mthumb 

Вещь, которая меня беспокоит, есть "softfp". Здесь упоминается v7 abi, материал VFP fpu, и я предполагаю, что "большой палец" относится к инструкциям "thumb-2" (хотя я не знаю, что именно они представляют). Однако это "softfp" действительно касается меня. Не должно быть "hardfp"?

У кого-нибудь есть идеи по этим вопросам? Я думаю, что я, вероятно, готов начать реализацию какого-то кода GL ES 2.0 для своего HTC Desire, но я хотел бы удостовериться, что получаю от него максимально возможную скорость:)

Приветствуем заранее!

Ответы

Ответ 1

Параметры, которые вы поставляете в NDK, будут влиять только на то, как скомпилирован ваш код. Это не изменит GL libs или что-то еще, что часть платформы, которые всегда генерируются соответствующим образом. Если вы просто бросаете геометрию на оборудование GL, вы не увидите разницы.

Если вы хотите увидеть, имеют ли ваши параметры эффект, загрузите (или создайте) простой тест, который выполняет кучу операций с значениями с плавающей запятой с двойной точностью и время, необходимое для выполнения до и после.

Аргумент -mfloat-abi = softp определяет, как значения с плавающей запятой передаются между функциями. softfp означает, что они всегда передаются в целых регистрах или в стеке. Если Android не указал softfp, версия библиотеки ARMv7-A ожидала бы, что всплывающие окна появятся в аппаратных регистрах, и любой код, созданный для ARMv5TE, сломается.

"softfp" добавляет немного накладных расходов к некоторым функциям, но инструкции по перемещению значений в и из регистров fp дешевы на ARM, и предоставленная совместимость с ABI делает это полезным.

"-mthumb" позволяет генерировать код Thumb/Thumb2. Код Thumb имеет тенденцию быть немного медленнее, но немного меньше, чем эквивалентный ARM; иногда меньше означает, что вы лучше подойдете в i-кеш процессора и будете работать быстрее. Размер всегда беспокоит эти устройства, поэтому Thumb включен по умолчанию.

Если вы сомневаетесь, "arm-eabi-objdump -d whatever.o" покажет вам разборку вашего кода.

Обновление: NDK r9b добавлена ​​поддержка -mhard-float. Это позволяет вам создавать библиотеки NDK с жесткими правилами API для целей armeabi-v7a.