【发布时间】:2021-04-19 16:56:32
【问题描述】:
我必须通过许多其他矩阵的有序乘法来生成一个矩阵(物理学中的传播器)。每个矩阵的大小约为(30,30),所有实数(浮点数),但不是对称的。要相乘的矩阵数量在 1e3 到 1e5 之间变化。每个矩阵都与以前的矩阵略有不同,但是它们不是可交换的(最后我需要所有这些非交换乘法的乘积)。每个矩阵都有特定的时间片,所以我知道如何独立地生成它们中的每一个,无论它们在乘法序列中的什么位置。最后,我必须生成许多这样的矩阵传播器,因此欢迎任何性能增强。
在python中最快实现这种矩阵乘法的算法是什么?
特别是-
- 如何构建它?有快轴之类的吗?矩阵的行/列的优选尺寸?
- 假设内存不是问题,在乘法之前分配和构建所有矩阵,还是在每个时间步生成每个矩阵?在乘法之前将每个矩阵存储在专用变量中,还是在需要时生成并直接相乘?
- 生成矩阵时函数调用开销效应的累积效应?
- 我知道如何构建每个,是否应该并行化?例如,可以从序列的开头和结尾创建批处理序列,将它们并行相乘,最后以正确的顺序相乘?
- 是否最好使用 numpy 以外的其他模块? Numba 有用吗?或其他一些有效的方式来编译为 C,或使用优化的外部库? (如果有请提供参考,我没有这方面的经验)
提前致谢。
【问题讨论】:
-
对于 30x30,BLAS 调用绝对是最快的方法。使用 Numba,您只能减少开销。例如。这是一个例子:stackoverflow.com/a/59356461/4045774 在非常小的矩阵上可以节省很多时间。与往常一样,尽可能减少内存分配的数量并考虑 CPU 缓存的使用非常重要。我会及时生成它们,然后计算一个点积。
标签: python performance matrix matrix-multiplication