为啥 GPU 做矩阵乘法的速度比 CPU 快?

Posted

技术标签:

【中文标题】为啥 GPU 做矩阵乘法的速度比 CPU 快?【英文标题】:Why can GPU do matrix multiplication faster than CPU?为什么 GPU 做矩阵乘法的速度比 CPU 快? 【发布时间】:2018-12-22 22:48:20 【问题描述】:

我已经使用 GPU 一段时间了,但现在我很好奇。

为什么 GPU 做矩阵乘法的速度比 CPU 快得多?是因为并行处理吗?但是我没有写任何并行处理代码。它会自己自动完成吗?

任何直觉/高级解释将不胜感激!

【问题讨论】:

是的,因为是大规模并行计算。您可能没有编写任何并行代码,但 tf 或 torch 内置模块已针对在 gpu 上运行(并行化)进行了优化 我真的不明白那些投反对票或希望结束这个问题的人。对于某些人来说,这是一个重要的问题。 @Aaron 将关闭它,因为答案解释了它 - 并且有关 CuDa 编程的后续问题更适合 SO。并不是说这将是一个“坏”的问题,“太宽泛”的意思是,人们可以写一本关于它的书 【参考方案1】:

如何并行计算?

GPU 能够进行大量并行计算。比 CPU 所能做的要多得多。 看看这个假设 1M 个元素的向量相加示例。

假设您使用 CPU 最多可以运行 100 个线程: (100 更多,但让我们假设一段时间)

在一个典型的多线程示例中,假设您在所有线程上并行添加。

这就是我的意思:

c[0] = a[0] + b[0] # let's do it on thread 0
c[1] = a[1] + b[1] # let's do it on thread 1
c[101] = a[101] + b[101] # let's do it on thread 1

我们能够做到这一点是因为 c[0] 的值不依赖于除 a[0] 和 b[0] 之外的任何其他值。因此,每个添加都独立于其他添加。因此,我们能够轻松地并行化任务。

正如您在上面的示例中看到的那样,所有 100 种不同元素的添加同时发生,从而节省了您的时间。这样,添加所有元素需要 1M/100 = 10,000 步。


GPU 并行化的效率如何?

现在考虑一下今天的 GPU 大约有 2048 个线程,所有线程可以在恒定时间内独立完成 2048 种不同的操作。因此放弃了。

在您的矩阵乘法中。您可以并行化计算,因为 GPU 有更多的线程,并且在每个线程中您有多个块。所以很多计算都是并行的,因此计算速度很快。


但我没有为我的 GTX1080 编写任何并行处理!它自己做吗?

几乎所有机器学习框架都使用所有可能操作的并行实现。这是通过 CUDA 编程实现的,NVIDIA API 在 NVIDIA GPU 上进行并行计算。你不显式写,都是底层做的,你根本不知道。

是的,这并不意味着您编写的 C++ 程序会自动并行化,仅仅因为您有 GPU。 不,你需要使用CUDA编写它,然后它才会被并行化,但大多数编程框架都有它,所以你最终不需要它。

【讨论】:

我不认为你的线程类比是正确的。计算受 CPU 处理器限制,而不是线程限制。因此,在具有 2048 个线程的 4 核 CPU 上,您只能并行进行 4 次并行数学运算。这在 SIMD 中有所上升。但是,GPU 由许多较小的处理器组成,这意味着它可以高度并行计算。 x86 处理器每个内核有 2 个线程,因此 4 核处理器有 8 个线程,如果有效利用,它们都可以并行运行。上面 100 个 CPU 线程的类比是现实的,在 64 核处理器中,实际上可以运行 128 个并行线程。您也可以在 CPU 中创建任意数量的线程,比如 2048 个线程,但其中只有 128 个(在 64 核上)将并行运行,其余线程将同时执行。所以我认为它不受处理器限制,而是处理器并行运行的线程数。 比如Apple M1每个核心有1个线程,所以8核M1只能跑8个线程。显然,计算不受核心限制,而是处理器可以并行运行的总线程数。为简单起见,请忽略 SIMD 指令。【参考方案2】:

实际上,这个问题让我参加了 UW(Luis Ceze 博士)的计算机体系结构课程。 现在我可以回答这个问题了。

总而言之,这是因为硬件专业化。 我们可以定制芯片架构以平衡专业化和效率(更灵活与更高效)。例如,GPU 高度专门用于并行处理,而 CPU 旨在处理多种不同类型的操作。

另外,FPGA、ASIC 比 GPU 更专业。 (你看到处理单元的块了吗?)

【讨论】:

【参考方案3】:

GPU 设计传统上侧重于最大化浮点单元和进行多维数组运算。它们最初是为图形设计的,线性数学很有用。

CPU 针对一般计算和单线程执行进行了优化。每个执行单元都庞大而复杂。

【讨论】:

以上是关于为啥 GPU 做矩阵乘法的速度比 CPU 快?的主要内容,如果未能解决你的问题,请参考以下文章

为啥执行矩阵乘法的两个进程并行运行比连续运行慢?

深度学习用cpu训练和用gpu训练有啥区别?

Tensorflow:GPU上矩阵乘法(NaN)的错误结果

在 GPU 上训练比在 CPU 上慢得多 - 为啥以及如何加快速度?

使用张量流矩阵乘法测试 GPU

动手学习深度学习 3-1 Linear-regression