Существует ли версия стандартной математической библиотеки, которая использует инструкции VEX?

У меня есть эта большая библиотека со смесью обычного C++, большим количеством встроенных функций SSE и несколькими незначительными частями сборки. Я достиг точки, где я хотел бы нацелить набор инструкций AVX.

Чтобы сделать это, я хотел бы построить все это с помощью GCC -mavx или MSVC /arch:AVX поэтому я могу добавлять встроенные функции AVX, где бы они ни были необходимы, и не беспокоиться о внутренних изменениях состояния AVX.

Единственная проблема, с которой я столкнулся, это стандартные математические функции Си: sin(), exp()и т. д. Их реализация в системах Linux использует инструкции SSE без префикса VEX. Я не проверял, но я ожидаю подобную проблему на окнах.

Код использует изрядное количество вызовов математических функций. Некоторый быстрый бенчмаркинг показывает, что простой вызов так sin() становится немного (~10%) медленнее или намного (в 3 раза) медленнее в зависимости от конкретного процессора и того, как он обрабатывает переходы AVX (Skylake против старых).

Добавление VZEROUPPER до вызова очень помогает предварительным процессорам Skylake, но на самом деле код делает немного медленнее на Skylake. Кажется, что правильным решением была бы версия математических функций в кодировке VEX.

Поэтому мой вопрос заключается в следующем: существует ли достаточно эффективная математическая библиотека, которая может быть скомпилирована для использования инструкций в кодировке VEX? Как другие решают эту проблему?

0 ответов

Другие вопросы по тегам