BLAS如何集成矩阵链乘法优化

4

BLAS(基本线性代数子程序)为许多其他编程语言提供了快速的例程,比如我使用的Matlab,用于执行诸如矩阵乘法之类的操作。

然而,当将多个矩阵相乘时,有一种最佳的顺序来“括起”这些矩阵。从wikipedia article中摘取:

例如,假设A是一个10×30的矩阵,B是一个30×5的矩阵,C是一个5×60的矩阵。那么,

(AB)C = (10×30×5) + (10×5×60) = 1500 + 3000 = 4500次运算

A(BC) = (30×5×60) + (10×30×60) = 9000 + 18000 = 27000次运算。

该文章继续讨论了解决此乘法的最佳顺序的方法。我的问题是,BLAS是否利用这些优化过程之一?如果没有,那么如果我在像Matlab这样的程序中明确定义了矩阵乘法的顺序并适当使用括号,我是否可以获得更好的速度?

1个回答

2
BLAS的规范定义可以在这里找到,其中不包括使用多个矩阵的调用。因此,我不认为遵循该定义的任何实现都提供您提到的链接优化。很难给出一个明确的答案,因为在过去的30年中,已经有许多实现,也许某些无聊的博士生在某个时候决定这样做 :)
话虽如此,有一些实现类似但不兼容于BLAS,例如使用表达式模板(expression templates)等特性以智能地移除暂存变量并启用延迟评估(若适当)。这是令人充满期望的,但我不确定它是否适用于矩阵链乘法。根据其未被包含在他们的基准测试中的事实来判断,我怀疑它不适用。
总之,了解最可靠的方法就是自己试一下。你可以很容易地检查自己所选择的语言/实现:只需尝试在问题中提到的示例,但最好采用更大的尺寸,例如所有维度都乘以100。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接