Обнаружить наличие ARM NEON в препроцессоре?

gcc macros arm c-preprocessor neon

6026 просмотра

1 ответ

Согласно ARM ARM , __ARM_NEON__определяется, когда доступны инструкции Neon SIMD. У меня проблемы с получением GCC для его предоставления.

Neon доступен на этой плате разработчиков BananaPi Pro с Debian 8.2:

$ cat /proc/cpuinfo | grep neon
Features    : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt 

Я использую GCC 4.9:

$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2

Попробуйте GCC и -march=native:

$ g++ -march=native -dM -E - </dev/null | grep -i neon
#define __ARM_NEON_FP 4

Хорошо, попробуйте, что Google использует для Android при сборке для Neon:

$ g++ -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -dM -E - </dev/null | grep -i neon
#define __ARM_NEON_FP 4

Может быть, ARMv7-a с жестким поплавком:

$ g++ -march=armv7-a -mfloat-abi=hard -dM -E - </dev/null | grep -i neon
#define __ARM_NEON_FP 4

Мои вопросы:

  • почему я не вижу __ARM_NEON__?
  • как определить наличие неона в препроцессоре?

И возможно:

  • какие переключатели GCC следует использовать для включения инструкций Neon SIMD?

В связи с этим на LeMaker HiKey , который представляет собой AARCH64 / ARM64, на котором запущен Linaro с GCC 4.9.2, приведен вывод препроцессора

$ cpp -dM </dev/null | grep -i neon
#define __ARM_NEON 1

Согласно ARM, на этой плате есть инструкции Advanced SIMD, хотя:

$ cat /proc/cpuinfo 
Processor   : AArch64 Processor rev 3 (aarch64)
...
Features    : fp asimd evtstrm aes pmull sha1 sha2 crc32
Автор: jww Источник Размещён: 04.11.2019 11:55

Ответы (1)


12 плюса

Решение

Здесь спрятан ряд вопросов, я постараюсь их извлечь по очереди ...

Согласно ARM ARM, __ARM_NEON__определяется, когда доступны инструкции Neon SIMD. У меня проблемы с получением GCC для его предоставления.

Это документация компилятора для [старой версии] компилятора ARM, а не Справочное руководство по архитектуре ARM. Лучше макрос , чтобы проверить наличие инструкций Advanced SIMD будет __ARM_NEON, который определен в ARM C Язык расширений .

Попробуйте GCC и -march=native:

Как вы, возможно, нашли . GCC для цели ARM выделяется -march(для ревизии архитектуры, для которой GCC должен генерировать код), -mfpu(для доступной единицы с плавающей запятой / расширенного SIMD) и -mfloat-abi(для того, как должны передаваться аргументы с плавающей запятой, а также для наличия или отсутствия единица с плавающей запятой). Наконец, есть -mtune(который просит GCC попытаться оптимизировать под конкретный процессор) и -mcpu(который действует как комбинация -mtuneи -march).

Запрашивая -march=nativeВы просите GCC сгенерировать код, соответствующий обнаруженной архитектуре процессора, на котором вы работаете. Это не влияет на -mfpuнастройку и не обязательно включает расширенную генерацию инструкций SIMD.

Обратите внимание, что вышесказанное относится только к компилятору, ориентированному на AArch32. AArch64 GCC не поддерживает -mfpuи будет обнаруживать наличие расширенной поддержки SIMD через -march=native.

Хорошо, попробуйте, что Google использует для Android при сборке для Neon:

$ g++ -march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp -dM -E

Этих флагов сборки недостаточно, чтобы включить поддержку расширенных инструкций SIMD, ваши заметки могут быть неполными. Из -mfpu флагов, поддерживаемых GCC 4.9.2, можно ожидать любого из:

neon, neon-fp16, neon-vfpv4, neon-fp-armv8,crypto-neon-fp-armv8

Чтобы дать вам то, что вы хотите.

Согласно ARM, на этой плате есть инструкции Advanced SIMD, хотя:

Похоже, вы работаете на ядре AArch64, которое предоставляет поддержку Advanced SIMD через эту asimdфункцию - как в примере с вашим выходом.

Автор: James Greenhalgh Размещён: 05.05.2016 05:32
Вопросы из категории :
32x32