如何并行计算?
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来编写它,然后它才会被并行化,但是大多数编程框架都有它,所以你端不需要它。