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

Я начал играть с Android 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 

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

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

Ура заранее!

1 ответ

Решение

Опции, которые вы предоставляете в 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.

Другие вопросы по тегам