Недавно я изучал неоновую оптимизацию с помощью встроенных функций и натолкнулся на типы данных poly8_t и poly16_t. Мне тогда интересно, что же они собой представляют?
Я искал по всей сети, но до сих пор не смог найти ЛЮБОГО объяснения, что они такое.
Кто-нибудь может мне их объяснить?
редактироватьСпасибо за эти ответы, но почему, если это просто другой способ умножения и т. Д., У него совершенно другой тип данных?
Слева = регулярное умножение, справа = бесполезное умножение
1 1 0 1 1 1 0 1
* 1 0 0 1 1 0 0 1
------------ --> --------------
(1)1 1 0 1 <-- (1) is carry 1 1 0 1
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
1 1 0 1 + 1 1 0 1 + GF(2) or XOR
------------- ---------------
1 1 1 0 1 0 1 1 1 0 0 1 0 1
Каждый 1 или 0 в диагонально убывающей матрице представляет частичный продукт одного исходного бита из вектора ‘1101’ и одного исходного бита из другого вектора ‘1001’.
Правильное применение — в CRC, (ECC) вычислениях кода с исправлением ошибок (Reed Solomon, BCH) и криптографии (эллиптические кривые, внутренние компоненты AES).
Иллюстрируя связь с многочлен умножение, операция выше может быть суммирована как
1101 == x^3 + x^2 + 0 + 1;
1001 == x^3 + 0 + 0 + 1;
Регулярное полиномиальное умножение: p (x) * (x ^ 3 + 1) == p (x) * x ^ 3 + p (x) ==
(x^3 + x^2 + 1)(x^3 + 1) == x^6+x^5+x^3 + x^3+x^2+1
== 1x^6 + 1x^5 + 0x^4 + 2x^3 + 1^x2 + 0x + 1
== "1102101"
В GF (2) каждый коэффициент просто вычисляется по модулю 2, делая 1100101b.
Тип данных в GF выглядит так же, как uint8_t, uint16_t или, возможно, вплоть до 128_t, в том смысле, что тип данных для GF (2 ^ 8) содержит 256 уникальных битовых шаблонов. Однако, например, битовый паттерн ‘00010001’, например не имеет традиционной интерпретации. (Это не 17 знаков после запятой, а, возможно, 123-я степень «единицы» по модулю некоторого другого многочлена.) Умножение этого числа с тем же «единицей» по модулю полинома генератора g (x) приводит к 124-й степени и так далее. Тогда свойства (тождества) конечных полей имеют просто интересные приложения — такие, что можно (удаленно) легко вычислить, какое 32-разрядное число добавить в файл, чтобы сопоставить его 32-разрядный CRC; или можно использовать свойства для распараллеливание вычисления crc, или для реализации умножения Бигнума с Фурье-подобным преобразованием в конечных полях (числовое теоретическое преобразование).
Эти типы используются для умножения без переноса. Это полезно для криптографических алгоритмов и хэш-сумм CRC. Вот некоторые технические документы о приложениях (они исследуют инструкцию x86 PCLMULQDQ, но те же идеи применимы к умножению без переноса на процессорах ARM):
Вы не описали PMUL против PMULL.
Насколько я понимаю (возможно неправильно) каждый элемент
PMUL работает на двух 8-битных элементах источника и генерирует один
8-битный элемент результата.
Каждый PMUL на элемент генерирует 8 частичных произведений и
каждый PP сдвинут соответственно перед XORed. Так из
lsb первого PP к msb последнего PP.
Кажется, есть 15-битный результат. PMUL может хранить только
8-битный результат.
Отбрасываются ли наиболее значимые 7-битные 15-битные результаты?
Как ссылка, это из Руководство программиста серии Cortex-A (v4) глава 7.2.2:
Полиномиальная арифметика полезна при реализации определенной криптографии
или алгоритмы целостности данных.Добавление двух полиномов над {0,1} аналогично побитовому исключению
ИЛИ ЖЕ. Полиномиальные дополнительные результаты в разных значениях
обычное дополнение.Умножение двух полиномов на {0,1} включает в себя сначала определение
частичные продукты, как в обычном умножении, а затем частичные
продукты являются эксклюзивными ORed вместо того, чтобы быть добавленными обычным способом.
Полиномиальное умножение приводит к различным значениям по сравнению с обычным
умножение, потому что это требует полиномиального сложения частичного
товары.