cuda学习2:cuda编程基本概念

CUDA基本概念

主机(host)

通常将起控制作用的CPU称为主机(host)

设备(device)

将起加速作用的 GPU 称为设备(device)

流处理器(streaming processor)

物理上,GPU最基本的处理单元为SP(streaming processor),又称为CUDA core,主要包括若干整数型运算的核心、若干单精度浮点数运算的核心、若干双精度浮点数运算的核心、若干单精度浮点数超越函数的特殊函数单元、若干混合精度的张量核心(有伏特架构引进,适用于机器学习)。

最后具体的指令和任务都是在SP上处理的,GPU进行并行计算,即为多个SP同时做处理。
每个核心可以在一个时钟周期内执行一个线程。

流多处理器(streaming multiprocessor)

流多处理器SM(streaming multiprocessor)则是GPU的核心,又称为GPU大核,是GPU并行计算的核心单元。

一个典型的SM包括以下几个组件:

  • 核心SP
  • 共享内存/一级缓存 ShareMem/Cache
  • 寄存器文件Reg File
  • 加载/存储单元LD/ST
  • 特殊功能单元SFU
  • 线程束调度器 Warp Sched

每个SM包含多个流处理器SP(CUDA core),以及共享内存、寄存器等资源,所以每个SM都可以并行执行多个线程。
每个流式多处理器可以视为具有较小结构的CPU,支持指令并行(多发射)。

在这里插入图片描述

不同的NVIDIA GPU架构(例如Turing, Pascal, Maxwell, Kepler等)具有不同的SM设计和资源配置。
例如,某些架构可能在每个SM上有更多的CUDA核心,而其他架构可能有更多的共享内存或寄存器。

SM可以并发地执行许多线程,一般可以同时调度多个线程块。SM的基本执行单元是线程束(thead warp),线程束包含32个线程,这些线程同时执行相同的指令,但是每个线程都包含自己的指令地址计数器和寄存器状态,也有自己独立的执行路径,这导致了即便线程束中的线程同时从同一程序地址执行,但是可能具有不同的行为(比如遇到了分支结构,一些线程可能进入这个分支,但是另外一些有可能不执行,它们只能死等(因为GPU规定线程束中所有线程在同一周期执行相同的指令)),这被称为"线程束分化"。当线程块被划分到某个SM上时,它将进一步划分为多个线程束,因为这才是SM的基本执行单元,但是一个SM同时并发的线程束数是有限的。这是因为资源限制,SM要为每个线程块分配共享内存,而也要为每个线程束中的线程分配独立的寄存器。

全局内存(Global Memory)

GPU的主存储器,容量较大,但访问速度较慢。
所有的线程都可以对全局内存进行读写。缓存可加速对全局内存的访问。所有通过cudaMalloc分配的存储器都是全局内存。

共享内存(Shared Memory)

每个SM内部的高速缓存,供同一SM内的线程共享。
访问速度比全局内存快得多。

寄存器(Registers)

每个线程的私有存储空间,用于保存临时变量。
寄存器是访问速度最快的空间。

当我们在核函数中不加修饰的声明一个变量,那该变量就是寄存器变量,如果在核函数中定义了常数长度的数组,那也会被分配到Registers中;寄存器变量是每个线程私有的,当这个线程的核函数执行完成后,寄存器变量也就不能访问了。

寄存器是比较稀缺的资源,空间很小,Fermi架构中每个线程最多63个寄存器,Kepler架构每个线程最多255个寄存器;一个线程中如果使用了比较少的寄存器,那么SM中就会有更多的线程块,GPU并行计算速度也就越快。

如果一个线程中变量太多,超出了Registers的空间,这时寄存器就会发生溢出,就需要其他内存(Local Memory)来存储,当然程序的运行速度也会降低。

本地内存(Local Memory)

Local Memory也是每个线程私有的,但却是存储在于Global Memory中的。在核函数中符合存储在寄存器中但不能进入核函数分配的寄存器空间中的变量将被存储在Local Memory中。

Local Memory中可能存放的变量有以下几种:

  • 使用未知索引的本地数组
  • 较大的本地数组或结构体
  • 任何不满足核函数寄存器限定条件的变量

常量内存

线程(Thread)、线程块(Block)、网格(Grid)

GPU使用线程(Thread)作为最小的执行单位。
线程被组织成线程块(Block),多个线程块组成网格(Grid)。

在这里插入图片描述

以上图为例子,把网格和线程块都看作一个三维的矩阵。这里假设网格是一个333的三维矩阵, 线程块是一个444的三维矩阵。

线程束(Warp)

线程束(warp)作为并行处理的基石,通过将线程组合成一个执行单元,简化了线程管理,使线程间能够共享数据和资源,并通过有效的调度掩盖内存延迟。

Nvidia把32个threads组成一个warp,warp是调度和运行的基本单元。它们会被同时调度到一个SM上执行。

核函数

核函数是运行在GPU上的函数,可以并行执行,核函数通过特殊的语法和关键字定义,并且是 GPU 编程的核心。
定义核函数:

  • 必须使用限定词__global__修饰
  • 核函数返回值必须是void
  • 核函数通常以<<<blockNum, threadNum>>>形式来配置执行线程和块

参考文档
https://blog.csdn.net/qq_42761751/article/details/144297840
https://zhuanlan.zhihu.com/p/544864997

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

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

相关文章

AVL树的介绍与学习

目录 1.前言 2.AVL树 3.AVL树的插入 平衡因子的更新 更新停止的条件 旋转 1.前言 在学习了二叉搜索树&#xff0c;set和map之后&#xff0c;我们接下来趁热打铁&#xff0c;继续学习AVL树。 2.AVL树 1.AVL树具有二叉搜索树的性质&#xff0c;但是它的左右子树的高度差不…

数字人接大模型第二步:实时语音同步

接上例第一步,还是dh_live项目,增加了一个完整的实时对话样例,包含vad-asr-llm-tts-数字人全流程,以弥补之前的只有固定的问答的不足。 VAD(Voice Activity Detection,语音活动检测)VAD用于检测用户是否正在说话,从而触发后续的语音处理流程。 ASR(Automatic Speech R…

01_Long比较值 类型相同值不同

问题描述&#xff1a; 看如下代码&#xff1a; Long a 128L; Long b 128L;System.out.println(a b);运行结果如下&#xff1a; 明明 a 和 b 的值一样&#xff0c;但是结果却为 False&#xff0c;为什么同样的类型&#xff0c;同样的值&#xff0c;却不相等&#xff0c;这是…

EKS环境下服务重启50X错误

EKS中&#xff0c;当使用AWS Load Balancer Controller时&#xff0c;ALB有两种模式&#xff0c;Internet-facing和Internet&#xff0c;当使用Internet模式时&#xff0c;ALB注册的是NodeIP&#xff1b;使用Internet-facing模式时&#xff0c;ALB注册的则是Pod IP。从模式上来…

Android项目升级插件到kotlin 2.1.0后混淆网络请求异常

背景 项目kt插件1.9.24升级到2.1.0后打包编译release网络请求失败了。 retrofit版本2.9.0 错误详情 java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedTypeat retrofit2.m.a(Unknown Source:2477)at retrofit2.K.invoke(U…

Vue中Axios实战指南:高效网络请求的艺术

Axios作为Vue生态中最流行的HTTP客户端&#xff0c;以其简洁的API和强大的功能成为前后端交互的首选方案。本文将带你深入掌握Axios在Vue项目中的核心用法和高级技巧。 一、基础配置 1. 安装与引入 npm install axios 2. 全局挂载&#xff08;main.js&#xff09; import …

Flink维表深度解析

一、维表的概念与作用 维表&#xff08;Dimension Table&#xff09; 是数据仓库中的核心概念&#xff0c;通常用于存储静态或缓慢变化的业务实体信息&#xff08;如用户资料、商品信息、地理位置等&#xff09;。在实时流处理场景中&#xff0c;维表的作用是为主数据流&#…

SKLearn - Biclustering

文章目录 Biclustering &#xff08;双聚类&#xff09;谱二分聚类算法演示生成样本数据拟合 SpectralBiclustering绘制结果 Spectral Co-Clustering 算法演示使用光谱协同聚类算法进行文档的二分聚类 Biclustering &#xff08;双聚类&#xff09; 关于双聚类技术的示例。 谱…

PostSwigger Web 安全学习:CSRF漏洞2

CSRF 漏洞学习网站&#xff1a;What is CSRF (Cross-site request forgery)? Tutorial & Examples | Web Security Academy CSRF 漏洞&#xff1a;SameSite相关绕过 当浏览器访问服务器时&#xff0c;服务器会在 Cookie 中添加 SameSite 属性来告诉浏览器是否在来自其他…

从基础到实战的量化交易全流程学习:1.3 数学与统计学基础——概率与统计基础 | 数字特征

从基础到实战的量化交易全流程学习&#xff1a;1.3 数学与统计学基础——概率与统计基础 | 数字特征 第一部分&#xff1a;概率与统计基础 第2节&#xff1a;数字特征&#xff1a;期望值、方差、协方差与相关系数 一、期望值&#xff08;Expected Value&#xff09;&#xff1a…

MySQL(聚合函数)

单行函数 对每一条记录输入值进行计算&#xff0c;得到相应的计算结果&#xff0c;返回给用户&#xff0c;也就是说&#xff0c;每条记录作为一个输入参数&#xff0c;经过函数计算得到每条记录的计算结果。 每一个函数中都有一些常用的函数&#xff08;方法&#xff09; 在学…

babel核心知识点

Babel 是一个 JavaScript 编译器&#xff0c;主要用于将 ECMAScript 2015 版本的代码转换为向后兼容的 JavaScript 代码&#xff0c;以便在旧版本的浏览器或环境中运行。以下是 Babel 的核心知识点&#xff1a; 1. 基本概念 编译器&#xff1a;Babel 本质上是一个编译器&…

javaScript--数据结构和算法

在 JavaScript 里&#xff0c;数据结构和算法是十分关键的部分&#xff0c;下面介绍几种常见的数据结构和对应的算法。 数组&#xff08;Array&#xff09; 数组是最基础的数据结构&#xff0c;用于存储一系列有序的数据。 // 创建数组 const arr [1, 2, 3, 4, 5];// 访问元素…

π0.5:带开放世界泛化的视觉-语言-动作模型

25年4月来自具身机器人创业公司 PI 公司的论文“π0.5: a Vision-Language-Action Model with Open-World Generalization”。 为了使机器人发挥作用&#xff0c;它们必须在实验室之外的现实世界中执行实际相关的任务。虽然视觉-语言-动作 (VLA) 模型在端到端机器人控制方面已…

使用 OpenCV 和 dlib 进行人脸检测

文章目录 1. 什么是 dlib2. 前期准备介绍2.1 环境准备2.2 dlib 的人脸检测器 3. 代码实现3.1 导入库3.2 加载检测器3.3 读取并调整图像大小3.4 检测人脸3.5 绘制检测框3.6 显示结果 4. 完整代码5. 优化与改进5.1 提高检测率5.2 处理 BGR 与 RGB 问题 6. 总结 人脸检测是计算机视…

spring 的PropertySource 类与 @PropertySource 注解详解与对比

PropertySource 类与 PropertySource 注解详解与对比 在这里插入图片描述 一、PropertySource 类详解 1. 类型与作用 类型&#xff1a;接口&#xff08;org.springframework.core.env.PropertySource&#xff09;作用&#xff1a;抽象配置数据源&#xff0c;提供统一的键值…

Java后端开发day37--源码解析:TreeMap可变参数--集合工具类:Collections

&#xff08;以下内容全部来自上述课程&#xff09; 1. TreeMap 1.1 须知 1.1.1 Entry 节点初始为黑色&#xff1a;提高代码阅读性 1.1.2 TreeMap中的成员变量 comparator&#xff1a;比较规则root&#xff1a;红黑树根节点的地址值size&#xff1a;集合的长度和红黑树…

基于Playwright的浏览器自动化MCP服务

一、服务定位与核心功能 github.com/executeautomation/mcp-playwright 是一个基于 Playwright&#xff08;微软开源的跨浏览器自动化测试框架&#xff09;的 Model Context Protocol (MCP) 服务&#xff0c;核心功能是将浏览器自动化能力集成到大语言模型&#xff08;LLM&…

OSPF网络协议

OSPF&#xff08;Open Shortest Path First&#xff09;是一种链路状态路由协议&#xff0c;属于IGP&#xff08;内部网关协议&#xff09;&#xff0c;用于在单一自治系统&#xff08;AS&#xff09;内动态分发路由信息。它通过计算最短路径&#xff08;基于Dijkstra算法&…

Ubuntu 22.04.4操作系统初始化详细配置

上一章节&#xff0c;主要讲解了Ubuntu 22.04.4操作系统的安装&#xff0c;但是在实际生产环境中&#xff0c;需要对Ubuntu操作系统初始化&#xff0c;从而提高系统的性能和稳定性。 一、查看Ubuntu系统版本和内核版本 # 查看系统版本 testubuntu:~$ sudo lsb_release -a Rel…