深度学习之GPU,CUDA和cuDNN的理解

 更新时间:2023年02月13日 14:13:17   作者:AI之路  
Cuda和cudnn是支持NVIDIA支持GPU的两个库,分别用于高性能计算和深度神经网络计算的支持,下面这篇文章主要给大家介绍了关于深度学习之GPU,CUDA和cuDNN的理解,需要的朋友可以参考下

我们知道做深度学习离不开GPU,不过一直以来对GPU和CPU的差别,CUDA以及cuDNN都不是很了解,所以找了些资料整理下,希望不仅可以帮助自己理解,也能够帮助到其他人理解。

先来讲讲CPU和GPU的关系和差别吧。截图来自资料1(CUDA的官方文档):

从上图可以看出GPU(图像处理器,Graphics Processing Unit)和CPU(中央处理器,Central Processing Unit)在设计上的主要差异在于GPU有更多的运算单元(如图中绿色的ALU),而Control和Cache单元不如CPU多,这是因为GPU在进行并行计算的时候每个运算单元都是执行相同的程序,而不需要太多的控制。Cache单元是用来做数据缓存的,CPU可以通过Cache来减少存取主内存的次数,也就是减少内存延迟(memory latency)。GPU中Cache很小或者没有,因为GPU可以通过并行计算的方式来减少内存延迟。因此CPU的Cahce设计主要是实现低延迟,Control主要是通用性,复杂的逻辑控制单元可以保证CPU高效分发任务和指令。所以CPU擅长逻辑控制,是串行计算,而GPU擅长高强度计算,是并行计算。打个比方,GPU就像成千上万的苦力,每个人干的都是类似的苦力活,相互之间没有依赖,都是独立的,简单的人多力量大;CPU就像包工头,虽然也能干苦力的活,但是人少,所以一般负责任务分配,人员调度等工作。

可以看出GPU加速是通过大量线程并行实现的,因此对于不能高度并行化的工作而言,GPU就没什么效果了。而CPU则是串行操作,需要很强的通用性,主要起到统管和分配任务的作用。

————————————————————————-华丽的分割线——————————————————————-

CUDA的官方文档(参考资料1)是这么介绍CUDA的:a general purpose parallel computing platform and programming model that leverages the parallel compute engine in NVIDIA GPUs to solve many complex computational problems in a more efficient way than on a CPU.

换句话说CUDA是NVIDIA推出的用于自家GPU的并行计算框架,也就是说CUDA只能在NVIDIA的GPU上运行,而且只有当要解决的计算问题是可以大量并行计算的时候才能发挥CUDA的作用。

接下来这段话摘抄自资料2。在 CUDA 的架构下,一个程序分为两个部份:host 端和 device 端。Host 端是指在 CPU 上执行的部份,而 device 端则是在显示芯片上执行的部份。Device 端的程序又称为 “kernel”。通常 host 端程序会将数据准备好后,复制到显卡的内存中,再由显示芯片执行 device 端程序,完成后再由 host 端程序将结果从显卡的内存中取回。

接下来这段话摘抄自资料2。在 CUDA 架构下,显示芯片执行时的最小单位是thread。数个 thread 可以组成一个block。一个 block 中的 thread 能存取同一块共享的内存,而且可以快速进行同步的动作。每一个 block 所能包含的 thread 数目是有限的。不过,执行相同程序的 block,可以组成grid。不同 block 中的 thread 无法存取同一个共享的内存,因此无法直接互通或进行同步。因此,不同 block 中的 thread 能合作的程度是比较低的。不过,利用这个模式,可以让程序不用担心显示芯片实际上能同时执行的 thread 数目限制。例如,一个具有很少量执行单元的显示芯片,可能会把各个 block 中的 thread 顺序执行,而非同时执行。不同的 grid 则可以执行不同的程序(即 kernel)。

————————————————————————-华丽的分割线——————————————————————-

cuDNN(CUDA Deep Neural Network library):是NVIDIA打造的针对深度神经网络的加速库,是一个用于深层神经网络的GPU加速库。如果你要用GPU训练模型,cuDNN不是必须的,但是一般会采用这个加速库。

  • 参考资料1:https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#thread-hierarchy
  • 参考资料2:http://www.smallgui.com/wp-content/uploads/2016/04/深入浅出谈CUDA.pdf

补充:查询版本命令

ubuntu:

cuda 版本 
nvcc -V
cat /usr/local/cuda/version.txt

cudnn 版本 
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

查看Nvidia GPU版本
nvidia-smi

//10s显示一次
watch -n 10 nvidia-smi

nvidia-smi -l

到此这篇关于深度学习之GPU,CUDA和cuDNN的理解的文章就介绍到这了,更多相关GPU,CUDA和cuDNN理解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python-json校验-jsonpath解析

    python-json校验-jsonpath解析

    这篇文章主要介绍了python-json校验-jsonpath,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • python RC4加密操作示例【测试可用】

    python RC4加密操作示例【测试可用】

    这篇文章主要介绍了python RC4加密操作,结合实例形式分析了python实现RC4加密功能的具体操作步骤与相关问题解决方法,需要的朋友可以参考下
    2019-09-09
  • Python列表计数及插入实例

    Python列表计数及插入实例

    这篇文章主要介绍了Python列表计数及插入的用法,以实例形式对列表的计数与插入用法做了较为详细的分析,需要的朋友可以参考下
    2014-12-12
  • Python实现的可可爱爱的小粽子详解

    Python实现的可可爱爱的小粽子详解

    我突发奇想做一个关于粽子的小游戏,基本原理:操控粽子吃掉爱心,即可增加分数,经过朋友game多测尝试最终完成小游戏
    2022-06-06
  • python图形用户界面tkinter之标签Label的使用说明

    python图形用户界面tkinter之标签Label的使用说明

    这篇文章主要介绍了python图形用户界面tkinter之标签Label的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)

    详解利用OpenCV提取图像中的矩形区域(PPT屏幕等)

    这篇文章主要介绍了详解利用OpenCV提取图像中的矩形区域(PPT屏幕等),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-07-07
  • 基于pytorch中的Sequential用法说明

    基于pytorch中的Sequential用法说明

    这篇文章主要介绍了基于pytorch中的Sequential用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • 老生常谈Python序列化和反序列化

    老生常谈Python序列化和反序列化

    下面小编就为大家带来一篇老生常谈Python序列化和反序列化。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • cv2.imread 和 cv2.imdecode 用法及区别

    cv2.imread 和 cv2.imdecode 用法及区别

    对于路径中含有中文的图像,直接用cv2.imread读取会报错,上次看到有大佬使用cv2.imdecode就可以正常读取,有点好奇,所以今天来记录下二者用法和区别,感兴趣的朋友跟随小编一起看看吧
    2023-02-02
  • Python 第一步 hello world

    Python 第一步 hello world

    Python 第一步 hello world 入门学习。
    2009-09-09

最新评论