Можно ли сделать так, чтобы GCC автоматически выводил выходные данные вместо сборки? - PullRequest
0 голосов
/ 22 января 2019

Проблема, с которой я сталкиваюсь, просто используя autovectorizer для преобразования пользовательского цикла-кода в SIMD-инструкции при каждой компиляции в рамках обычной оптимизации, заключается в том, что если вы меняете компилятор, вы не можете быть уверены, что он также автоматически -векторизирует ваш код одинаково хорошо.

Поэтому, если вы хотите использовать только один процессор, я хочу, чтобы компилятор генерировал высокоуровневый код C для меня, для конкретной функции, которая использует встроенные функции-оболочки x86, которые универсально работают с различными поставщиками компиляторов.

Есть ли декомпилятор или, может быть, даже опция компилятора для GCC, которая дает мне этот код?

1 Ответ

0 голосов
/ 22 января 2019

Не знаю, но руководство Intel по встроенным функциям доступно для поиска по asm mnemonic.https://software.intel.com/sites/landingpage/IntrinsicsGuide/. Фильтрация AVX512 часто помогает упростить просмотр (поскольку существует zillion _mask / _maskz для всех трех размеров со встроенными AVX512).

Вводные записи asm такжеПеречислите мнемонику для каждой инструкции.https://www.felixcloutier.com/x86/index.html

-fverbose-asm иногда может помочь отслеживать переменные через asm, но обычно после auto-vec все будет иметь имена вроде tmp1234.Тем не менее, если вам трудно увидеть, какой указатель где загружается / хранится, это может помочь.

Вы также можете заставить компиляторы выдавать свои внутренние представления, такие как LLVM-IR или GIMPLE или RTL, ноВы не можете просто посмотреть их в руководствах по x86.Я уже знаю x86 asm, поэтому обычно могу довольно легко увидеть, что делают компиляторы, и вручную перевести это на встроенные функции.Я на самом деле сделал это, когда clang обнаружил что-то умное, чего не хватало gcc, даже когда источник уже использовал встроенные функции.Или к чистому C для скалярного кода, который не выполняет автоматическую векторизацию, чтобы вручную удерживать gcc в действии clang или наоборот.


Скомпилируйте с -fno-unroll-loops, если вы используете clang,векторизовать, но не развернуть, так что асм менее сложен.(gcc не развертывает по умолчанию в первую очередь).

Но учтите, что оптимальный выбор автоматической векторизации зависит от того, для какой целевой uarch вы настраиваете.clang или gcc -O3 -march=znver1 (Zen) создадут код, отличный от -march=skylake.Хотя зачастую это всего лишь вопрос 128-битных и 256-битных векторов, на самом деле это не другая стратегия, если только другой набор инструкций не позволяет что-то новое.например, SSE4.1 упаковал 32-битное целочисленное умножение (не расширяется 32x32 => 64) и заполняет многие недостающие фрагменты размеров и подписи элементов.

Не обязательно идеально замораживатьВекторизация в одну сторону, делая это вручную, , если вы пытаетесь быть ориентированными на будущее в отношении будущих микроархитектур и расширений ЦП, а также компиляторов.

...