CORTEX A9 NEON VS VFP Использование Путаница

Я пытаюсь создать библиотеку для процессора ARM Cortex A9 (более конкретный), и я в небольшом количестве путаницы, касающуюся \ когда использовать Neon VS VFP в контексте операций с плавающей запятой и SIMD. Следует отметить, что я знаю разницу между 2 аппаратными подразделениями сопроцессора (как и изложил здесь на уровне ), у меня просто недопонимание относительно их правильного использования.

Связанные с этим, я использую следующие флаги компиляции:

GCC
-O3 -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp
-O3 -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=softfp
ARMCC
--cpu=Cortex-A9 --apcs=/softfp
--cpu=Cortex-A9 --fpu=VFPv3 --apcs=/softfp

Я прочитал документацию ARM, много Wiki (, как этот ), форум и блог, и все кажется согласиться с тем, что использование неона лучше, чем использование VFP или, по крайней мере, смешивание неона (например. Использование Instrinsics для реализации некоторых ALGOS в SIMD) и VFP не такая хорошая идея; Я не уверен на 100%, если это применяется в контексте всей приложения \ библиотеки или только к определенным местам (функциям) в коде.

Итак, я использую Neon в качестве FPU для моего приложения, так как я также хочу использовать внутренние. В результате я немного проблем, и моя путаница о том, как наилучшим образом использовать эти особенности (Neon VS VFP) на CORTEX A9 просто углубляется дальше, а не очистить. У меня есть какой-код, который делает сравнительный анализ для моего приложения и использует некоторые пользовательские классы таймера В каких вычислениях основаны на двойной точной плавающей точке. Использование неона, так как FPU дает совершенно неуместные результаты (пытаясь распечатать эти значения приводит к печати в основном INF и NAN; тот же код работает без сцепки при создании для x86). Поэтому я изменил свои расчеты, чтобы использовать одноточную плавающую точку, поскольку задокументирована, что неон не обрабатывает двойную точную плавающую точку . Мои тесты до сих пор не дают правильных результатах (а что худшее, это то, что теперь он больше не работает на X86; я думаю, что это из-за потерянного в точности, но я не уверен). Поэтому я почти полностью потерял: с одной стороны, я хочу использовать неон для возможностей SIMD и используя его, так как FPU не предоставляет правильные результаты, с другой стороны, смешивая его с VFP, не кажется очень хорошей идеей. Любой совет в этой области будет высоко оценен !!

Я нашел в статье в вышеупомянутом Wiki Arramare, что должно быть сделано для оптимизации с плавающей точкой в ​​контексте неона:

«

  • используют только одноточную плавающую точку
  • . Используйте неоновые вторжения / ASM, когда когда-либо вы найдете бесчеловеческую функцию FP. Вы можете сделать лучше, чем компилятор.
  • Минимизируйте условные ветви
  • Включить режим RunFast

для SoftFP:

  • встроенный код с плавающей плавающей.
  • Передайте аргументы FP с помощью указателей, а не по значению, и работают целочисленные работы между вызовами функций.

«

Я не могу использовать усердно использовать для Float ABI, так как я не могу связаться с библиотеками, которые у меня есть доступны. Большинство рекомендаций имеют смысл для меня (кроме «режима RunFast», которые я не понимаю точно, что должно делать, и тот факт, что в этот момент я могу сделать лучше, чем компилятор), но я продолжаю получать непоследовательные результаты и Я не уверен ничего прямо сейчас.

Может ли кто-нибудь пролить свет на то, как правильно использовать плавающую точку и неон для Cortex A9 / A8, и какие флаги компиляции я должен использовать?

20
задан Community 23 May 2017 в 10:30
поделиться