Почему march=native не работает на Apple M1?

#c #c #compiler-errors #compilation

#c #c #ошибки компилятора #Сборник

Вопрос:

Всякий раз, когда я пытаюсь скомпилировать любую программу на C march=native на Macbook с чипом M1, я получаю следующую ошибку при использовании clang:

 clang: error: the clang compiler does not support '-march=native'
 

Однако раньше он работал на более старых Macbook с процессором Intel. Поддерживает ли clang эту архитектуру (пока)?

clang --version дает:

 Apple clang version 12.0.0 (clang-1200.0.32.29)
Target: arm64-apple-darwin20.2.0
 

Комментарии:

1. Когда вы говорите, что раньше он работал на более старых MacBook, была ли это та же версия Clang? Что clang --version говорит о двух системах?

2. Простое избегание march=native работает для меня

Ответ №1:

 $ clang --print-supported-cpus
Apple clang version 12.0.5 (clang-1205.0.22.9)
Target: arm64-apple-darwin20.5.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
Available CPUs for this target:

    a64fx
    apple-a10
    apple-a11
    apple-a12
    apple-a13
    apple-a14
    apple-a7
    apple-a8
    apple-a9
    apple-latest
    apple-s4
    apple-s5
    carmel
    cortex-a34
    cortex-a35
    cortex-a53
    cortex-a55
    cortex-a57
    cortex-a65
    cortex-a65ae
    cortex-a72
    cortex-a73
    cortex-a75
    cortex-a76
    cortex-a76ae
    cortex-a77
    cortex-a78
    cortex-x1
    cyclone
    exynos-m3
    exynos-m4
    exynos-m5
    falkor
    generic
    kryo
    lightning
    neoverse-e1
    neoverse-n1
    saphira
    thunderx
    thunderx2t99
    thunderx3t110
    thunderxt81
    thunderxt83
    thunderxt88
    tsv110
    vortex
 

-mcpu=apple-a14 может быть лучшим для M1.

Комментарии:

1. Согласно последним определениям llvm, определения apple-m1 и apple-a14 идентичны. Если в вашей системе еще не определено имя процессора для apple-m1, но оно определено для apple-a14, это апрельское обновление определения подтверждает, что ответ Гуаньяна является лучшим на момент написания этого комментария. Смотрите: github.com/llvm/llvm-project/blob/main/llvm/include/llvm /…

Ответ №2:

В Apple clang -mcpu=apple-m1 теперь доступна версия 13.0.0.

Комментарии:

1. откуда вы взяли эту информацию? У меня это не работает с Apple clang версии 13.0.0, ошибка: «clang: ошибка: компилятор clang не поддерживает ‘-march=apple-m1′» (базовый) build % clang —версия Apple clang версии 13.0.0 (clang-1300.0.29.3) Цель: arm64-apple-darwin21.1.0

2. @SevenDays в моем ответе указано «-mcpu», а не «-march». Он обеспечивает требуемую функциональность. Источник этой информации — я сам ее использую. Вы также можете проверить, запустив «clang —print-supported-cpus».

3. Спасибо! Кажется, что новая опция более оптимизирована для macbook m1, и мой mac работает тише после перекомпиляции с опцией mcpu

Ответ №3:

Насколько я знаю, это не Apple M1 является специфичным, это происходит также с clang для различных других архитектур (в основном различных других процессоров arm). например, смотрите Этот отчет об ошибке здесь https://github.com/DMOJ/judge-server/issues/303

По сути, каждая сборка clang для новой архитектуры должна указывать значения по умолчанию для «march = native» для цели, для которой создан компилятор, или нет; и если нет, то вы увидите это сообщение об ошибке. Даже для тех процессоров arm, у которых есть цели оптимизации, вам часто приходится специально использовать «-mcpu = xxx» вместо «-march».

например, для iphone, который вы бы использовали -mcpu=apple-a11 -mcpu=apple-a12 и т.д.

Однако такая цель еще не реализована для Apple M1

Комментарии:

1. Могу ли я принудительно отказаться native от опции?

2. @HenryMazza Конечно, вы можете передать, например -mcpu=apple-a11 , даже если вы компилируете на M1, это приведет к созданию кода, который не оптимизирован (или потенциально может даже не выполняться) для вашей «родной» цели, а для a11. С точки зрения этого наилучшие флаги для оптимизации в настоящее время для M1 (учитывая, что у clang пока нет конкретной цели M1) могут быть одной из целей для ближайших продуктов ipad или iphone.

3. Ближайшим вариантом для использования на момент написания является -mcpu=lightning , который оптимизирует для A13, что дает компилятору доступ к инструкциям ARMv8.4-A.

Ответ №4:

В Clang 15 -march=native теперь существует для Apple M1 (я лично его использую).