CUDA基础(三)CPU架构,指令,GPU架构

这篇具有很好参考价值的文章主要介绍了CUDA基础(三)CPU架构,指令,GPU架构。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、CPU架构(指令的执行)

CPU中央处理器,负责执行用户和操作系统下发的指令。CPU只能接受01二进制语言,0和1用来控制高低电位。比如,一个加法运算,在x86处理器上的的二进制代码为:

01001000 00000001 11000011

这样一行代码被称为机器码,它执行了加法操作。除了这样的加法,CPU的电路还要实现很多其他指令,如存取内存数据,进行逻辑判断等。不同厂商的电路设计不同,在电路上所能进行的二进制码不同。某类CPU能支持一种指令集(instruction set architecture)。指令集相当于一种设计图纸,规定了一种CPU架构实现哪些指令。

参照指令集,硬件开发人员只需要关心如何设计电路,软件开发人员只关心如何用01机器码实现软件功能。比较常见的指令集有x86、ARM、MIPS、SPARC、Power等。

一个单核CPU架构包括:

  1. Control Unit(CU)起协调管理功能。
  2. Arithmetic Logic Unit(ALU)接受控制单元的命令,负责进行加减乘与或非运算。所有数据都存放在寄存器(Register)里。
  3. 寄存器以极高的速度与CU和ALU交互,通常小于1纳秒。从寄存器的名字可以看出来,里面的数据是临时寄存的,这些数据和指令会被ALU和CU拿来立即进行计算。如果寄存器没有CPU想要的数据,CPU会去内存或硬盘中读取。
  4. CPU通过Bus(总线)读取内存或其他设备的数据。计算机中有多条总线。

随着技术的发展,计算机的速度瓶颈已经变成了超高速的CPU运算速度与落后的数据读取速度之间的矛盾。CPU计算速度在纳秒级别,但是CPU读取主存的速度竟有百纳秒,CPU进行完计算后,要闲置几十倍的时间,实在是巨大的浪费。为了解决这个问题,设计人员为CPU增加了很多中间缓存Cache。
CPU的寄存器存取速度极快,但是造价成本太高,发热量大,不能被大量采用。
当单个CPU主频超过一定范围后,CPU成本和散热成了很大的问题,主频很难突破10GHz。为了获得更快的计算速度和更好的性能,芯片设计者决定绕过主频,采用人海战术,在一块CPU中增加多个核心(Core)。
一个核心是一个可以运行指令的独立单元,它包含了前面所提到的ALU和寄存器,并配备L1和L2 Cache。多个核心共享L3 Cache。

高性能服务器通常可以支持多个处理器(CPU),提供更多计算核心。支持单个CPU的服务器被称为单路服务器,支持两个CPU的服务器被称为双路服务器,支持四个CPU的服务器被称为四路服务器。Intel的四路架构,系统支持四个CPU,假如每块CPU内有8个核心,系统可对外提供32核计算能力。


在多核架构出现之前,CPU在某个特定时刻只能执行某个程序,无法并行。但前文提到,CPU处理速度是纳秒级,速度非常快,所以在单核时代,为了同时处理多项任务,CPU采用不停地在多个线程任务间切换的形式实现多线程

一个kernel实际上会启动很多线程,这些线程是逻辑上并行的,但是在物理层却并不一定。这其实和CPU的多线程有类似之处,多线程如果没有多核支持,在物理层也是无法实现并行的。逻辑上和单核CPU一样,虽然只有一个核,但是还能实现多线程。

单个CPU每次切换不同的线程任务,会产生一些资源开销。
但是随着多核多线程架构出现,又引出另外一个问题:多线程安全问题。当多个核心都处理相同任务,极有可能使用同一块数据,就有可能出现数据读写的问题:例如,进行i = i + 1操作,如果两个线程短时间内都对变量i加一,变量应该被加了两次。

由于两个线程相隔时间太短,加上前面所说的缓存机制,计算的过程和临时结果还在寄存器和L1缓存,没来得及写到主存上(缓存保存问题)。线程B读到还是较老的数据,这样就出现了数据不一致的情况。这种问题被称为线程安全问题。一般需要使用锁来处理线程安全问题。


二、语言和编译(使用指令)

编译型语言与解释型语言如何在计算机底层运行

前面说到,不同架构的CPU会适配一套指令集,而书写指令集的代码被称为机器语言或机器码。
很多时候我们使用计算机时都接触得到可执行文件(.exe文件),而可执行文件就是二进制机器语言的集合,可以被机器执行,得到我们想要的结果。

  1. 编译型语言

正是基于不同厂商有不同的指令集,催生了C语言,建立了一个更为通用的编程范式。
C语言从源代码到执行,要使用编译器来编译(compile)、汇编(assembly)并连接(link)所依赖的库,形成机器可执行文件。执行某个二进制文件时,操作系统会为程序分配内存和CPU资源。“编译”和“汇编”,相当于将C语言翻译成底层语言。另外,代码中使用了库函数printf,当我们使用别人写好的函数时,需要将这些前人写好的库函数连接到我们的可执行文件中,否则会调用函数失败的错误。我们将这种需要编译的语言称为编译型语言。编译型语言有C/C++、Fortran等。
编译、汇编、连接缺一不可,特别是连接的存在,导致不同文件编译的顺序要求严格,继而调试困难。
又由于不同操作系统下,因为架构的不同,调用各种接口的代码也会不同,继而编译过程也不相同,应用软件也就有了不同操作系统下的不同版本。

  1. 解释型语言

因为IT圈的一句名言就是:计算机科学任何领域的问题都可以通过增加一个中间层来解决。一些大牛忍受不了C语言这样编写和调试太慢,系统平台之间无法共享移植的问题,于是开始自立门户,创建了新的编程语言,最有名的要数Java和Python,这类语言不需要每次都编译,因此被称为解释型语言。matlab、R、JavaScript也是解释语言。
解释型语言一般是使用C语言等偏底层的语言做一个虚拟机或者解释器,编程人员需要先在自己的计算机上安装这个解释器,接下来就只用关心自己的源代码,其他的事情都交给解释器去做。
如果把编译型语言的编译过程比作将源代码“翻译”成机器语言的话,那么解释性语言就是同声传译。
编译型语言是一篇提前就“翻译”好的稿子,拿过来就能被读出来,这样肯定更快;解释型语言要等翻译边“听”边“翻译”,速度当然慢很多。


如果我比较贪心,又想要高效率,也不想损失可移植性和易用性呢?当前的技术为我们提供了两个方案:

1、使用编译型语言写的模块:
以Python为例,为了保证性能,大部分高性能科学计算库其实都是使用编译型语言编写的。比如numpy,用户安装numpy的包时,其实就是下载了C/C++和Fortran源代码,并在本地编译成了可执行的文件
2、JIT(Just-In-Time) 即时编译技术
JIT把需要加速的代码编译成了机器语言,不再需要“同声传译”拖累自己了。比如在Python上调用numba库进行过JIT测试,同样的代码会有8倍以上的速度提升。而numba不仅可以编译用于CPU执行的代码,达到和C相比拟的速度,同时还可以调用GPU库(如NVIDIA的CUDA和AMD的ROCs等)来实现GPU加速,这些都可以简单的利用Python中的装饰器来实现。


三、GPU架构

在进行计算时,都需要用核心(Core)来做算术逻辑运算。核心中有ALU(逻辑运算单元)和寄存器等电路。在进行计算时,一个核心只能顺序执行某项任务。为了同时并行地处理更多任务,芯片公司开发出了多核架构,只要相互之间没有依赖,每个核心做自己的事情,多核之间互不干扰,就可以达到并行计算的效果,极大缩短计算时间。

个人桌面电脑CPU只有2到8个CPU核心,数据中心的服务器(多个CPU)上也只有20到40个左右CPU核心,GPU却有上千个核心。与CPU的核心不同,GPU的核心只能专注于某些特定的任务,但是在执行比较简单而重复的任务时,GPU的超多核心就表现出了巨大的优势。

GPU核心在做计算时,只能直接从显存中读写数据,程序员需要在代码中指明哪些数据需要从内存和显存之间相互拷贝。这些数据传输都是在总线上,因此总线的传输速度和带宽成了部分计算任务的瓶颈。也因为这个瓶颈,很多计算任务并不适合放在GPU上。比如在深度学习中,因为输入是大规模稀疏特征,GPU加速获得的收益小于数据互相拷贝的时间损失。

CPU主要从主存(Main Memory)中读写数据,并通过总线(Bus)与GPU交互。GPU除了有超多计算核心外,也有自己独立的存储,被称之为显存。
显存再往下分为什么register,shared memory,L1,啊啥的,一级一级,同理于CPU的register,L1,L2,Main Memory,Fixed Rigid Disk,Optical Disk,Magnetic Tape

ps:Cache的层次,一般有L1, L2, L3 (L是level的意思)的cache。 通常来说L1,L2是集成 在CPU里面的(可以称之为On-chip cache),而L3是放在CPU外面(可以称之为Off-chip cache)。
一个核心是一个可以运行指令的独立单元,它包含了前面所提到的ALU和寄存器,并配备L1和L2 Cache。多个核心共享L3 Cache。

一台服务器上可以安装多块GPU卡,但GPU卡的发热量极大,普通的空调系统难以给大量GPU卡降温,所以大型数据中心通常使用水冷散热,并且选址在温度较低的地方。

以上结构也被称为异构计算:使用CPU+GPU组合来加速计算。世界上顶尖的数据中心和超级计算机均采用了异构计算架构。例如超越天河2号成为世界第一的超级计算机Summit使用了9216个IBM POWER9 CPU和27648个英伟达Tesla GPU。

NIVIDA软件栈

英伟达能够在人工智能时代成功,除了他们在长期深耕显卡芯片领域,更重要的是他们率先提供了可编程的软件架构。2007年,英伟达发布了CUDA编程模型,软件开发人员从此可以使用CUDA在英伟达的GPU上进行并行编程。

继CUDA之后,英伟达不断丰富其软件技术栈,提供了科学计算所必须的cuBLAS线性代数库,cuFFT快速傅里叶变换库等,当深度学习大潮到来时,英伟达提供了cuDNN深度神经网络加速库,目前常用的TensorFlow、PyTorch深度学习框架的底层大多基于cuDNN库。

GPU编程可以直接使用CUDA的C/C++版本进行编程,也可以使用其他语言包装好的库,比如Python可使用Numba库调用CUDA。CUDA的编程思想在不同语言上都很相似。文章来源地址https://www.toymoban.com/news/detail-721349.html

到了这里,关于CUDA基础(三)CPU架构,指令,GPU架构的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CUDA:矩阵转置的GPU实现(Share Memory)

    本文参加2022CUDA on Platform线上训练营学习笔记 欢迎各位 大犇 提意见 上图中将 m * n 的矩阵A通过矩阵转置变成了 n * m 的 A T ,简单来讲矩阵转置即为将原始矩阵的第一行转置为目标矩阵的第一列,以此类推, 相信基础扎实的你简单地看看CPU端的代码就能理解 定义一个名为 cpu_t

    2024年02月12日
    浏览(35)
  • Linux和Windows系统下:安装Anaconda、Paddle、tensorflow、pytorch,GPU[cuda、cudnn]、CPU安装教学,以及查看CPU、GPU内存使用情况

    Anaconda安装:Anaconda是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。使用Anaconda可以通过创建多个独立的Python环境,避免用户的Python环境安装太多不同版本依赖导致冲突。 Anaconda 是一个免费开源的 Python 和 R 语言的发行版本,用于计算科学,Anac

    2024年02月04日
    浏览(61)
  • 深度学习部署(十九): CUDA RunTime API YOLOV5后处理cpu解码以及gpu解码

    看看我们干了什么, 就是把bouding box恢复成框而已 对于模型推理后的后处理,可以直接使用cuda核函数进行解码,效率比较高 nms也可以在核函数里面实现 这里演示了一个yolov5的实际案例,后续其他的操作都是类似的 gpu_decoder难度较大,一般先写一个cpu的decoder, 再写个gpu_decode

    2023年04月11日
    浏览(49)
  • GPU加速02:超详细Python Cuda零基础入门教程,没有显卡也能学!

    Python是当前最流行的编程语言,被广泛应用在深度学习、金融建模、科学和工程计算上。作为一门解释型语言,它运行速度慢也常常被用户诟病。著名Python发行商Anaconda公司开发的Numba库为程序员提供了Python版CPU和GPU编程工具,速度比原生Python快数十倍甚至更多。使用Numba进行

    2024年02月02日
    浏览(58)
  • 将GPU版本的torch和torchvision下载至本地进行安装,解决torch.cuda.is_available()为False的情况,本文主要解决CPU版本的torch问题。

    这是困扰我很久的问题,今天花了一点时间去研究一下为什么我的cuda和cudann安装完成了,却不能使用GPU,原因是我的torch和torchvision是cpu版本的,必须下载GPU版本的才能使torch.cuda.is_available()为True,本文使用将文件下载到文件夹后进行安装。 1、打开Anaconda Prompt(Anaconda3)  2、打开

    2024年02月10日
    浏览(61)
  • 构建Docker基础镜像(ubuntu20.04+python3.9.10+pytorch-gpu-cuda11.8)

    内容如下 访问官网下载页 https://www.python.org/downloads/release/python-3910/ 下拉选择 Gzipped 包 ps:创建镜像名为 ub2004py3910pytorchgpucuda118 标签为 latest 的镜像,从当前路径下的 DockerFile 文件打包

    2024年02月05日
    浏览(82)
  • AI芯片架构体系综述:芯片类型CPU\GPU\FPGA\ASIC以及指令集CSIS\RISC介绍

    大模型的发展意味着算力变的越发重要,因为大国间科技竞争的关系,国内AI从业方在未来的一段时间存在着算力不确定性的问题,与之而来的是许多新型算力替代方案的产生。如何从架构关系上很好的理解计算芯片的种类,并且从计算类型、生态、流片能力等多角度评估算

    2024年02月04日
    浏览(48)
  • 【CUDA】GPU 算力与 CUDA 版本对应关系

    官方算力表:https://developer.nvidia.com/cuda-gpus#compute 2.1. 信息来源 1 https://docs.nvidia.com/datacenter/tesla/drivers/index.html#cuda-arch-matrix 2.2. 信息来源 2 https://en.wikipedia.org/wiki/CUDA#GPUs_supported

    2024年01月19日
    浏览(37)
  • CUDA编程(一):GPU计算与CUDA编程简介

    NVIDIA公司发布的CUDA是建立在GPU上的一个通用并行计算平台和编程模型,CUDA编程可以利用GPU的并行计算引擎来更加高效地解决比较复杂的计算难题。GPU的并行计算最成功的一个应用就是深度学习领域。 GPU通常不作为一个独立运行的计算平台,而需要与CPU协同工作,它可以看成

    2024年02月16日
    浏览(47)
  • 显卡GPU与CUDA

    GPU就是显卡 Graphics Processing Unit 图像处理单元 显卡主要用于在屏幕上显示图像,用于与视频,图像处理相关的任务 独立显卡比较大,性能更加强,装在主机当中 笔记本也有独立显卡 挖矿,打游戏,深度学习都是使用独立显卡 比较小,嵌入在CPU中 核显日常的工作可以胜任的

    2023年04月27日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包