Получение аппаратной плавающей запятой с Android NDK - PullRequest
13 голосов
/ 09 июня 2010

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

Я строю пример 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, и я предполагаю, что «большой палец» относится к инструкциям «большого пальца-2» (хотя я не знаю, что именно это).Однако это "softfp" действительно касается меня.Разве это не должно быть "hardfp"?

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

Приветствия заранее!

1 Ответ

32 голосов
/ 12 июня 2010

Опции, которые вы предоставляете в 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 -d what.o» покажет вам разборку вашего кода.

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

...