GCC отключить AMD64 бульдозер / piledriver инструкции

Мне нужно скомпилировать программу, ориентированную на конкретную архитектуру или, что еще лучше, скомпилировать с использованием общих инструкций AMD64, игнорируя более свежие процессоры AMD (бульдозер и piledriver).

Чтобы быть конкретным, мне нужно полностью игнорировать любые инструкции FMA или XOP (насколько я понимаю, они обычно включаются во время оптимизации O2 / 3.

Я знаю, что могу указать конкретный процессор с помощью —march или -mcpu, но где я могу найти эти значения, есть идеи?

Спасибо!

3

Решение

Руководство по gcc дает:

-mfma4
-mno-fma4
-mxop
-mno-xop

Очевидно, что в зависимости от возраста вашего компилятора, они могут не поддерживаться (но тогда компилятор также не будет генерировать инструкции)

Можно добиться того же самого с -march или аналогичные, но это гораздо грубее, и, вероятно, повернется куча других расширений / опций.

1

Другие решения

Есть варианты отключения и включения определенных наборов команд. Они могут быть разными в разных версиях gcc. В моем gcc 4.7 есть следующие опции для включения / выключения наборов инструкций FMA4 и XOP:

-mfma4
-mno-fma4
-mxop
-mno-xop

как я знаю, FMA3 был выпущен после FMA4, и я думаю, что моя версия gcc не знает об этом наборе команд.

Также руководство gcc говорит:

Несмотря на то, что при выборе определенного типа cpu будет назначено соответствующее расписание для этого конкретного чипа, компилятор не будет генерировать какой-либо код, который не запускается на i386 без использования опции -march = cpu-type.

Я думаю, это означает, что если вы не укажете опцию -march, ваш код будет правильно работать на вашей архитектуре.

2

По вопросам рекламы [email protected]