我最近一直在研究内在函数的霓虹灯优化,我遇到了poly8_t和poly16_t数据类型。然后我想知道他们究竟是什么。
我在网上搜索过,但到目前为止还无法找到任何解释。
有人可以向我解释一下吗?
编辑 :感谢您的回答,但为什么,如果它只是一种不同的乘法方式等,它是否有完全不同的数据类型?
答案 0 :(得分:9)
左=常规乘法,右=无进行乘法
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计算,或者在有限域(数理论变换)中使用类似傅立叶的变换实现bignum乘法。
答案 1 :(得分:6)
这些类型用于无进位乘法。它对加密算法和CRC哈希和很有用。以下是一些关于应用程序的白皮书(他们探讨了x86 PCLMULQDQ指令,但同样的想法适用于ARM处理器上的无进位乘法):
答案 2 :(得分:2)
你没有描述PMUL vs PMULL。
据我了解(可能不正确)每个元素 PMUL在两个8位源元素上工作并生成一个 8位结果元素。
每个元素PMUL生成8个部分产品和 每个PP在XORed之前分别移动。所以来自 第一个PP的lsb到最后一个PP的msb。 似乎有15位的结果。 PMUL只能存储 一个8位的结果。
15位结果中最重要的7位被丢弃了吗?
答案 3 :(得分:1)
作为参考,这是来自Cortex-A Series Programmer’s Guide (v4)第7.2.2章:
多项式算法在实现某些加密时很有用 或数据完整性算法。
在{0,1}上添加两个多项式与按位异或相同 要么。多项式附加导致a的值不同 常规添加。
将两个多项式乘以{0,1}包括首先确定 部分产品如常规乘法,然后部分 产品是异或,而不是按常规添加。 多项式乘法导致与常规值不同的值 乘法,因为它需要部分的多项式加法 产品