热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

CUDA的硬件实现

原文地址NVIDIA的GPU架构是围绕可扩展的多线程流多处理器阵列(SMs)构建的。当主机CPU上的CUDA程序调用内核网格时,网格的块被枚举并分配给具有可用执行能

原文地址

NVIDIA 的 GPU 架构是围绕可扩展的多线程流多处理器阵列(SMs)构建的。当主机 CPU 上的 CUDA 程序调用内核网格时,网格的块被枚举并分配给具有可用执行能力的多处理器。线程块的线程在一个多处理器上并发执行,多个线程块可以在一个多处理器上并发执行。当线程块终止时,在空出的多处理器上启动新的块。

多处理器被设计成同时执行数百个线程。为了管理如此大量的线程,它使用了 SIMT 体系结构 中描述的独特的 SIMT 体系结构(单指令、多线程)。这些指令被流水线化,以便在单个线程中利用指令级并行,以及通过同时进行硬件多线程(详见硬件多线程)广泛地利用线程级并行。与 CPU 内核不同,它们是按顺序发布的,没有分支预测,也没有投机执行

SIMT 体系结构 和 硬件多线程 描述了所有设备共有的流多处理器的体系结构特征。
计算能力 3.x,计算能力 5.x,计算能力 6.x 和计算能力 7.x 分别提供了计算能力 3.x, 5.x, 6.x, 7.x 设备的细节。

NVIDIA 的 GPU 架构采用小端表示。


SIMT 架构

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

当一个多处理器有一个或多个线程块要执行时,它将这些线程块划分为多个 warp ,每个 warp 由一个 warp 调度程序调度执行。块被分割成 warp 的方式总是相同的;每个 warp 包含连续的线程——第一个 warp 包含线程 0,线程 id逐个累加 。线程层次结构描述线程 id 是如何与块中的线程索引相关联的。

一个 warp 每次执行一条共同指令,所以当一个 warp 的 32 个线程它们的执行路径都相同时,就可以实现完全的效率。如果 warp 的线程通过依赖于数据的条件产生分支发散,warp 将执行所采取的每个分支路径,禁用不在该路径上的线程。分支发散只发生在 warp 内;不管执行的是共同的代码路径还是互斥的代码路径,不同的 warp 都是独立执行的。

SIMT 体系结构类似于 SIMD (单指令、多数据)向量组织,因为一条指令控制多个处理元素。一个关键的区别是 SIMD 向量组织向软件公开 SIMD 宽度,而 SIMT 指令指定单个线程的执行和分支行为。与 SIMD 向量机相反,SIMT 使程序员能够为独立的标量线程编写线程级并行代码,以及为协调线程编写数据并行代码。为了保证正确性,程序员基本上可以忽略 SIMT 行为;然而,通过注意代码避免在 warp 处出现线程发散,就可以实现显著的性能改进。实际上,这类似于传统代码中高速缓存线的作用:在设计正确性时可以安全地忽略高速缓存线的大小,但在设计性能峰值时,必须在代码结构中考虑高速缓存线的大小。另一方面,向量架构要求软件将合并加载到向量中,并手动管理发散。

在 Volta 之前, warp 使用一个程序计数器(在 warp 中的所有32个线程之间共享),并使用一个激活掩码指定 warp 内的活跃线程。因此,来自不同区域或不同执行状态的同一 warp 内的线程不能相互发送信号或交换数据,而需要细粒度共享由锁或互斥锁保护的数据的算法很容易导致死锁,这取决于争用线程来自哪个 warp 。

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

如果开发人员假设以前的硬件体系结构具有warp -同步性,那么独立的线程调度可能导致一组不同的线程参与到执行的代码中,因此执行的结果可能会和设想的有出入。特别是,任何 warp 同步代码(如无同步、减少内 warp )都应该重新检查,以确保与 Volta 或更高版本兼容。参见计算能力7.x 查询详情。


注意:

参与当前指令的 warp 线程称为活动线程,而不在当前指令上的线程为非活动线程(禁用)。线程可以因为各种各样的原因变成非活动的,包括比同一个 warp 中其他线程提前退出 、采取了一条同目前 warp 执行的路径不同的分支路径、或者是最后一个线程块的线程,该线程块的线程数量并不是一个 warp 大小的倍数。

如果 warp 执行的是一个非原子指令,且该 warp 内有多于一个的线程在全局或共享内存写入相同的位置,发生在该位置的序列化写入数量取决于设备的计算能力(见计算能力 3.x,计算能力 5.x,计算能力 6.x,以及计算能力 7.x),而执行最终写入的线程是未定义的。

如果 warp 执行的是一个原子指令,且该 warp 内的多个线程读取、修改和写入了全局内存中的相同位置,则每次产生的读取/修改/写入该位置的操作都是序列化的,但是它们发生的顺序没有定义。


硬件多线程

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

特别地,每个多处理器都有一组 32 位寄存器,这些寄存器在 warp 之间划分,以及一个并行数据缓存或共享内存,这些内存是在线程块之间进行划分。

对于给定的内核,可以在多处理器上驻留和一起处理的块和 warp 的数量取决于内核使用的寄存器和共享内存的数量,以及多处理器上可用的寄存器和共享内存的数量每个多处理器还具有最大驻留块数和最大驻留 warp 数。这些限制以及多处理器上可用的寄存器和共享内存的数量是设备计算能力的函数,并在附录计算能力中给出。如果每个多处理器没有足够的寄存器或共享内存来处理至少一个块,内核将无法启动。

块内 warp 的总数如下:

     Ceil(T/W_{size}, 1),


  • T 是每个块的线程数,
  • W_{size}是 warp 尺寸,等于32,
  • ceil(x, y)等于 x 四舍五入到 y 的最近倍数。

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


推荐阅读
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • 深入理解Java中的volatile、内存屏障与CPU指令
    本文详细探讨了Java中volatile关键字的作用机制,以及其与内存屏障和CPU指令之间的关系。通过具体示例和专业解析,帮助读者更好地理解多线程编程中的同步问题。 ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 配置Windows操作系统以确保DAW(数字音频工作站)硬件和软件的高效运行可能是一个复杂且令人沮丧的过程。本文提供了一系列专业建议,帮助你优化Windows系统,确保录音和音频处理的流畅性。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 尽管某些细分市场如WAN优化表现不佳,但全球运营商路由器和交换机市场持续增长。根据最新研究,该市场预计在2023年达到202亿美元的规模。 ... [详细]
  • 本文深入探讨了Linux系统中网卡绑定(bonding)的七种工作模式。网卡绑定技术通过将多个物理网卡组合成一个逻辑网卡,实现网络冗余、带宽聚合和负载均衡,在生产环境中广泛应用。文章详细介绍了每种模式的特点、适用场景及配置方法。 ... [详细]
  • 武汉大学计算机学院研究生入学考试科目及专业方向
    武汉大学计算机学院为考生提供了多个硕士点,涵盖计算机科学与技术、软件工程、信息安全等多个领域。考研科目包括思想政治理论、英语一或二、数学一或二以及专业基础课程。具体的专业方向和考试科目详见正文。 ... [详细]
author-avatar
泰山长征
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有