Может ли std::sort, std::accumulate, std::memcpy векторизоваться из-за флага -mavx/-mavx2?

У меня есть исходный файл C++, который скомпилирован с флагами -mavx/-mavx2 с помощью компилятора Clang. Некоторые функции имеют реализации AVX2, но некоторые из них представляют собой просто стандартные вызовы.

Мне интересно, можно ли векторизовать std::sort (1), std::memcpy (2) и std::accumulate из-за флага -mavx? Поэтому удаление этого флага может повлиять на производительность этих функций. Спасибо.

Компилятор знает исходный код или поведение этих функций, поэтому он может оптимизировать их по своему усмотрению (или так, как если бы вы написали их вручную). Обязательно скомпилируйте с помощью -O3 (для gcc/clang) и проверьте, какой код создает компилятор.

chtz 17.04.2024 14:16

Связанные: std::sort , std::fill_n и std::reduce все имеют многопоточные версии, которые делают то же, что std::sort, std::memcpy и std::accumulate.

Pete Becker 17.04.2024 14:51
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
112
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Да, все могут. Но детали различаются.

Функции memcpy, memmove и memset реализованы как часть стандартной библиотеки C, это отдельно предварительно скомпилированная статическая или разделяемая библиотека. Реализация там уже должна быть векторизована. Однако компиляторы знают свою семантику и могут заменить вызовы стандартной библиотеки C встроенной реализацией, векторизованной, если векторизация применима.

Замена memcpy на встроенную реализацию особенно полезна, когда размер известен заранее. В этом случае встроенная реализация наверняка превзойдет библиотечную, даже если библиотечная векторизована, поскольку знание размера является большим преимуществом.

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


Алгоритмы типа std::accumulate, reduce или inner_product являются шаблонными, поэтому у них нет предварительно скомпилированной реализации. Обычно с простыми типами данных и без подозрений в компиляторах с псевдонимами они автоматически векторизуются идеально.

Для более сложных алгоритмов у компилятора может не хватить возможностей для их автоматической векторизации. В этом случае реализация STL все равно может быть специализирована для их векторизации. Например, в STL недавно добавлена ​​ручная векторизация, например, mismatch в libc++ и MSVC STL. Обратите внимание, что подходы различаются для целей вашего вопроса: ручная векторизация libc++ встроена, а ручная векторизация MSVC компилируется отдельно.

std::sort — один из самых сложных, но его все же можно векторизовать. Проверьте реализацию STL или выходные данные компилятора.


Флаг -mavx/-mavx2, скорее всего, повлияет на алгоритмы, которые автоматически векторизуются, но не компилируются отдельно, поэтому может повлиять или не повлиять на ваш случай.

Встроенная реализация (будь то автоматическая или ручная векторизация) обычно следует за флагами компиляции.

Отдельно скомпилированная реализация может быть скомпилирована с определенными флагами и иметь определенный уровень векторных инструкций или может использовать диспетчеризацию во время выполнения для нескольких уровней. Также гипотетически в зависимости от флагов могут быть выбраны разные отдельно скомпилированные реализации, но мне не известны такие примеры.

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