Android ARMv6 / v7 и VFP / NEON - PullRequest
       25

Android ARMv6 / v7 и VFP / NEON

18 голосов
/ 22 февраля 2012

Я хотел бы больше понять процессор, используемый на телефонах Android. Причина в том, что мы создаем библиотеку C, которая имеет определенные флаги архитектуры процессора / математического процессора, которые мы можем установить.

  1. Итак, мы обнаружили, что все процессоры на устройствах Android имеют ARM-дизайн и являются либо ARMv6 (старые устройства, младшие классы, Huawei, ZTE, small SE) или ARMv7 (Сотовые планшеты и все более дорогие устройства, почти все с разрешением WVGA и выше). Я проверил ~ 20 устройств, и все они имеют процессор такого типа. Это верно? Есть ли другие?

  2. Теперь, когда речь идет о мультимедийных и математических операциях, я думаю, что важны две единицы: VFP для арифметики с плавающей запятой и SIMD - NEON . После тестирования вышеупомянутой группы устройств я обнаружил, что поддержка VFP есть практически на всех устройствах, а NEON нет. Есть комментарии к этому?

  3. Я не знаю, в чем именно разница между ARMv6 и ARMv7 (кроме скорости в целом). Сейчас мы создаем мультимедийную библиотеку C, в которой есть пара флагов для сборки. Мой вопрос заключается в том, как настроить таргетинг на наибольшее количество устройств с одной стороны и как позволить пользователям более качественных устройств использовать свое оборудование. Мое предложение состоит в том, чтобы подготовить 3 отдельные сборки: ARMv6 / VFP, ARMv7 / VFP и ARMv7 / VFP / NEON. Другие предложения?

  4. ARMv6 / VFP Я думаю, что должен работать на всех конфигурациях, кроме устройств, на которых отсутствует VFP (например, старый HTC Wildfire) - но они останутся неподдерживаемыми.

Это хороший подход? Любые комментарии приветствуются.

С уважением, STEN

Ответы [ 3 ]

13 голосов
/ 22 февраля 2012
  1. Это верно. В настоящее время существует два типа - ARMv6 и ARMv7. Скорее всего, в ближайшее время появится еще и цель x86. Новейший NDK уже поддерживает сборки для него.

  2. VFP является обязательным на ARMv7, но не на ARMv6. NEON не является обязательным, и не все устройства поддерживают его. Наиболее ярким примером является Nvidia Tegra 2. Он развернут на большинстве высококлассных планшетов и телефонов, но не поддерживает NEON. Nvidia Tegra 3 поддерживает NEON.

  3. Я думаю, вам следует придерживаться ARMv6 с эмуляцией с плавающей запятой, ARMv7 + VFP, ARMv7 + NEON.

  4. Точно - VFP поддерживается не на всех устройствах ARMv6. Так что просто не используйте его там. По умолчанию NDK создает цель armeabi, которая предназначена для устройств ARMv6 и не использует VFP. armeabi-v7a собирается для ARMv7 и использует VFP.

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

Я бы сконцентрировался на версии 7.

Новых продуктов с версией 6 практически нет, и к тому времени, когда ваша библиотека будет готова к выпуску, v6 перестанет выпускаться.

вот некоторая информация: - Неон ВСЕГДА включает VFP - Coretex A8 может включать в себя неон или нет - VFP на A8 Neon на самом деле VFP-lite, что намного медленнее. Гораздо медленнее, чем VFP V6. - Coretex A9 и выше может иметь неон, VFP или нет. - V7 имеет много улучшенных инструкций, хорошо подходящих для математических операций, помимо возможности двойного выпуска. - Производители чипов могут не включать Neon и даже VFP, но они платят ARM одинаковую плату за лицензию независимо от того. Они только сэкономят на производственных затратах. - Неон чрезвычайно силен в умелых руках, но не может добиться двойной точности. - За исключением телефонов с неоновым Tegra, мне не известен ни один Android-телефон на базе v7, в котором нет Neon. (Причина выше) - Tegra3 имеет неон

4 голосов
/ 22 февраля 2012

Это правда, что большинство устройств Android подпадают под следующие три категории:

1) ARMv6

2) ARMv7

3) ARMv7 + NEON

NDK не поддерживает это полностью.Отсутствует цель сборки ARMv6 ABI. Поддерживаются только две цели сборки ARM:

1) ARMv5 (который будет работать на всех устройствах Android ARM)

2) ARMv7 (снеобязательное использование VFP и NEON)

Ограничения, налагаемые этим, заключаются в том, что если вы хотите использовать инструкции ARMv6 (из кода C или ASM), вам необходимо нацелить ABI ARMv7 в NDK.

...