Найти тему
Проект OpenNet

Проект Minotaur развивает оптимизатор векторных инструкций для LLVM

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

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

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

do {
if (*--p == '.') *p = '_';
} while (p != name);

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

%1 = shufflevector %0, <31, 30, 29, ... , 0>
%2 = icmp eq %1, <46, 46, 46, ... , 46>
%3 = shufflevector %2, <31, 30, 29, ... , 0>

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

%1 = icmp eq %0, <46, 46, 46, ... , 46>