• pytorch深度学习实战lesson29


    第二十九课 深度学习硬件

           这节课讲一下深度学习的硬件。具体来讲一下所谓的 CPU 和 GPU有什么区别,为什么 GPU 会快?

    目录

    CPU

    GPU


           首先大家如果学习深度学习的话基本上都有一个GPU的电脑,如果你自己装一台机器的话,很有可能是一个这样子的配置,用英特尔i7 的芯片,然后内存用的 DDR 4的内存,大概有32 GB。然后再在机器上插一块显卡——泰坦X。CPU 和GPU 在进步的过程中,是有规律可言的。

    CPU

           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

           上图所示GPU有六个大核,大核的数量取决于显卡的型号。然后大核里面有很多小核,每个小核就是每一个绿点,每一个绿点其实是可以认为是一个计算单元,就是说可以在一个绿点上开一个线程。和CPU不一样CPU 是说一个核里面可以算一个指令。但在 GPU 来讲它是一个绿点能算一个指令。

    下图是CPU和GPU的区别:

    不要频繁的在CPU和GPU之间搬数据,一是因为带宽受限,第二个是得同步你每次CPU的开销。第三尽量的少传一点数据获取。

    无论是CPU还是GPU,AMD和ARM的都是不错的。

    总结一下就是说 CPU 是干嘛? CPU 是用来处理通用计算,所有计算都会在 CPU 做性能的优化,主要是说数据读写的,就时间,空间稳定性,要合理的利用 CPU 的多核。 GPU 的话那就是它通过更小的更多的和更好的内存带宽,使得它更适合做能够大规模并行的计算任务。所以导致说现在用 GPU 是一个主流的硬件来做深度学习的开发。

  • 相关阅读:
    .NET MVC第二章、控制器使用
    P0-PyTorch环境的配置及安装
    Ruby langchainrb gem and custom configuration for the model setup
    在Python中寻找数据异常值的三种方法
    AbortController的使用
    requests.sessions.Session() 和 requests.Session()是相同的
    4. Java 的线程安全机制之`volatile`
    使用C#实现服务端与客户端的简陋聊天
    Git服务端
    类图 UML从入门到放弃系列之二
  • 原文地址:https://blog.csdn.net/weixin_48304306/article/details/128063967