• Linux:GPU


    什么是GPU?

     CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景。CPU需要很强的通用性来处理各种不同的数据类型,同时又要逻辑判断又会引入大量的分支跳转和中断的处理。这些都使得CPU的内部结构异常复杂。而GPU面对的则是类型高度统一的、相互无依赖的大规模数据和不需要被打断的纯净的计算环境。

    于是CPU和GPU就呈现出非常不同的架构(示意图):

     

    图片来自nVidia CUDA文档。其中绿色的是计算单元橙红色的是存储单元橙黄色的是控制单元

    GPU采用了数量众多的计算单元和超长的流水线,但只有非常简单的控制逻辑并省去了Cache。而CPU不仅被Cache占据了大量空间,而且还有有复杂的控制逻辑和诸多优化电路,相比之下计算能力只是CPU很小的一部分

    CPU有强大的ALU(算术运算单元),它可以在很少的时钟周期内完成算术计算。

    当今的CPU可以达到64bit 双精度。执行双精度浮点源算的加法和乘法只需要1~3个时钟周期。

    CPU的时钟周期的频率是非常高的,达到1.532~3gigahertz(千兆HZ, 10的9次方).

    大的缓存也可以降低延时。保存很多的数据放在缓存里面,当需要访问的这些数据,只要在之前访问过的,如今直接在缓存里面取即可。

    复杂的逻辑控制单元。当程序含有多个分支的时候,它通过提供分支预测的能力来降低延时。

    数据转发。 当一些指令依赖前面的指令结果时,数据转发的逻辑控制单元决定这些指令在pipeline中的位置并且尽可能快的转发一个指令的结果给后续的指令。这些动作需要很多的对比电路单元和转发电路单元。 

    GPU是基于大的吞吐量设计。

    GPU的特点是有很多的ALU和很少的cache. 缓存的目的不是保存后面需要访问的数据的,这点和CPU不同,而是为thread提高服务的。如果有很多线程需要访问同一个相同的数据,缓存会合并这些访问,然后再去访问dram(因为需要访问的数据保存在dram中而不是cache里面),获取数据后cache会转发这个数据给对应的线程,这个时候是数据转发的角色。但是由于需要访问dram,自然会带来延时的问题。

    GPU的控制单元(左边黄色区域块)可以把多个的访问合并成少的访问。

    GPU的虽然有dram延时,却有非常多的ALU和非常多的thread. 为啦平衡内存延时的问题,我们可以中充分利用多的ALU的特性达到一个非常大的吞吐量的效果。尽可能多的分配多的Threads.通常来看GPU ALU会有非常重的pipeline就是因为这样。

     所以与CPU擅长逻辑控制,串行的运算。和通用类型数据运算不同,GPU擅长的是大规模并发计算,这也正是密码破解等所需要的。所以GPU除了图像处理,也越来越多的参与到计算当中来。

    GPU的工作大部分就是这样,计算量大,但没什么技术含量,而且要重复很多很多次。就像你有个工作需要算几亿次一百以内加减乘除一样,最好的办法就是雇上几十个小学生一起算,一人算一部分,反正这些计算也没什么技术含量,纯粹体力活而已。而CPU就像老教授,积分微分都会算,就是工资高,一个老教授资顶二十个小学生,你要是富士康你雇哪个?GPU就是这样,用很多简单的计算单元去完成大量的计算任务,纯粹的人海战术。这种策略基于一个前提,就是小学生A和小学生B的工作没有什么依赖性,是互相独立的。很多涉及到大量计算的问题基本都有这种特性,比如你说的破解密码,挖矿和很多图形学的计算。这些计算可以分解为多个相同的简单小任务,每个任务就可以分给一个小学生去做。但还有一些任务涉及到“流”的问题。比如你去相亲,双方看着顺眼才能继续发展。总不能你这边还没见面呢,那边找人把证都给领了。这种比较复杂的问题都是CPU来做的。

      总而言之,CPU和GPU因为最初用来处理的任务就不同,所以设计上有不小的区别。而某些任务和GPU最初用来解决的问题比较相似,所以用GPU来算了。GPU的运算速度取决于雇了多少小学生,CPU的运算速度取决于请了多么厉害的教授。教授处理复杂任务的能力是碾压小学生的,但是对于没那么复杂的任务,还是顶不住人多。当然现在的GPU也能做一些稍微复杂的工作了,相当于升级成初中生高中生的水平。但还需要CPU来把数据喂到嘴边才能开始干活,究竟还是靠CPU来管的。

    什么类型的程序适合在GPU上运行?

      (1)计算密集型的程序。所谓计算密集型(Compute-intensive)的程序,就是其大部分运行时间花在了寄存器运算上,寄存器的速度和处理器的速度相当,从寄存器读写数据几乎没有延时。可以做一下对比,读内存的延迟大概是几百个时钟周期;读硬盘的速度就不说了,即便是SSD, 也实在是太慢了。

      (2)易于并行的程序。GPU其实是一种SIMD(Single Instruction Multiple Data)架构, 他有成百上千个核,每一个核在同一时间最好能做同样的事情。

    liunx查看GPU信息

    neofetch

    查看系统信息,如系统版本、内核版本、CPU、内存等信息

    所有操作系统自带软件源内无此软件的,安装步骤大致为:添加软件源、导入密钥、刷新包管理器缓存、使用包管理器安装该软件,以Centos为例。

    1、安装 epel-release

    yum install epel-release
    

    2、添加第三方软件源

    curl -o /etc/yum.repos.d/konimex-neofetch-epel-7.repo https://copr.fedorainfracloud.org/coprs/konimex/neofetch/repo/epel-7/konimex-neofetch-epel-7.repo
    

    3、使用包管理器安装 neofetch

    yum install neofetch
    

    hardinfo

    HardInfo可以收集有关系统硬件和操作系统的信息,执行基准测试,并以HTML或纯文本格式生成可打印的报告。

    1、安装

    apt-get install hardinfo
    

    2、图形化界面查看

    3、要生成报告并在终端中显示它

    hardinfo -r

    4、列表模块

    hardinfo -l

    lshw

    lshw 是一个能把我们出去硬件信息的小工具,它能为我们提供内存配置、固件版本、主板配置信息、CPU版本和速度、cache信息、总线速度等。它能运行在 DMI兼容的 x86、IA-64和一些 PowerPC的平台上

    参数:
    
    -version       :显示 lshw的版本
    -help          :显示帮助信息
    -X             :启动图形界面
    -html          :将设备信息以 html的格式输出
    -xml           :将设备信息以 xml的格式输出
    -json          :将设备信息以 json的格式输出
    -short         :带有设置路径的简短输出(类似与 HP-UX的 ioscan输出形式)
    -businfo       :输出详细的总线信息(包含 SCSI, USB, IDE and PCI地址)
    -dump filename :将收集到的信息输出到一个SQLite数据库中
    -class class   :仅仅显示指定类型的硬件,在使用 lshw -short or lshw -businfo时我们能见到这写 class,
                     常见的有这些:system、bus、memory、processor、bridge、display、communication、
                              multimedia、network、disk、volume、powoer
    -C class       :等同与 -class class
    -enable test   :启用测试,测试项能包含这些:
                     dmi (for DMI/SMBIOS extensions)
                     device-tree (for OpenFirmware device tree)
                     spd (for memory Serial Presence Detect)
                     memory (for memory-size guessing heuristics)
                     cpuinfo (for kernel-reported CPU  detection)
                     cpuid  (for  CPU  detection)
                     pci  (for  PCI/AGP access)
                     isapnp  (for ISA PnP extensions)
                     pcmcia (for PCMCIA/PCCARD)
                     ide (for IDE/ATAPI)
                     usb (for USB devices)
                     scsi (for SCSI)
                     network (for net‐work interfaces detection)
    -disable test
    -quiet         :不现实状态
    -sanitize      :移除IP地址、序列号等敏感信息
    -numeric       :显示 PCI和USB设备的数字 ID

    gpustat

    nvidia-smi是 Nvidia 显卡命令行管理套件,基于 NVML 库,旨在管理和监控 Nvidia GPU 设备。

    gpustat 基于nvidia-smi,可以提供更美观简洁的展示,结合 watch 命令,可以动态实时监控 GPU 的使用情况。

    nvidia-smi 
    

    输出:显存占用、GPU 利用率

    1、安装

    pip install gpustat
    

    2、使用

    watch --color -n1 gpustat -cpu
    

    输出:

    显存可以看成是空间,类似于内存。显存用于存放模型,数据显存越大,所能运行的网络也就越大,GPU 计算单元类似于 CPU 中的核,用来进行数值计算。

    衡量计算量的单位是 flop: the number of floating-point multiplication-adds,浮点数先乘后加算一个 flop。计算能力越强大,速度越快。衡量计算能力的单位是 flops: 每秒能执行的 flop 数量

    参考

    1、CentOS 7 安装 neofetch

    2、安装和使用Hardinfo、Sysinfo、Lshw以在Linux上查找硬件规格

    3、lshw命令

    4、基于nvidia gpu监控工具gpustat的使用(ubuntu下)

    5、gpustat : Linux下面监控GPU状态

    6、CPU和GPU的设计区别

    作者: Pam

    出处: https://www.cnblogs.com/pam-sh/>

    关于作者:网安在读

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(mir_soh@163.com)咨询.

  • 相关阅读:
    [剑指Offer] 10.矩形覆盖
    [剑指Offer] 9.变态跳台阶
    [剑指Offer] 8.跳台阶
    [剑指Offer] 7.斐波那契数列
    ArtifactTransferException: Failure to transfer org.apache.openejb:javaee-api:jar:5.0-1
    -Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HO 解决办法
    java中判断list是否为空的用法
    PL/SQL快速选中一行并执行
    substring的用法
    Oracle---------sql 中取值两列中值最大的一列
  • 原文地址:https://www.cnblogs.com/pam-sh/p/15436942.html
Copyright © 2020-2023  润新知