Вопрос по sse, g++, gcc, compiler-flags, gnu – В чем разница между опциями cflgs sse -msse, -msse2, -mssse3, -msse4 rtc ..? а как определить?

16

Для GCCCFLAGS опции:-msse, -msse2, -mssse3, -msse4, -msse4.1, -msse4.2, Они эксклюзивны в использовании или могут использоваться вместе?

Насколько я понимаю, выбор, который нужно установить, зависит от того, поддерживает ли целевая арка, на которой будет работать программа, это правильно или нет?

Если так, как я мог знать, что поддерживает моя целевая арка? В Linux я cat / proc / cpuinfo, но что если Mac или Windows?

Спасибо!

@PaulR Я согласен на-msse варианты, даже код со специальной поддержкой будет видеть только небольшие преимущества. Но для тесно связанных-mavx это может отличаться: даже очень обычный не векторизованный интенсивный код с плавающей запятой может извлечь выгоду из синтаксиса трех операндов в AVX. Gunther Piez
спасибо за 1-й ответ. так что мне выбрать? только самый последний (это -msse4.2)? yaya
Инструкции SSE были улучшены / изменены в различных поколениях процессоров. компиляция для цели 4.2 исключает использование сгенерированного кода на старых поколениях. Marc B
Если у вас нет особых требований к SIMD, просто скомпилируйте для наименьшего общего знаменателя, то есть не используйте ключи -msse. Paul R

Ваш Ответ

1   ответ
30

-m Коммутатор может использоваться параллельно, кроме того, некоторые из них подразумеваются архитектурой или другими коммутаторами. Например, если вы строите код для x86_64,-msse -msse2 всегда включен.

Для кода, предназначенного для запуска в вашей системе, вы должны выбрать-march=native, который выберет то, что доступно на вашем процессоре. Например, если у вас есть песчаный мост, это позволит-msse -msse2 -msse3 -mssse3 -msse4 -msse4.1 -msse4.2 -mavx.

Если вы хотите подробно указать, какой набор инструкций использовать, вам следует использовать только то, что доступно, а не всегда «последний». & Quot; последний & quot; один в настоящее время-mavx2, который я не рекомендую: первый процессор, который будет поддерживать его, будет доступен в 2013 году.

@ Zboson Я не знаю, в чем дело. Вы должны спросить, что в списке рассылки gcc действительно нет никакой разницы (пока?). Вы можете проверить это с чем-то вродеgcc -dM -E -msse4.2 - </dev/null >1;gcc -dM -E -msse4 - </dev/null >2;diff 1 2
У вас есть источники для утверждения, что-msse -msse2 подразумевается в x86_64?
Какой смыслmsse4? Насколько я могу сказать, это так же, какmsse4.2, Может быть, это создает макрос__SSE4__? Кажется, что это просто вызывает путаницу.

Похожие вопросы