当前位置: 首页 > news >正文

4. 硬件实现

博客补充:

CUDA C++ 编程指南学习_c++ cuda编程-CSDN博客icon-default.png?t=O83Ahttps://blog.csdn.net/qq_62704693/article/details/141225395?spm=1001.2014.3001.5501NVIDIA GPU 架构是围绕可扩展的多线程流式多处理器 (SM) 阵列构建的。当主机 CPU 上的 CUDA 程序调用内核网格时,网格的块被枚举并分发到具有可用执行能力的多处理器。线程块的线程在一个多处理器上并发执行,多个线程块可以在一个多处理器上并发执行。当线程块终止时,将在空出的多处理器上启动新块。

多处理器旨在并发执行数百个线程。为了管理如此大量的线程,它采用了一种称为 SIMT单指令、多线程)的独特架构,如 SIMT 架构中所述。指令是流水线化的,利用单个线程中的指令级并行性,以及通过同步硬件多线程实现的广泛线程级并行性,如硬件多线程中所述。与 CPU 内核不同,它们是按顺序发布的,没有分支预测或推测执行。

SIMT 体系结构和硬件多线程描述了所有设备通用的流式多处理器的体系结构功能。计算能力 5.x、计算能力 6.x 和计算能力 7.x 分别提供了计算能力 5.x、6.x 和 7.x 的设备的具体信息。

NVIDIA GPU 架构使用 little-endian 表示。

4.1. SIMT 架构

多处理器以 32 个并行线程(称为 warp)为一组创建、管理、调度和执行线程。组成 warp 的各个线程从同一个程序地址一起开始,但它们有自己的指令地址、计数器和寄存器状态,因此可以自由分支和独立执行。经线一词起源于织造,这是第一种平行线技术。半 Warp 是 Warp 的前半部分或后半部分。四分之一经纱是经纱的第一、第二、第三或第四四分之一。

当一个多处理器被赋予一个或多个线程块来执行时,它会将它们划分为 warp,每个 warp 都由 warp 调度器调度执行。块被划分为 warps 的方式总是相同的;每个 warp 都包含连续的线程,线程 ID 不断增加,第一个 warp 包含线程 0。线程层次结构 描述线程 ID 与块中的线程索引的关系。

一个 warp 一次执行一条公共指令,因此当 warp 的所有 32 个线程都同意其执行路径时,就可以实现最高效率。如果 warp 的线程通过数据依赖的条件分支发散,则 warp 将执行所采用的每个分支路径,从而禁用不在该路径上的线程。分支发散仅发生在 warp 内;不同的 WARP 独立执行,无论它们是执行公共代码路径还是不相交的代码路径。

SIMT 架构类似于 SIMD (Single Instruction, Multiple Data) 向量组织,因为单个指令控制多个处理元素。一个关键区别在于,SIMD 向量组织向软件公开 SIMD 宽度,而 SIMT 指令指定单个线程的执行和分支行为。与 SIMD 向量机相比,SIMT 使程序员能够为独立的标量线程编写线程级并行代码,以及为协调线程编写数据并行代码。为了正确性,程序员基本上可以忽略 SIMT 行为;但是,通过注意代码很少要求 warp 中的线程发散,可以实现实质性的性能改进。在实践中,这类似于传统代码中 cache 行的作用: 在设计正确性时可以安全地忽略 Cache 行大小,但在设计峰值性能时必须在代码结构中考虑它。另一方面,矢量架构需要软件将负载合并为矢量并手动管理发散。

在 NVIDIA Volta 之前,warp 使用在 warp 中的所有 32 个线程之间共享的单个程序计数器,以及指定 warp 活动线程的活动掩码。因此,来自不同区域或不同执行状态的同一 warp 的线程无法相互发出信号或交换数据,并且需要精细共享由锁或互斥锁保护的数据的算法很容易导致死锁,具体取决于争用线程来自哪个 warp。

从 NVIDIA Volta 架构开始,独立线程调度允许线程之间完全并发,而不管 warp 如何。使用独立线程调度,GPU 可以维护每个线程的执行状态,包括程序计数器和调用堆栈,并且可以在每个线程的粒度上产生执行,以更好地利用执行资源或允许一个线程等待另一个线程生成数据。调度优化器确定如何将来自同一 warp 的活动线程分组到 SIMT 单元中。这保留了与以前的 NVIDIA GPU 一样 SIMT 执行的高吞吐量,但具有更大的灵活性:线程现在可以以 sub-warp 粒度发散和重新收敛。

如果开发人员对 warp-synchronicity 做出假设,则独立线程调度可能会导致一组与预期完全不同的线程参与执行的代码2以前的硬件架构。特别是,任何 warp 同步代码(例如无同步、intra-warp 减少)都应该重新审视,以确保与 NVIDIA Volta 及更高版本兼容。有关更多详细信息,请参阅 Compute Capability 7.x。

注意

参与当前指令的 warp 线程称为活动线程,而不在当前指令上的线程处于非活动状态(禁用)。线程处于非活动状态的原因有很多,包括比其 warp 的其他线程更早退出,采用的分支路径与 warp 当前执行的分支路径不同,或者是线程数不是 warp 大小的倍数的块的最后一个线程。

如果 warp 执行的非原子指令写入 warp 的多个线程的全局或共享内存中的同一位置,则对该位置发生的序列化写入次数会因设备的计算能力而异(请参阅计算能力 5.x、计算能力 6.x、 和 Compute Capability 7.x),并且哪个线程执行最终写入是不确定的。

如果 warp 执行的原子指令对 warp 的多个线程的全局内存中的同一位置进行读取、修改和写入,则对该位置的每次读取/修改/写入都会发生,并且它们都被序列化,但它们出现的顺序是不确定的。

4.2. 硬件多线程

由 multiprocessor 处理的每个 warp 的执行上下文 (程序计数器、寄存器等) 在 warp 的整个生命周期内都保留在片上。因此,从一个执行上下文切换到另一个执行上下文没有成本,并且在每个指令发出时,warp 调度器都会选择一个具有线程准备执行其下一条指令(warp 的活动线程)的 warp,并向这些线程发出指令。

特别是,每个 multiprocessor 都有一组在 warps 之间分区的 32 位 registers,以及一个在 thread blocks 之间分区的 parallel data cache 或 shared memory

对于给定内核,可以在 multiprocessor 上驻留并一起处理的 blocks 和 warp 的数量取决于 kernel 使用的 registers 和 shared memory 的数量以及 multiprocessor 上可用的 registers 和 shared memory 的数量。每个多处理器也有最大常驻块数和最大常驻 warp 数。这些限制以及 multiprocessor 上可用的 registers 和 shared memory 数量是器件计算能力的函数,在 Compute Capabilities 中给出。如果每个 multiprocessor 没有足够的 registers 或 shared memory 来处理至少一个 block,则内核将无法启动。

一个区块中的 warp 总数如下:

ceil(\frac{T}{W_{size}},1)

  • T 是每个块的线程数,

  • Wsize 是变形大小,等于 32,

  • ceil(x, y) 等于 x 向上舍入到最接近的 y 的倍数。

为块分配的寄存器总数和共享内存总量记录在 CUDA 工具包中提供的 CUDA 占用计算器中。

2

术语 warp-synchronous 是指隐式假设同一 warp 中的线程在每条指令上都同步的代码。

相关文章:

4. 硬件实现

博客补充: CUDA C 编程指南学习_c cuda编程-CSDN博客https://blog.csdn.net/qq_62704693/article/details/141225395?spm1001.2014.3001.5501NVIDIA GPU 架构是围绕可扩展的多线程流式多处理器 (SM) 阵列构建的。当主机 CPU 上的 CUDA 程序…...

《操作系统真象还原》第3章 完善MBR【3.1 — 3.2】

目录 引用与说明 3.1、地址、section、vstart 浅尝辄止 1、什么是地址 2、什么是 section【汇编】 3、什么是 vstart【汇编】 3.2、CPU 的实模式 1、CPU 工作原理【重要】 2、实模式下的寄存器 4、实模式下 CPU 内存寻址方式 5、栈到底是什么玩意儿 6 ~ 8 无条件转移…...

八大排序-冒泡排序

在里面找动图理解 【数据结构】八大排序(超详解附动图源码)_数据结构排序-CSDN博客 一 简介 冒泡排序应该是我们最熟悉的排序了,在C语言阶段我们就学习了冒泡排序。 他的思想也非常简单: 两两元素相比,前一个比后一个大就交换&#xff0…...

基于Spring Boot+Vue的助农销售平台(协同过滤算法、节流算法、支付宝沙盒支付、图形化分析)

🎈系统亮点:协同过滤算法、节流算法、支付宝沙盒支付、图形化分析; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构:B/S架构 运行环境:win10/win11、jdk17 前端&…...

uniapp写抖音小程序阻止右滑返回上一个页面

最近用uniapp写小程序遇到一个问题因为内部用到右滑的业务&#xff0c;但是只要右滑就会回到上一页面&#xff0c;用了event.preventDeafult()没有用&#xff0c;看了文档找到了解决办法 1.在最外层view加上touchstart事件 <view class"container" touchstart&q…...

华为配置手工负载分担模式链路聚合实验

目录 组网需求 配置思路 操作步骤 配置文件 组网图形 图1 配置手工负载分担模式链路聚合组网图 组网需求配置思路操作步骤配置文件 组网需求 如图1所示&#xff0c;AC1和AC2通过以太链路分别都连接VLAN10和VLAN20&#xff0c;且AC1和AC2之间有较大的数据流量。 用户希望A…...

【Spring】Cookie与Session

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;计算机网络那些事 一、Cookie是什么&#xff1f; Cookie的存在主要是为了解决HTTP协议的无状态性问题&#xff0c;即协议本身无法记住用户之前的操作。 "⽆状态" 的含义指的是: 默认情况…...

chat_gpt回答:qt中,常见格式及格式转换

在Qt中&#xff0c;常见的数据格式包括&#xff1a; QVariant&#xff1a;可以存储多种数据类型&#xff0c;包括整型、浮点型、字符串、布尔值、日期等。QString&#xff1a;用于存储和处理文本字符串。QByteArray&#xff1a;用于处理字节数组&#xff0c;常用于二进制数据。…...

CSS兼容处理

“前端开发兼容——CSS篇” 在前端开发中&#xff0c;CSS样式的兼容性问题常常让开发者感到棘手&#xff0c;尤其是当涉及到IE浏览器时。由于IE浏览器版本繁多&#xff0c;每个版本在CSS支持上还存在差异&#xff0c;这导致开发者在实现统一的视觉效果时&#xff0c;不得不编写…...

制氮机分子筛的材质选择

制氮机分子筛的材质选择对于其性能和效率至关重要。作为制氮设备中的核心部件&#xff0c;分子筛承担着将空气中的氮气与氧气有效分离的重任。以下是对制氮机分子筛常用材质的详细探讨&#xff1a; 制氮机分子筛的主要材质 碳分子筛(CMS) 碳分子筛由活性炭经过特殊工艺加工而成…...

使用Virtual Audio Cable捕获系统音频输出并使用Python处理

一、下载安装Virtual Audio Cable&#xff0c;软件下载地址和安装过程略过。 二、Virtual Audio Cable使用方法Virtual Audio Cable使用笔记一&#xff1a;使用Virtual Audio Cable将播放器的音频流传输到真实声卡驱动中_virtual audio cable control panel-CSDN博客 三、打开…...

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖及性能分析

微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖及性能分析 目录 微信小程序scroll-view吸顶css样式化表格的表头及iOS上下滑动表头的颜色覆盖及性能分析 1、iOS在scroll-view内部上下滑动吸顶的现象 正常的上下滑动吸顶覆盖&#xff1a; iOS及iPa…...

HDU-1695 GCD

题目大意&#xff1a;已知 1 < x < b , 1 < y < d , 求 gcd ( x , y ) k 的对数。请注意&#xff0c;&#xff08;x5&#xff0c; y7&#xff09; 和 &#xff08;x7&#xff0c; y5&#xff09; 被认为是相同的。 思路&#xff1a;先将 gcd ( x , y ) k 两边同时…...

unity游戏开发之赛车游戏

在这个 unity 2d 赛车游戏教程中&#xff0c;我将构建一款移动超休闲赛车游戏。 这将是一个简单的 unity 2d 汽车游戏。所以这将需要有一个可以无限滚动的背景。 我们需要避开一些障碍。一些评分系统。 以及一种使用我们的手机加速度计控制我们的汽车的方法。然后&#xff0c;我…...

解决milvus migration 迁移数据到出现数据丢失问题

在迁移数据的时候发现数据丢失 问题是数据在批量迁移的过程中&#xff0c;这个错误会被忽略掉 分析下来是因为buuferSize 设置的是500条数据&#xff0c;但是迁移工具对一次迁移的数据是是有大小限制的&#xff0c;如果500条数据的总大小大于4194304&#xff0c;就会导致数据…...

Python Flask 数据库开发

Python Flask 数据库开发 引言环境配置创建 Flask 应用&#xff0c;连接数据库定义路由定义模型创建表创建 API 数据库直接操作启动 Flask 应用app.py 示例运行 Flask访问应用 展望 引言 在现代 web 开发中&#xff0c;Python 的 Flask 框架因其轻量和灵活性受到广泛欢迎。结合…...

深度学习(七)深度强化学习:融合创新的智能之路(7/10)

一、深度强化学习的崛起 深度强化学习在人工智能领域的重要地位 深度强化学习作为一种融合了深度学习和强化学习的新技术&#xff0c;在人工智能领域占据着至关重要的地位。它结合了深度学习强大的感知能力和强化学习优秀的决策能力&#xff0c;能够处理复杂的任务和环境。例如…...

mac电脑通过 npm 安装 @vue/cli脚手架超时问题;

npm 安装 vue/cli遇到的问题步骤 一、安装 Homebrew 如果你还没有安装 Homebrew&#xff0c;首先需要安装它。Homebrew 是 macOS 上的一款包管理工具&#xff0c;它允许你通过简单的命令行指令安装、更新和卸载软件包。&#xff1b; 1, 打开终端&#xff08;Terminal&#xf…...

【52 机器学习 | 基于KNN近邻和随机森林模型对用户转化进行分析与预测】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 字段说明2.4 删除重复值2.5 删除空值 &#x1f3f3;️‍&#x1f308; 3. 数据分析-特征分析3.1 年龄及转化率分析3.2 各营销渠道人数及…...

【Linux】Zookeeper 部署

Zookeeper 搭建方式 单机模式&#xff1a;Zookeeper只运行在一台服务器上&#xff0c;适合测试环境伪集群模式&#xff1a;就是在一台物理机上运行多个Zookeeper 实例&#xff1b;集群模式&#xff1a;Zookeeper运行于一个集群上&#xff0c;适合生产环境&#xff0c;这个计算…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

CTF show Web 红包题第六弹

提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框&#xff0c;很难让人不联想到SQL注入&#xff0c;但提示都说了不是SQL注入&#xff0c;所以就不往这方面想了 ​ 先查看一下网页源码&#xff0c;发现一段JavaScript代码&#xff0c;有一个关键类ctfs…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...