Du côté de l’AVX512¶
Le jeu d’instructions AVX512 propose 2 nouvelles instructions permettant de réaliser respectivement
- 2 produits de polynômes de degré au plus 63 dans \({\mathbb F}_2[x]\)
__m256i _mm256_clmulepi64_epi128 (__m256i b, __m256i c, const int Imm8)
- 4 produits de polynômes de degré au plus 63 dans \({\mathbb F}_2[x]\)
__m512i _mm512_clmulepi64_epi128 (__m512i b, __m512i c, const int Imm8)
Pour réaliser simultanément les produits \(P(x)Q(x)\) et \(R(x)S(X)\), les polynômes \(P(x)\) et \(Q(x)\) doivent être placés chacun dans l’un des 4 mots \((b_3,b_2,b_1,b_0)\) de 64 bits de la variable b. De même, \(R(x)\) et \(S(x)\) doivent être placés chacun dans l’un des 4 mots \((c_3,c_2,c_1,c_0)\) de 64 bits de la variable c.
255 191 127 63 0
|--------------------|--------------------|--------------------|--------------------|
B: |________B_3_________|________B_2_________|________B_1_________|________B_0_________|
192 128 64
255 191 127 63 0
|--------------------|--------------------|--------------------|--------------------|
C: |________C_3_________|________C_2_________|________C_1_________|________C_0_________|
192 128 64
La constante Imm8 permet de spécifier où se trouvent les opérandes à multiplier et le résultat (2 mots de 128 bits) est stocké dans un registre de 256 bits.
- si imm8=0, l’opération effectuée est \(B_0(x)C_0(x)\) et \(B_2(x)C_2(x)\),
- si imm8=1, l’opération effectuée est \(B_1(x)C_0(x)\) et \(B_3(x)C_2(x)\),
- si imm8=16, l’opération effectuée est \(B_0(x)C_1(x)\) et \(B_2(x)C_3(x)\),
- si imm8=17, l’opération effectuée est \(B_1(x)C_1(x)\) et \(B_3(x)C_3(x)\).
Pour réaliser simultanément 4 produits de polynômes de type \(P_i(x)Q_i(x)\), chaque \(P_i(x)\) devra être placé dans l’un des 8 mots de 64 bits de la variable b et chaque \(Q_i(x)\) devra être placé dans l’un des 8 mots de 64 bits de la variable c.
511 447 383 319 255 191 127 63 0
|----------|----------|----------|----------|----------|----------|----------|----------|
B: |___B_7____|____B_6___|____B_5___|____B_4___|___B_3____|____B_2___|____B_1___|____B_0___|
448 384 320 256 192 128 64
511 447 383 319 255 191 127 63 0
|----------|----------|----------|----------|----------|----------|----------|----------|
C: |___C_7____|____C_6___|____C_5___|____C_4___|___C_3____|____C_2___|____C_1___|____C_0___|
448 384 320 256 192 128 64
La constante Imm8 permet de spécifier où se trouvent les opérandes à multiplier et le résultat (4 mots de 128 bits) est stocké dans un registre de 512 bits.
- si imm8=0, l’opération effectuée est \(B_0(x)C_0(x)\) , \(B_2(x)C_2(x)\) , \(B_4(x)C_4(x)\) et \(B_6(x)C_6(x)\),
- si imm8=1, l’opération effectuée est \(B_1(x)C_0(x)\) , \(B_3(x)C_2(x)\) , \(B_5(x)C_4(x)\) et \(B_7(x)C_6(x)\),
- si imm8=16, l’opération effectuée est \(B_0(x)C_1(x)\), \(B_2(x)C_3(x)\) , \(B_4(x)C_5(x)\) et \(B_6(x)C_7(x)\),
- si imm8=17, l’opération effectuée est \(B_1(x)C_1(x)\), \(B_3(x)C_3(x)\) , \(B_5(x)C_5(x)\) et \(B_7(x)C_7(x)\).