Проект Minotaur развивает оптимизатор для LLVM, использующих инструкции SIMD

Группа исследователей из университета Юты (США) предложила оптимизатор Minotaur для набора компиляторов LLVM, использующий метод на основе решения задач выполнимости формул (SMT Solver) для выявления недостающих оптимизаций в промежуточном представлении кода (LLVM IR), генерируемом оптимизатором LLVM. Minotaur главным образом нацелен на оптимизацию целочисленных векторных инструкций (SIMD), как переносимых, так и специфичных для систем x86_64 (SSE, AVX, AVX2 и AVX-512).

В качестве векторизатора задействована библиотека Alive2, модифицированная для синтеза и поддержки векторных инструкций, используемых на системах x86_64. Разработка продолжает развитие проекта Souper, разрабатывавшегося теми же авторами. Minotaur может находить различные оптимизации применения векторных инструкций, пропущенные штатным оптимизатором LLVM. При тестировании дополнительно оптимизированного кода на системе с CPU Intel Cascade Lake зафиксировано максимальное повышение производительности в 1.64 раза, но в тестовых наборах SPEC CPU2017 и libYUV ускорение составило лишь 1.3% и 2.2%.


Пример оптимизации для Си-кода:

do { if (*–p == ‘.’) *p = ‘_’; } while (p != name);

Штатный оптимизатор LLVM сгенерирует для него биткод для использования инструкций AVX-2:

%1 = shufflevector %0, %2 = icmp eq %1, %3 = shufflevector %2,

Minotaur исключит лишние операции shufflevector и сведёт код к одному вызову операции icmp, которая также выполняет сравнение регистра с символом “.” (ASCII-код 46), но без лишней реверсии вектора:

Release. Ссылка here.