如何使用 SSE/AVX 指令有效地乘以 64 位整数的 2 x 2 矩阵?
How can I multiply 2 x 2 matrices of 64 bit integers efficiently using SSE/AVX instructions?
有没有办法使用 SSE 或 AVX 将 2 x 2 无符号 64 位整数矩阵相乘,
这比仅使用 none SSE/AVX 指令更有效?
如果你只想要结果的低 64 位,事情就简单多了。假设ymm0包含矩阵A的四个值,ymm1包含矩阵B的四个值,您可以计算乘积如下:
vpermq ymm2,ymm0,0x8D
vpermq ymm3,ymm1,0x4E
vpermq ymm0,ymm0,0xD8
vpclmullqlqdq xmm4,xmm0,xmm1
vpclmulhqlqdq xmm5,xmm0,xmm1
vpclmullqhqdq xmm6,xmm0,xmm1
vpclmulhqhqdq xmm7,xmm0,xmm1
vpclmullqlqdq xmm8,xmm2,xmm3
vpclmulhqlqdq xmm9,xmm2,xmm3
vpclmullqhqdq xmm10,xmm2,xmm3
vpclmulhqhqdq xmm11,xmm2,xmm3
vpunpcklqdq xmm0,xmm4,xmm6
vpunpcklqdq xmm1,xmm5,xmm7
vpunpcklqdq xmm2,xmm8,xmm10
vpunpcklqdq xmm3,xmm9,xmm11
vinserti128 ymm0,ymm0,xmm1,1
vinserti128 ymm2,ymm2,xmm3,1
vpaddq ymm0,ymm0,ymm2
因此,ymm0 包含矩阵乘积的底部 4 个 64 位整数。
如果你想要完整的 128 位结果,事情会稍微复杂一些(同样,ymm0 = 矩阵 A 和 ymm1 =输入矩阵 B):
vpcmpeqq ymm12,ymm12,ymm12
vpermq ymm2,ymm0,0x8D
vpermq ymm3,ymm1,0x4E
vpermq ymm0,ymm0,0xD8
vpsllq ymm12,ymm12,63
vpclmullqlqdq xmm4,xmm0,xmm1
vpclmulhqlqdq xmm5,xmm0,xmm1
vpclmullqhqdq xmm6,xmm0,xmm1
vpclmulhqhqdq xmm7,xmm0,xmm1
vpclmullqlqdq xmm8,xmm2,xmm3
vpclmulhqlqdq xmm9,xmm2,xmm3
vpclmullqhqdq xmm10,xmm2,xmm3
vpclmulhqhqdq xmm11,xmm2,xmm3
vpunpcklqdq xmm0,xmm4,xmm5
vpunpckhqdq xmm1,xmm4,xmm5
vpunpcklqdq xmm2,xmm6,xmm7
vpunpckhqdq xmm3,xmm6,xmm7
vpunpcklqdq xmm4,xmm8,xmm9
vpunpckhqdq xmm5,xmm8,xmm9
vpunpcklqdq xmm6,xmm10,xmm11
vpunpckhqdq xmm7,xmm10,xmm11
vinserti128 ymm0,ymm0,xmm2,1
vinserti128 ymm1,ymm1,xmm3,1
vinserti128 ymm2,ymm4,xmm6,1
vinserti128 ymm3,ymm5,xmm7,1
vpaddq ymm2,ymm2,ymm0
vpaddq ymm3,ymm3,ymm1
vpxor ymm4,ymm12,ymm0
vpxor ymm5,ymm12,ymm2
vpcmpgtq ymm6,ymm4,ymm5
vpsubq ymm3,ymm3,ymm6
vpunpcklqdq ymm0,ymm2,ymm3
vpunpckhqdq ymm1,ymm2,ymm3
则得到ymm0和ymm1.
中的四个128位矩阵乘积系数
有没有办法使用 SSE 或 AVX 将 2 x 2 无符号 64 位整数矩阵相乘,
这比仅使用 none SSE/AVX 指令更有效?
如果你只想要结果的低 64 位,事情就简单多了。假设ymm0包含矩阵A的四个值,ymm1包含矩阵B的四个值,您可以计算乘积如下:
vpermq ymm2,ymm0,0x8D
vpermq ymm3,ymm1,0x4E
vpermq ymm0,ymm0,0xD8
vpclmullqlqdq xmm4,xmm0,xmm1
vpclmulhqlqdq xmm5,xmm0,xmm1
vpclmullqhqdq xmm6,xmm0,xmm1
vpclmulhqhqdq xmm7,xmm0,xmm1
vpclmullqlqdq xmm8,xmm2,xmm3
vpclmulhqlqdq xmm9,xmm2,xmm3
vpclmullqhqdq xmm10,xmm2,xmm3
vpclmulhqhqdq xmm11,xmm2,xmm3
vpunpcklqdq xmm0,xmm4,xmm6
vpunpcklqdq xmm1,xmm5,xmm7
vpunpcklqdq xmm2,xmm8,xmm10
vpunpcklqdq xmm3,xmm9,xmm11
vinserti128 ymm0,ymm0,xmm1,1
vinserti128 ymm2,ymm2,xmm3,1
vpaddq ymm0,ymm0,ymm2
因此,ymm0 包含矩阵乘积的底部 4 个 64 位整数。
如果你想要完整的 128 位结果,事情会稍微复杂一些(同样,ymm0 = 矩阵 A 和 ymm1 =输入矩阵 B):
vpcmpeqq ymm12,ymm12,ymm12
vpermq ymm2,ymm0,0x8D
vpermq ymm3,ymm1,0x4E
vpermq ymm0,ymm0,0xD8
vpsllq ymm12,ymm12,63
vpclmullqlqdq xmm4,xmm0,xmm1
vpclmulhqlqdq xmm5,xmm0,xmm1
vpclmullqhqdq xmm6,xmm0,xmm1
vpclmulhqhqdq xmm7,xmm0,xmm1
vpclmullqlqdq xmm8,xmm2,xmm3
vpclmulhqlqdq xmm9,xmm2,xmm3
vpclmullqhqdq xmm10,xmm2,xmm3
vpclmulhqhqdq xmm11,xmm2,xmm3
vpunpcklqdq xmm0,xmm4,xmm5
vpunpckhqdq xmm1,xmm4,xmm5
vpunpcklqdq xmm2,xmm6,xmm7
vpunpckhqdq xmm3,xmm6,xmm7
vpunpcklqdq xmm4,xmm8,xmm9
vpunpckhqdq xmm5,xmm8,xmm9
vpunpcklqdq xmm6,xmm10,xmm11
vpunpckhqdq xmm7,xmm10,xmm11
vinserti128 ymm0,ymm0,xmm2,1
vinserti128 ymm1,ymm1,xmm3,1
vinserti128 ymm2,ymm4,xmm6,1
vinserti128 ymm3,ymm5,xmm7,1
vpaddq ymm2,ymm2,ymm0
vpaddq ymm3,ymm3,ymm1
vpxor ymm4,ymm12,ymm0
vpxor ymm5,ymm12,ymm2
vpcmpgtq ymm6,ymm4,ymm5
vpsubq ymm3,ymm3,ymm6
vpunpcklqdq ymm0,ymm2,ymm3
vpunpckhqdq ymm1,ymm2,ymm3
则得到ymm0和ymm1.
中的四个128位矩阵乘积系数