为什么将计算表示为矩阵乘法会使运算速度更快?


18

在Google 使用TensorFlowMNist教程中,展示了一种计算,其中一个步骤等效于将矩阵乘以矢量。Google首先显示一张图片,其中将完整写出执行计算所需的每个数字乘法和加法。接下来,他们显示了一张图片,其中将其表示为矩阵乘法,声称此版本的计算更快,或者至少可能更快:

如果将其写为方程式,则得到:

标量方程

我们可以“向量化”此过程,将其转换为矩阵乘法和向量加法。这有助于提高计算效率。(这也是一种有用的思考方式。)

向量方程

我知道这样的方程式通常是由机器学习从业人员以矩阵乘法格式编写的,并且从代码简洁性或理解数学的角度来看,当然可以看出这样做的好处。我不明白的是Google声称从手写形式转换为矩阵形式“有助于提高计算效率”

通过将计算表示为矩阵乘法,何时,为什么以及如何在软件中获得性能改进?如果我作为一个人本人要在第二张(基于矩阵)图像中计算矩阵乘法,则可以通过依次执行第一张(标量)图像中所示的每个不同的计算来完成。对我来说,它们只是两个表示同一计算序列的符号。为什么我的计算机与众不同?为什么计算机能够比标量计算机更快地执行矩阵计算?

Answers:


19

这听起来似乎很明显,但是计算机不会执行公式,它们会执行代码,执行所需的时间直接取决于他们执行的代码,而仅间接取决于代码实现的概念。两个逻辑上相同的代码段可以具有非常不同的性能特征。具体来说,矩阵乘法可能会产生一些原因:

  • 使用多个线程。几乎没有现代的CPU具有多个核,许多核具有多达8个核,而用于高性能计算的专用计算机可以轻松地在多个插槽中拥有64个核。用普通的编程语言以明显的方式编写代码仅使用其中一种。换句话说,它可能只使用其运行的计算机不到2%的可用计算资源。
  • 使用SIMD指令(令人困惑的是,这也称为“向量化”,但与问题中的文本引号含义不同)。本质上,不是给4或8个左右的标量算术指令,而是给CPU 一个可以并行对4或8个左右寄存器执行算术的指令。从字面上看,它们可以进行一些计算(当它们完全独立并且适合指令集时),快4或8倍。
  • 更好地利用缓存。如果它们在时间和空间上是连贯的,则内存访问会更快,也就是说,连续访问是对附近地址的访问,并且当两次访问一个地址时,可以快速连续而不是长时间停顿访问两次。
  • 使用GPU等加速器。这些设备与CPU截然不同,有效地对其进行编程是其自身的一种完整形式。例如,他们有数百个内核,这些内核分为几十个内核,这些组共享资源-他们共享几KiB的内存,这比普通内存快得多,并且当该组的任何内核执行一个if声明该组中的所有其他人都必须等待。
  • 将工作分配到多台计算机上(在超级计算机中非常重要!),这带来了许多新的麻烦,但是当然可以访问更大的计算资源。
  • 更智能的算法。对于矩阵乘法,使用上面的技巧进行了适当优化的简单O(n ^ 3)算法通常比次立方算法要快,并且矩阵尺寸合适,但有时会胜出。对于稀疏矩阵等特殊情况,您可以编写专门的算法。

许多聪明的人已经使用上述技巧以及通常甚至是愚蠢的特定于平台的技巧,为常见的线性代数运算编写了非常有效的代码。因此,将优化公式转换为矩阵乘法,然后通过调用成熟的线性代数库来实现该计算。相比之下,如果您仅以明显的方式用高级语言编写公式,则最终生成的机器代码将不会使用所有这些技巧,而且速度不会很快。如果采用矩阵公式并通过调用您自己编写的朴素矩阵乘法例程来实现它(同样以明显的方式),也是如此。

快速提高代码的工作量,如果您想获得最后的性能,通常需要大量的工作。因为许多重要的计算可以表示为几个线性代数运算的组合,所以为这些运算创建高度优化的代码是经济的。但是,您的一次性专用用例是什么?除了您之外,没有人会在乎您,因此从中进行优化并不经济。


4

(稀疏)矩阵向量乘法是高度可并行化的。如果您的数据量很大,并且有服务器场可供使用,这非常方便。

这意味着您可以将矩阵和向量分成多个块,然后让单独的机器来完成一些工作。然后彼此共享一些结果,然后得到最终结果。

在您的示例中,操作如下

  1. 设置一个处理器网格,每个处理器根据网格中的坐标持有一个Wx,y

  2. 沿每一列广播源向量(成本O(log height)

  3. 使每个处理器本地相乘(成本O(width of submatrix * heightof submatrix)

  4. 使用总和(cost O(log width))沿每行折叠结果

最后的操作是有效的,因为总和是关联的。

这也允许建立冗余,并避免您将所有信息放入一台计算机中。

对于像您在图形中看到的小型4x4矩阵,这是因为cpu具有特殊的指令和寄存器来处理这些操作。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.