如何使用SSE / AVX指令有效地将2 x 2个64位整数矩阵相乘?

问题描述 投票:0回答:2

是否有一种方法可以使用SSE或AVX乘以2 x 2矩阵的无符号64位整数,

这比仅不使用SSE / AVX指令更有效?

assembly x86-64 matrix-multiplication
2个回答
0
投票

如果只希望结果的底部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包含矩阵乘积的四个低64位整数。


0
投票

如果要获得完整的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

然后您在ymm0ymm1中获得四个128位矩阵乘积系数。

© www.soinside.com 2019 - 2024. All rights reserved.