Сообщение Re: "Векторные" операции на скалярах большего размера от 03.11.2022 4:00
Изменено 03.11.2022 4:05 Pavel Dvorkin
Re: "Векторные" операции на скалярах большего размера
Здравствуйте, 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
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
Re: "Векторные" операции на скалярах большего размера
Здравствуйте, 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
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