这节课讲一下深度学习的硬件。具体来讲一下所谓的 CPU 和 GPU有什么区别,为什么 GPU 会快?
目录
首先大家如果学习深度学习的话基本上都有一个GPU的电脑,如果你自己装一台机器的话,很有可能是一个这样子的配置,用英特尔i7 的芯片,然后内存用的 DDR 4的内存,大概有32 GB。然后再在机器上插一块显卡——泰坦X。CPU 和GPU 在进步的过程中,是有规律可言的。
i7-6700k 是当年很经典的,性价比很高的一个 CPU。首先它有四个核,有一个GPU
还有一些连接内存的通道,中间是一个第三级显存就是 share 的 llc。
那么怎么样提升在 CPU 上的利用率呢?
首先假设如果要计算 A 向量加 B向量,A 向量和B向量放在主内存里面了,所以计算之前需要之前CPU要干很多事情,它需要把数据从主内存搬到L3开始,然后再搬到L2,然后再搬到 L 1的cache 最后才到寄存器。所以可以看到一个数据真的要做计算,其实要走一条很长的路。然后这些路其实性能是不一样的,L 1比较快,它的访问延迟比较高了,是0.5纳秒。然后 L 2的 cache 又比 L 1要大了一点点,访问一次 L 2的延时是L1的14倍。访问一次L3相当于访问200次 L1。所以可以发现虽然CPU算得比较快,频率比较高,但实际上实测下来远远的没有达到 CPU 理论的算值。那是为什么?通常的时候,特别是对于数值运算来讲,就是内存访问太慢了。所以一般来说,所谓的加速的重点就是提升空间和内存的稳定性,使得缓存的效率更高。
具体来说有两种办法,一个是提升时间上的本地性,一个是提升空间上的本地性。时间上的本地性就是说如果数据不用了的话,CPU会把数据一层一层退回去;如果下一次数据还被用到,那么就不需要把主内存一直搬过来了,就不需要去下面再去取数据了。
第二个是说提升数据的空间性。就是说一个数据如果在内存里面是存在一起的话,那么CPU 读内存的时候其实是一块一块读。所以假设在下一个计算的时候,用的数据跟前一个是相邻的话,那么CPU会做很多优化,使得你在做计算准备的时候,他一次性的把数据搬过来。
访行访问和按列访问是非常的速度是非常不一样,按行访问会快一些。特别是当你的矩阵比较大的情况下。
提升CPU 利用率的第二个办法是并行,因为摩尔定理,但不管是 CPU 的频率还是 GPU的频率,在过去一些年它涨的都是比较慢的。但是我们的还是按照摩尔定律来,是因为加了很多核。
超线程对于计算密集性的应用没有太多用,是因为这两个超线程共享的是一个寄存器,因为寄存器并没有被 double。那就是说做运算的时候,你要把数据放在寄存器里对吧?但是如果一个核把寄存器全部用满了的话,另外那个超线程就得等着。
左边会比右边会慢很多,第一个原因是说左边调用了 N 次函数,就假设你 N 是那个 Aa的长度的话,就每次调用它是有开销的。第二个是说这一个运算非常容易做并行。
上图所示GPU有六个大核,大核的数量取决于显卡的型号。然后大核里面有很多小核,每个小核就是每一个绿点,每一个绿点其实是可以认为是一个计算单元,就是说可以在一个绿点上开一个线程。和CPU不一样CPU 是说一个核里面可以算一个指令。但在 GPU 来讲它是一个绿点能算一个指令。
下图是CPU和GPU的区别:
不要频繁的在CPU和GPU之间搬数据,一是因为带宽受限,第二个是得同步你每次CPU的开销。第三尽量的少传一点数据获取。
无论是CPU还是GPU,AMD和ARM的都是不错的。
总结一下就是说 CPU 是干嘛? CPU 是用来处理通用计算,所有计算都会在 CPU 做性能的优化,主要是说数据读写的,就时间,空间稳定性,要合理的利用 CPU 的多核。 GPU 的话那就是它通过更小的更多的和更好的内存带宽,使得它更适合做能够大规模并行的计算任务。所以导致说现在用 GPU 是一个主流的硬件来做深度学习的开发。