векторные инструкции в стандартной библиотеке

Дмитрий Назаров
Дмитрий Назаров

В настоящее время на множестве платформ доступны векторные инструкции для сложения, вычитания, умножения и т.д. В ряде компиляторов (gcc, clang, msvc) уже имеются соответствующие расширения для работы с такими инструкциями.

// пример из документации на gcc
typedef int v4si __attribute__ ((vector_size (16)));

v4si a, b, c;

c = a + b;

Было бы неплохо иметь в стандарте соответствующие функции для работы с этими расширениями. С одной стороны, компиляторы и так в праве использовать их при оптимизации кода. С другой - применение таких функций будет дополнительной подсказкой компилятору о намерениях разработчика. На платформах, которые не поддерживают векторные расширения, можно использовать программную эмуляцию в виде цикла. В стандарте уже применяется аналогичный подход с эмуляцией std::atomic через использование мьютексов. 

3
рейтинг
2 комментария
yndx-antoshkka
Есть уже proposal на эту тему open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0214r5.pdf

Ознакомьтесь, и если есть замечания - мы их передадим комитету.
yndx-antoshkka
Дмитрий Назаров
Спасибо. Я не знал об этом предложении.
Само предложение расписано достаточно подробно. Но я бы добавил constexpr к операциям, где это возможно. Например ничто не мешает компилятору создавать объект типа simd из std::initializer_list и сразу же загружать в соответствующий регистр.
Это может показаться надуманно, но представим себе следующий пример: pixel perfect rendering с использованием графических API. Например, в OpenGL при отрисовке используется "diamond exit rule". Одним из решений для получения требуемого эффекта выровненных пикселей является добавления некоторого смещения к координатам выводимых на экран точек. Если таких точек много, то оптимальным решением на стороне процессора было бы использовать simd инструкции. Если бы у simd был бы constexpr конструктор, то ничего бы не мешало нам написать contexpr функцию по добавлению смещения к вектору.

имеется

static constexpr float offset = { 0.0f, 1.0f, 4.0f, 5.0f};

constexpr simd retranslate(const simd &point_)
{
return point_ + simd(offset);
}


Возможно это является экономией на спичках, но как по мне, если есть шанс что-то посчитать на этапе компиляции, то почему бы и нет.
Дмитрий Назаров
Другие идеи
Группа создана, чтобы собирать предложения к стандарту C++, организовывать их внутренние обсуждения, помогать готовить их для отправки в комитет и защищать на общих собраниях в рабочей группе по С++ Международной организации по стандартизации (ISO).