Не знаю, но руководство 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) и заполняет многие недостающие фрагменты размеров и подписи элементов.
Не обязательно идеально замораживатьВекторизация в одну сторону, делая это вручную, , если вы пытаетесь быть ориентированными на будущее в отношении будущих микроархитектур и расширений ЦП, а также компиляторов.