Как быстрее всего сложить 16 маленьких чисел?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как быстрее всего сложить 16 маленьких чисел?

Сообщение Anonymous »

У меня есть два массива: a и b. Каждый из них содержит 16 байт, и я хотел бы добавить каждый b к соответствующему a. Массивы не перекрываются, а также я знаю, что полученные суммы всегда умещаются в один байт (важно!).

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

void add16_reference (uint8_t *as, uint8_t *bs) {
for (auto i = 0; i < 16; i++) {
as[i] += bs[i];
}
}
Я пробовал переопределить эту функцию разными способами, и лучшее, что мне удалось придумать, это

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

typedef unsigned __int128 uint128_t;

void add16_v3 (uint8_t *as, uint8_t *bs) {
uint128_t a, b, s;

std::memcpy(&a, as, 16);
std::memcpy(&b, bs, 16);

s = a + b;
std::memcpy(as, &s, 16);
}
И GCC, и Clang с радостью скомпилируют это в 2 перемещения и 2 добавления, и это здорово, но я не могу не задаться вопросом, есть ли более быстрые способы, о которых я просто не знаю.< /p>
Я решил, что могу использовать одно сложение, потому что знаю, что отдельные суммы всегда умещаются в байт.
Я использовал godbolt (благослови их Господь) ) для проверки полученного кода https://godbolt.org/z/h4adMTnKn; Я вижу, что иногда компиляторы выдают инструкции SIMD (?), а иногда нет. Это важно, потому что в тестах, использующих простые старые movs/adds, это происходит примерно в 8 раз быстрее https://quick-bench.com/q/z0374AXew8_eL8eDoQXn9XlJm9g
Мне также кажется, что нет надежного способа убедить компиляторы оптимизировать так или иначе (видите, что v1 компилируется в movs/adds на godbolt, а в Quickbench вместо этого используется simd).
Другие вещи, которые я пробовал: использование reinterpret_cast вместо memcpy - но это генерирует SIMD ищет инструкции, как бы я их ни перетасовывал; Кроме того, просто добавление ограничения в as и bs (на этот раз в C) к эталонной реализации, похоже, всегда выдает simds (но я думаю, это нормально).
Со всеми Имейте в виду вышесказанное: существует ли более быстрый/более приятный/более предсказуемый способ сложения этих чисел?

Подробнее здесь: https://stackoverflow.com/questions/785 ... ll-numbers
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как быстрее всего сложить 16 маленьких чисел?
    Anonymous » » в форуме C++
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Как быстрее всего сложить 16 маленьких чисел?
    Anonymous » » в форуме C++
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Как быстрее всего сложить 16 маленьких чисел?
    Anonymous » » в форуме C++
    0 Ответы
    20 Просмотры
    Последнее сообщение Anonymous
  • Разобрать множество маленьких строк или одну большую строку — что быстрее?
    Anonymous » » в форуме Php
    0 Ответы
    21 Просмотры
    Последнее сообщение Anonymous
  • Сортировка четных чисел по возрастанию, затем нечетных чисел, сохраняя порядок нечетных чисел.
    Anonymous » » в форуме JAVA
    0 Ответы
    32 Просмотры
    Последнее сообщение Anonymous

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