问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

GPU 架构与 CUDA 关系详解:并行计算平台、编程模型与算力计算

创作时间:
作者:
@小白创作中心

GPU 架构与 CUDA 关系详解:并行计算平台、编程模型与算力计算

引用
CSDN
1.
https://blog.csdn.net/xiaoxiaowenqiang/article/details/138272199

本文将深入探讨NVIDIA GPU架构与CUDA的关系,详细讲解CUDA并行计算平台和编程模型,CUDA线程层次结构,以及GPU算力的计算方法。这些内容对于理解GPU在并行计算中的应用具有重要参考价值。

NVIDIA GPU 硬件基础概念

GPU(图形处理单元)是一种专为图形渲染而设计的处理器。与传统的CPU相比,GPU拥有更多的核心和更高的内存带宽,使其在处理大规模并行计算任务时具有显著优势。NVIDIA的GPU架构通常包括多个流处理器(Streaming Multiprocessors,SMs),每个SM包含多个核心和内存控制器,用于执行并行计算任务。

A100 GPU架构中GPC(Graphic Processing Cluster)表示图像处理簇,一共有8个。共有两个L2 Cache并且可以互相实现数据同步,通过Memory Controller实现与高带宽存储器HBM2(High Bandwidth Memory)进行数据交换。

每个GPC中包含TPC(Texture processing cluster)表示纹理处理簇,每个处理簇被分为多个SM(Streaming Multiprocessors)流处理器,SM中包含多个CUDA core和Tensor Core,用于处理图形图形和AI张量计算。

SM(Streaming Multiprocessors)称作流式多处理器,核心组件包括CUDA核心、共享内存、寄存器等。SM包含很多为线程执行数学运算的core,是英伟达GPU的核心,在CUDA中可以执行数百个线程、一个block上线程放在同一个SM上执行,一个SM有限的Cache制约了每个block的线程数量。

SM主要组成如表所示,以英伟达GP100为例,一共有64个CUDA Core,Register File存储大小为256 KB,Shared Memory内存大小为64 KB,Active Thread总线程数量是2048,Active Block数量是32,Active Grid数量是8。

组件名称
功能描述
CUDA Core
向量运算单元,包括FP32-FPU、FP64-DPU、INT32-ALU
Tensor Core
张量运算单元,支持FP16、BF16、INT8、INT4
Special Function Units
特殊函数单元,处理超越函数和数学函数,例如反平方根、正余弦等
Warp Scheduler
线程束调度器
Dispatch Unit
指令分发单元
Multi Level Cache
多级缓存,包括L0/L1指令缓存、L1数据缓存及共享内存
Register File
寄存器堆
Load/Store
访问存储单元,负责数据处理

SP(Streaming Processor)流处理器是最基本的处理单元,最后线程具体的指令和任务都是在SP上进行处理的,GPU在进行并行计算时就是很多个SP同时处理。在Fermi架构之后,SP被改称为CUDA Core,通过CUDA来控制具体的指令执行。

在Fermi架构中,通过CUDA来控制具体的指令执行,是最小的运算执行单元。所以对于现在的NVIDIA GPU架构来讲,流处理器的数量就是CUDA Core的数量。一个SM中包含了2组各16个CUDA Core,每个CUDA Core包含了一个整数运算单元ALU(Arthmetic Logit Unit)和一个浮点运算单元FPU(Floating Point Unit)。

Volta架构取消CUDA core,变为单独的FP32 FPU和INT32 ALU,因为FP32:INT32是1:1的关系,因此还是可以将它们合并起来一起称为原来的CUDA Core,这样做的好处是每个SM现在支持FP32和INT32的并发执行,同时新增了光线追踪RT Core。

Warp是线程束,逻辑上所有Thread并行执行,但是从硬件的角度讲并不是所有的Thread能够在同一时刻执行,因此引入Warp。Warp是SM基本执行单元,一个Warp包含32个并行Thread(warp_size=32),这32个Thread执行SIMT(Single Instruction Multiple Thread)指令模式。

也就是说,所有的Thread以锁步的方式执行同一条指令,但是每个Thread会使用各自的Data执行指令分支。如果在Warp中没有32个Thread需要工作,那么Warp虽然还是作为一个整体运行,但这部分Thread是处于非激活状态。此外,Thread是最小的逻辑单位,Warp是硬件执行单位。

CUDA 并行计算平台和编程模型

CUDA(Compute Unified Device Architecture)是NVIDIA开发的一种并行计算平台和编程模型,它允许开发者使用C/C++语言编写程序,充分利用GPU的并行计算能力。CUDA编程模型将GPU视为一个设备(device),而CPU则作为主机(host)。主机负责任务调度和数据传输,而设备则负责执行并行计算任务。

2006年11月,NVIDIA推出CUDA(Compute Unified Device Architecture),通用并行计算架构(Parallel Computing Architecture)和编程模型(Programming Model),利用GPU的并行处理能力,将GPU用作通用并行计算设备,以加速各种计算任务,而不仅限于图形处理。

CUDA编程模型允许开发人员在GPU上运行并行计算任务,基于LLVM构建了CUDA编译器,开发人员可以使用CUDA C/C++语言编写并行程序,通过调用CUDA API将计算任务发送到GPU执行。CUDA编程模型包括主机(CPU)和设备(GPU)之间的协作,此外还提供了对其它编程语言的支持,比如C/C++,Python,Fortran等语言,支持OpenCL和DirectCompute等应用程序接口。

CUDA在软件方面由一个CUDA库、一个应用程序编程接口(API)及其运行库(Runtime)、两个较高级别的通用数学库,即CUFFT和CUBLAS组成。CUDA TOOLKIT包括编译和C++核,CUDA DRIVER驱动GPU负责内存和图像管理。CUDA-X LIBRARIES主要提供了机器学习(Meachine Learning)、深度学习(Deep Learning)和高性能(High Performance Computing)计算方面的加速库,APPS & FRAMEWORKS主要对接Tensorflow和Pytorch等框架。

CUDA 线程层次结构

CUDA最基本的执行单位是线程(Thread),图中每条曲线可视为单个线程,大的网格(Grid)被切分成小的网格,其中包含了很多相同线程数量的块(Block),每个块中的线程独立执行,可以通过本地数据共享实现数据交换同步。因此对于CUDA来讲,就可以将问题划分为独立线程块,并行解决的子问题,子问题划分为可以由块内线程并行协作解决。

CUDA引入主机端(host)和设备(device)概念,CUDA程序中既包含主机(host)程序也包含设备(device)程序,host和device之间可以进行通信,以此来实现数据拷贝,主机负责管理数据和控制程序流程,设备负责执行并行计算任务。在CUDA编程中,Kernel是在GPU上并行执行的函数,开发人员编写Kernel来描述并行计算任务,然后在主机上调用Kernel来在GPU上执行计算。

代码cuda_host.cpp是只使用CPU在host端实现两个矩阵的加法运算,其中在CPU上计算的kernel可看作是加法运算函数,代码中包含内存空间的分配和释放。

  • CUDA编程基本概念
  • 线程(Thread):CUDA的最基本执行单位。在GPU上,大量的线程可以同时执行,从而实现并行计算。
  • 块(Block):多个线程组成块。块是CUDA编程中的一个重要概念,它允许程序员组织和管理线程。
  • 网格(Grid):由多个块组成。网格是CUDA程序在GPU上执行时的顶层结构。
  • 主机端(Host):通常指CPU及其内存,负责控制程序的执行流程、数据的管理以及与设备的通信。
  • 设备端(Device):指GPU及其内存,负责执行并行计算任务。

GPU 算力计算

GPU的算力通常通过浮点运算能力来衡量,具体指标包括单精度浮点运算能力(FP32)和双精度浮点运算能力(FP64)。算力计算通常涉及以下几个关键参数:

  • 核心频率(Core Clock):GPU核心的运行速度,以兆赫兹(MHz)为单位。
  • 核心数量:GPU中用于执行计算任务的核心数量。
  • 显存带宽(Memory Bandwidth):GPU与显存之间数据传输的速度,以每秒传输的数据量(GB/s)为单位。

通过综合考虑这些参数,可以计算出GPU的理论峰值算力。例如,对于单精度浮点运算,算力峰值可以通过以下公式计算:

算力峰值(FP32) = 核心频率 × 核心数量 × 每个核心的单精度浮点运算能力

需要注意的是,实际算力利用率会受到多种因素的影响,如任务调度、内存访问模式等。因此,在实际应用中,需要根据具体任务和数据集来优化CUDA程序,以充分发挥GPU的性能。

总结:GPU架构与CUDA之间的关系是相辅相成的。NVIDIA的GPU架构为并行计算提供了强大的硬件支持,而CUDA则提供了一种高效的编程模型,使开发者能够充分利用GPU的性能。通过深入了解CUDA线程层次结构和GPU算力计算方法,我们可以更好地优化大模型的计算性能,提高算力利用率。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号