显卡和异构计算

本文详细介绍了显卡的分类(集成、独立、核芯显卡)及其性能指标,如架构、流处理器、核心频率和显存位宽。讨论了异构计算的优势,特别是CPU与GPU的协同工作。CUDA作为GPU编程模型,使得GPU能有效处理深度学习等计算密集型任务。内容还包括如何检查GPU硬件配置和CUDA编程的基本概念。
摘要由CSDN通过智能技术生成
显卡和异构计算

本文采用知识共享署名 4.0 国际许可协议进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,可适当缩放并在引用处附上图片所在的文章链接。

显卡GPU

显卡:将计算机系统需要的显示信息进行转换驱动显示器,并向显示器提供逐行或隔行扫描信号,控制显示器的正确显示,是连接显示器和个人计算机主板的重要组件,是“人机”的重要设备之一,其内置的并行计算能力现阶段也用于深度学习等运算。
用NVIDIA显示芯片的显卡称为N卡,而将采用AMD显示芯片的显卡称为A卡。

显卡分类

集成显卡

集成显卡是将显示芯片、显存及其相关电路都集成在主板上,与其融为一体的元件;集成显卡的显示芯片有单独的,但大部分都集成在主板的北桥芯片中;一些主板集成的显卡也在主板上单独安装了显存,但其容量较小。
集成显卡的优点是功耗低、发热量小,集成显卡的缺点是性能相对略低,且固化在主板或CPU上,本身无法更换,如果必须换,就只能换主板。

独立显卡

独立显卡是指将显示芯片、显存及其相关电路单独做在一块电路板上,自成一体而作为一块独立的板卡存在,它需占用主板的扩展插槽(ISA、 PCI、AGP或PCI-E)。
独立显卡的优点是单独安装有显存,一般不占用系统内存,在技术上也较集成显卡先进得多,但性能肯定不差于集成显卡,容易进行显卡的硬件升级。独立显卡的缺点是系统功耗有所加大,发热量也较大。

核芯显卡

核芯显卡是Intel产品新一代图形处理核心,和以往的显卡设计不同,Intel 凭借其在处理器制程上的先进工艺以及新的架构设计,将图形核心与处理核心整合在同一块基板上,构成一个完整的处理器。智能处理器架构这种设计上的整合大大缩减了处理核心、图形核心、内存及内存控制器间的数据周转时间,有效提升处理效能并大幅降低芯片组整体功耗,有助于缩小核心组件的尺寸,为笔记本、一体机等产品的设计提供了更大选择空间。
需要注意的是,核芯显卡和传统意义上的集成显卡并不相同。笔记本平台采用的图形解决方案主要有“独立”和“集成”两种,前者拥有单独的图形核心和独立的显存,能够满足复杂庞大的图形处理需求,并提供高效的视频编码应用;集成显卡则将图形核心以单独芯片的方式集成在主板上,并且动态共享部分系统内存作为显存使用,因此能够提供简单的图形处理能力,以及较为流畅的编码应用。相对于前两者,核芯显卡则将图形核心整合在处理器当中,进一步加强了图形处理的效率,并把集成显卡中的“处理器+南桥+北桥(图形核心+内存控制+显示输出)”三芯片解决方案精简为“处理器(处理核心+图形核心十内存控制)十主板芯片(显示输出)”的双芯片模式,有效降低了核心组件的整体功耗,更利于延长笔记本的续航时间。

显卡性能

显卡的作用就在于接收CPU送来的影像资料,并经过GPU处理,再送到显示器。显卡相当于一个转运体系,将CPU送来的货经过GPU的加工,再送到显示器。本质上,显卡的性能就是处理“货”,也就是数据的能力强弱。

架构

英伟达从960时代的麦克斯架构 到10时代的帕斯卡架构 再到现在20系显卡采用的图灵架构。(帕斯卡用GP缩写 图灵用TU缩写)。

流处理器

流处理器(简称SP)是显卡参数中核心的核心,其能直接影响到显卡性能,个数说则显卡性能强。流处理器的作用是将图像的像素点一个一个的渲染,也就不难理解上述提到的越多越好的结论了,毕竟人多力量大。

核心频率

一般认为核心频率越高,显卡性能就越强。

显存位宽

显存位宽表示一个时钟周期内所能传送数据的位数,位数越大则传输量越大,常见的有64位、128位和256位显卡。在显存频率相当情况下,显存位宽决定着带宽的大小。(显存带宽=显存频率 * 显存位宽 )

异构计算

异构计算的英文名称是Heterogeneous computing,主要是指使用不同类型指令集和体系架构的计算单元组成系统的计算方式。
常见的计算单元类别包括CPU、GPU等协处理器、DSP、ASIC、FPGA等。我们常说的并行计算正是异构计算中的重要组成部分异构计算近年来得到更多关注,主要是因为通过提升CPU时钟频率和内核数量而提高计算能力的传统方式遇到了散热和能耗瓶颈。而与此同时,GPU等专用计算单元虽然工作频率较低,具有更多的内核数和并行计算能力,总体性能/芯片面积的比和性能/功耗比都很高,却远远没有得到充分利用。

CPU+GPU

CPU的目标是快速执行单一指令流;
CPU将其用于乱序执行、寄存器重命名、分支预测以及巨大的cache上,这些设计都是为了加速单一线程的执行速度;
CPU利用cache来降低内存访问延迟;
CPU通过大量的cache和分支预测来降低延迟,这些机制消耗了大量的晶体管的电能;
CPU每个核心支持1~2个线程;
CPU切换线程的代价是数百个时钟周期;
CPU通过SIMD(单指令多数据)来处理矢量数据;
Intel的CPU没有集成内存控制器

GPU的目标是快速执行大量的并行指令流;
GPU将晶体管用于处理器阵列、多线程管理、共享内存、内存控制器;
这些设计并不着眼于提高单一线程的执行速度,而是为了使GPU可以同时执行成千上万的线程;
实现线程间通信,并提供极高的内存带宽;
GPU使用cache来放大内存带宽;
GPU通过同时运行上千个线程来隐藏延迟,等待内存访问的线程会被切换掉,GPU切换线程不耗时间;
对于支持CUDA的GPU,每个流处理器可以同时处理1024个线程;
GPU切换线程的代价是0,事实上GPU通常每个时钟周期都切换线程;
GPU则使用SIMT(单指令多线程),SIMT的好处是无需开发者费力把数据凑成合适的矢量长度,并且SIMT允许每个线程有不同的分支;
支持CUDA的GPU集成有8个内存控制器,GPU的内存带宽通常是CPU的十倍。

CPU的长项是整数计算,GPU的优势则是浮点计算。

CUDA

CUDA Toolkit Documentation v11.0.3
CUDA是NVIDIA公司所开发的GPU编程模型,它提供了GPU编程的简易接口,基于CUDA编程可以构建基于GPU计算的应用程序,利用GPUs的并行计算引擎来更加高效地解决比较复杂的计算难题。近年来,GPU最成功的一个应用就是深度学习领域,基于GPU的并行计算已经成为训练深度学习模型的标配。

GPU并不是一个独立运行的计算平台,而需要与CPU协同工作,可以看成是CPU的协处理器,因此当我们在说GPU并行计算时,其实是指的基于CPU+GPU的异构计算架构。在异构计算架构中,GPU与CPU通过PCIe总线连接在一起来协同工作,CPU所在位置称为为主机端(host),而GPU所在位置称为设备端(device),如下:

GPU包括更多的运算核心,其特别适合数据并行的计算密集型任务,如大型矩阵运算,而CPU的运算核心较少,但是其可以实现复杂的逻辑运算,因此其适合控制密集型任务。另外,CPU上的线程是重量级的,上下文切换开销大,但是GPU由于存在很多核心,其线程是轻量级的。因此,基于CPU+GPU的异构计算平台可以优势互补,CPU负责处理逻辑复杂的串行程序,而GPU重点处理数据密集型的并行计算程序,从而发挥最大功效。
在这里插入图片描述

CUDA编程模型

CUDA编程入门极简教程
CUDA运算速度和显卡CUDA核心数量关系大吗?

CUDA编程模型是一个异构模型,需要CPU和GPU协同工作。在CUDA中,host和device是两个重要的概念,我们用host指代CPU及其内存,而用device指代GPU及其内存。CUDA程序中既包含host程序,又包含device程序,它们分别在CPU和GPU上运行。同时,host与device之间可以进行通信,这样它们之间可以进行数据拷贝。典型的CUDA程序的执行流程如下:

  1. 分配host内存,并进行数据初始化;
  2. 分配device内存,并从host将数据拷贝到device上;
  3. 调用CUDA的核函数在device上完成指定的运算;
  4. 将device上的运算结果拷贝到host上;
  5. 释放device和host上分配的内存。

检查的GPU的硬件配置

    int dev = 0;
    cudaDeviceProp devProp;
    CHECK(cudaGetDeviceProperties(&devProp, dev));
    std::cout << "使用GPU device " << dev << ": " << devProp.name << std::endl;
    std::cout << "SM的数量:" << devProp.multiProcessorCount << std::endl;
    std::cout << "每个线程块的共享内存大小:" << devProp.sharedMemPerBlock / 1024.0 << " KB" << std::endl;
    std::cout << "每个线程块的最大线程数:" << devProp.maxThreadsPerBlock << std::endl;
    std::cout << "每个EM的最大线程数:" << devProp.maxThreadsPerMultiProcessor << std::endl;
    std::cout << "每个EM的最大线程束数:" << devProp.maxThreadsPerMultiProcessor / 32 << std::endl;

    // 输出如下
    使用GPU device 0: GeForce GT 730
    SM的数量:2
    每个线程块的共享内存大小:48 KB
    每个线程块的最大线程数:1024
    每个EM的最大线程数:2048
    每个EM的最大线程束数:64

_global/device/host

GPU实际上是异构模型,所以需要区分host和device上的代码,在CUDA中是通过函数类型限定词开区别host和device上的函数,主要的三个函数类型限定词如下:

__global__:在device上执行,从host中调用(一些特定的GPU也可以从device上调用),返回类型必须是void,不支持可变参数参数,不能成为类成员函数。注意用__global__定义的kernel是异步的,这意味着host不会等待kernel执行完就执行下一步。
__device__:在device上执行,单仅可以从device中调用,不可以和__global__同时用。
__host__:在host上执行,仅可以从host上调用,一般省略不写,不可以和__global__同时用,但可和__device__,此时函数会在device和host都编译。

kernel

GPU上很多并行化的轻量级线程。kernel在device上执行时实际上是启动很多线程,一个kernel所启动的所有线程称为一个网格(grid),同一个网格上的线程共享相同的全局内存空间,grid是线程结构的第一层次,而网格又可以分为很多线程块(block),一个线程块里面包含很多线程,这是第二个层次。如下:

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

002237

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值