Может ли реализация std::replace сделать избыточную запись в переданный массив?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Гость
 Может ли реализация std::replace сделать избыточную запись в переданный массив?

Сообщение Гость »

Код: Выделить всё

std::replace
реализацию можно оптимизировать с помощью векторизации (специализируя реализацию библиотеки или компилятора).
Векторизованная реализация будет сравнивать и заменять несколько элементов одновременно.< br />Чтобы гарантировать сохранение старых значений там, где это необходимо, векторизованная реализация должна выполнить одно из следующих действий:

[*]Использовать векторные хранилища в маске
Записать старые значения для незамененных элементов
[*]Векторизировать только расположение элементов, по-прежнему заменяя каждый отдельным хранилищем

Первый подход выглядит лучше всего, но не работает, если в векторном наборе команд отсутствует замаскированное хранилище с заданным размером элемента. В x86 семейство SSE не имеет маскированных хранилищ1, AVX/AVX2 имеет только 32- и 64-битные маскированные хранилища элементов, и только если доступны некоторые подмножества AVX512, доступно каждое маскированное хранилище размера векторного элемента. .
Второй подход предполагает, что элемент можно записать, если записано одно и то же значение. Это предположение я подвергаю сомнению. Возможность записи в память не всегда предоставляется. В C++ можно передать постоянный массив с отброшенным модификатор

Код: Выделить всё

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

Код: Выделить всё

x86-64 icc 2021.10.0
компилятор и

Код: Выделить всё

x86-64 clang 17.0.1
попытка векторизации

Код: Выделить всё

std::replace
с 16-битными элементами с включенным AVX2, но Intel использует подход записи старых значений, тогда как clang использует подход отдельных хранилищ. Использовал следующий код и.

Код: Выделить всё

#include 

void f(short* i, short* e)
{
std::replace(i, e, 0, 1);
}
См. https://godbolt.org/z/oarPhPhTs.
Таким образом, это выглядит либо так, либо

Код: Выделить всё

x86-64 icc 2021.10.0
сломан или

Код: Выделить всё

x86-64 clang 17.0.1
отсутствует возможность дальнейшей оптимизации.
Помимо самой векторизации, для оптимизации могут использоваться избыточные записи.

Код: Выделить всё

std::replace
для небольших массивов или для обработки хвоста векторизации: код без ветвей может захотеть вычислить значение назначения (например, используя на x86) и хранить его безоговорочно,
Поэтому мой вопрос: разрешено ли компиляторам и реализациям стандартных библиотек создавать избыточные хранилища для оптимизации

Код: Выделить всё

std::replace
?

Этот вопрос отличается от почти дублирующего Crash с icc: может ли компилятор изобрести записи там, где их не было в абстрактной машине? в том, что речь идет о стандартном алгоритме

Код: Выделить всё

std::replace
, not a particular its implementation or hand-written equivalent.

1 Non-temporal masked stores don't count, as they are not useful for general-purpose optimizations

Источник: https://stackoverflow.com/questions/780 ... ssed-array
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Почему мой NavController делает избыточную маршрутизацию при запуске приложения?
    Anonymous » » в форуме Android
    0 Ответы
    9 Просмотры
    Последнее сообщение Anonymous
  • Удалить избыточную ось в цвете
    Anonymous » » в форуме Python
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • `std::map<std::string, enum{1, 2, 3, 4}>` (или std::map<std::string, tuple<bool, bool>>`) кэширует` против `std: :set<st
    Anonymous » » в форуме C++
    0 Ответы
    319 Просмотры
    Последнее сообщение Anonymous
  • Невозможно использовать массив json_encoded, переданный обратно из PHP в функцию .ajax() в JQuery
    Гость » » в форуме Jquery
    0 Ответы
    80 Просмотры
    Последнее сообщение Гость
  • Не показывает массив, переданный из контроллера в поле зрения
    Anonymous » » в форуме Php
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»