Re: "Векторные" операции на скалярах большего размера
От: Pavel Dvorkin Россия  
Дата: 03.11.22 04:00
Оценка: 123 (1) +1
Здравствуйте, Sinclair, Вы писали:

S>Всем привет.

S>Возник несложный вопрос, но что-то я туплю с недосыпу.
S>Вот, допустим, у нас есть два байтовых массива, a и b.
S>И мы хотим вычислить, скажем, их сумму, c[i] = a[i] + b[i].
S>Допустим для простоты, что длина массива кратна 4 (или 8).
S>Это значит, что я могу его интерпретировать как массив int (или long).
S>И вот, собственно, вопрос — могу ли я ускорить сложение путём каких-то манипуляций с "длинными" числами? Что-то типа SIMD без SIMD инструкций.
S>Ну, то есть понятно, что если переполнения нет, то можно просто сложить два инта; байты int_c[i] == int_a[i] + int_b[i] как раз совпадут с нужными нам байтами.
S>Но если где-то будет переполнение, то оно "полезет" в соседние байты, а каждый из байтов должен переполняться самостоятельно.

А почему без SIMD ? Надо, чтобы на 8088 работало ?

Именно это делает довольно древняя команда PADDB (еще из MMX)

The PADDB and VPADDB instructions add packed byte integers from the first source operand and second source operand and store the packed integer results in the destination operand. When an individual result is too large to be represented in 8 bits (overflow), the result is wrapped around and the low 8 bits are written to the destination operand (that is, the carry is ignored).

https://www.felixcloutier.com/x86/paddb:paddw:paddd:paddq

Кстати, есть intrinsic _m_paddb

https://learn.microsoft.com/en-us/cpp/intrinsics/x86-intrinsics-list?view=msvc-170
With best regards
Pavel Dvorkin
Отредактировано 03.11.2022 4:05 Pavel Dvorkin . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.