... сообщения на форумах и в блогах, и все, кажется, согласны с тем, что использование NEON лучше, чем использование VFP или, по крайней мере, смешивание NEON (например, использование instrinsics для реализации некоторых алгоритмов в SIMD), а VFP не очень хорошидея
Я не уверен, что это правильно.Согласно ARM на Представляя NEON Development Статья |Регистры NEON :
Банк регистров NEON состоит из 32 64-битных регистров.Если реализованы и Advanced SIMD, и VFPv3, они совместно используют этот банк регистров.В этом случае VFPv3 реализован в форме VFPv3-D32, которая поддерживает 32 регистра с плавающей запятой двойной точности.Эта интеграция упрощает реализацию поддержки переключения контекста, поскольку те же подпрограммы, которые сохраняют и восстанавливают контекст VFP, также сохраняют и восстанавливают контекст NEON.
Устройство NEON может просматривать тот же банк регистров, что и:
- шестнадцать 128-битных регистров четырех слов, Q0-Q15
- тридцать два 64-битных регистра двойных слов, D0-D31.
Регистры NEON D0-D31 такие же, какРегистры VFPv3 D0-D31 и каждый из регистров Q0-Q15 отображаются на пару регистров D.На рисунке 1.3 показаны различные виды общего банка регистров NEON и VFP.Все эти виды доступны в любое время.Программное обеспечение не должно явно переключаться между ними, потому что используемая инструкция определяет соответствующий вид.
Регистры не конкурируют;скорее они сосуществуют как взгляды банка регистрации.Нет способа сорвать снаряжение NEON и FPU.
В связи с этим я использую следующие флаги компиляции:
-O3 -mcpu=cortex-a9 -mfpu=neon -mfloat-abi=softfp
-O3 -mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=softfp
Вот что яделать;Ваш пробег может варьироваться.Он получен из набора информации, собранной с платформы и компилятора.
gnueabihf
говорит мне, что платформа использует жесткие числа, которые могут ускорить процедурные вызовы.В случае сомнений используйте softfp
, поскольку он совместим с жесткими поплавками.
BeagleBone Black :
$ gcc -v 2>&1 | grep Target
Target: arm-linux-gnueabihf
$ cat /proc/cpuinfo
model name : ARMv7 Processor rev 2 (v7l)
Features : half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpd32
...
Таким образом, BeagleBone использует:
-march=armv7-a -mtune=cortex-a8 -mfpu=neon -mfloat-abi=hard
CubieTruck v5 :
$ gcc -v 2>&1 | grep Target
Target: arm-linux-gnueabihf
$ cat /proc/cpuinfo
Processor : ARMv7 Processor rev 5 (v7l)
Features : swp half thumb fastmult vfp edsp thumbee neon vfpv3 tls vfpv4
Поэтому CubieTruck использует:
-march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
Banana Pi Pro :
$ gcc -v 2>&1 | grep Target
Target: arm-linux-gnueabihf
$ cat /proc/cpuinfo
Processor : ARMv7 Processor rev 4 (v7l)
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
Итак, Banana Pi использует:
-march=armv7-a -mtune=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard
Raspberry Pi 3 :
RPI3 уникален тем, что его ARMv8, но работает под управлением 32-разрядной ОС.Это означает, что это эффективно 32-битный ARM или Aarch32.Есть немного больше, чем 32-битный ARM против Aarch32, но он покажет вам флаги Aarch32
Кроме того, RPI3 использует SoC Broadcom A53, и он имеет NEON и дополнительные инструкции CRC32, но не имеет дополнительныхCrypto extensions.
$ gcc -v 2>&1 | grep Target
Target: arm-linux-gnueabihf
$ cat /proc/cpuinfo
model name : ARMv7 Processor rev 4 (v7l)
Features : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32
...
Таким образом, Raspberry Pi может использовать:
-march=armv8-a+crc -mtune=cortex-a53 -mfpu=neon-fp-armv8 -mfloat-abi=hard
Или может использовать (я не знаю, что использовать для -mtune
):
-march=armv7-a -mfpu=neon-vfpv4 -mfloat-abi=hard
ODROID C2 :
ODROID C2 использует SoC Amlogic A53, но использует 64-битную ОС.ODROID C2, он имеет NEON и дополнительные инструкции CRC32, но не имеет дополнительных расширений Crypto (аналогично конфигурации RPI3).
$ gcc -v 2>&1 | grep Target
Target: aarch64-linux-gnu
$ cat /proc/cpuinfo
Features : fp asimd evtstrm crc32
Таким образом, ODROID использует:
-march=armv8-a+crc -mtune=cortex-a53
В приведенных выше рецептах я изучил процессор ARM (например, Cortex A9 или A53), изучив таблицы данных.Согласно этому ответу на Unix и Linux Stack Exchange , который расшифровывает вывод из /proc/cpuinfo
:
Часть ЦП: Номер детали.0xd03 обозначает процессор Cortex-A53.
Таким образом, мы можем найти значение в базе данных.Я не знаю, существует ли он или где находится.