Arm NEON和poly8_t和poly16_t

Goz*_*Goz 7 c c++ arm intrinsics neon

我最近一直在研究内在函数的霓虹灯优化,我遇到了poly8_t和poly16_t数据类型.然后我想知道他们到底是什么.

我在网上搜索过,但到目前为止还没有找到任何解释它们是什么.

任何人都可以向我解释一下吗?

编辑:感谢您的回答,但为什么,如果它只是一种不同的乘法方式等,它是否有完全不同的数据类型?

Aki*_*nen 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
Run Code Online (Sandbox Code Playgroud)

对角线下降矩阵中的每个1或0表示来自矢量"1101"的一个源位和来自另一个矢量"1001"的一个源位的部分乘积.

正确的应用是CRC,(ECC)纠错码计算(Reed Solomon,BCH)和密码术(椭圆曲线,AES的内部).

说明与多项式乘法的连接,上面的操作可以概括为

 1101 == x^3 + x^2 + 0 + 1;
 1001 == x^3 + 0   + 0 + 1;
Run Code Online (Sandbox Code Playgroud)

正则多项式乘法是: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"
Run Code Online (Sandbox Code Playgroud)

在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乘法.


Mar*_*han 6

这些类型用于无进位乘法.它对加密算法和CRC哈希和很有用.以下是一些关于应用程序的白皮书(他们探索x86 PCLMULQDQ指令,但同样的想法适用于ARM处理器上的无进位乘法):

  • ARM 上哪条指令执行无进位乘法? (2认同)
  • ARM在此上下文中必须表示Cortex A7或A8处理器,其中包括NEON扩展.我认为这是'VMUL.P8` (2认同)
  • @auselen在ARMv7中,该指令被称为"VMULL.P8"("8位x 8位 - > 16位").在ARMv8中,该指令称为"PMUL"/"PMULL"/"PMULL2".除了ARMv7变体之外,带有加密扩展的ARMv8支持64位x 64位 - > 128位无进位乘法. (2认同)