你的第一个测试之所以快得多,是因为每个测试的工作量不同。实际上是50倍的倍数。
方阵乘法的大O为O(n^3)。请看:why is the time complexity of square matrix multiplication defined as O(n^3)?因此,10k平方矩阵的乘法实际上比单个100x100乘法多100万倍的工作量。您20000次执行100x100乘法并不能弥补一次将大矩阵相乘所需的大量工作。
矩阵乘法只是许多点积,你的算法只是将点积分成几组以便于处理,并且在下面的计算中没有使用任何特殊的技巧来减少数字。
对于您的小型矩阵测试:
代码语言:javascript复制Total dot products: 10^4MADs per dot product: 10^2Total matrix-multiply operations: 20000 = 2*10^4Total multiply-adds: 2* 10^(4+2+4) = 2*10^10 = 20,000,000,000200亿。
大矩阵测试:
代码语言:javascript复制Total dot products: 10^8MADs per dot product: 10^4Total multiply operations: 1 (or 10^0)Grand total multiply-adds: 10 ^ (8 + 4 + 0) = 10^12 = 1,000,000,000,0001000亿。
从技术上讲,您的10000x10000测试运行速度更快--只需40倍的运行时间即可处理50倍以上的操作。
在这里阅读