Мне нужно скомпилировать программу, ориентированную на конкретную архитектуру или, что еще лучше, скомпилировать с использованием общих инструкций AMD64, игнорируя более свежие процессоры AMD (бульдозер и piledriver).
Чтобы быть конкретным, мне нужно полностью игнорировать любые инструкции FMA или XOP (насколько я понимаю, они обычно включаются во время оптимизации O2 / 3.
Я знаю, что могу указать конкретный процессор с помощью —march или -mcpu, но где я могу найти эти значения, есть идеи?
Спасибо!
Руководство по gcc дает:
-mfma4
-mno-fma4
-mxop
-mno-xop
Очевидно, что в зависимости от возраста вашего компилятора, они могут не поддерживаться (но тогда компилятор также не будет генерировать инструкции)
Можно добиться того же самого с -march
или аналогичные, но это гораздо грубее, и, вероятно, повернется куча других расширений / опций.
Есть варианты отключения и включения определенных наборов команд. Они могут быть разными в разных версиях gcc. В моем gcc 4.7 есть следующие опции для включения / выключения наборов инструкций FMA4 и XOP:
-mfma4
-mno-fma4
-mxop
-mno-xop
как я знаю, FMA3 был выпущен после FMA4, и я думаю, что моя версия gcc не знает об этом наборе команд.
Также руководство gcc говорит:
Несмотря на то, что при выборе определенного типа cpu будет назначено соответствующее расписание для этого конкретного чипа, компилятор не будет генерировать какой-либо код, который не запускается на i386 без использования опции -march = cpu-type.
Я думаю, это означает, что если вы не укажете опцию -march, ваш код будет правильно работать на вашей архитектуре.