热门标签 | 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占用计算器 中。


推荐阅读
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • 阿里巴巴终面技术挑战:如何利用 UDP 实现 TCP 功能?
    在阿里巴巴的技术面试中,技术总监曾提出一道关于如何利用 UDP 实现 TCP 功能的问题。当时回答得不够理想,因此事后进行了详细总结。通过与总监的进一步交流,了解到这是一道常见的阿里面试题。面试官的主要目的是考察应聘者对 UDP 和 TCP 在原理上的差异的理解,以及如何通过 UDP 实现类似 TCP 的可靠传输机制。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 高端存储技术演进与趋势
    本文探讨了高端存储技术的发展趋势,包括松耦合架构、虚拟化、高性能、高安全性和智能化等方面。同时,分析了全闪存阵列和中端存储集群对高端存储市场的冲击,以及高端存储在不同应用场景中的发展趋势。 ... [详细]
  • Dell Latitude 5290 2-in-1 平板电脑黑苹果体验评测
    本文基于notebookcheck的详细数据和个人实际使用体验,对Dell Latitude 5290 2-in-1平板电脑进行评测。评测内容包括外观设计、散热性能、基准测试、游戏表现和续航能力等方面,旨在为读者提供全面的参考。 ... [详细]
  • 本文总结了一些开发中常见的问题及其解决方案,包括特性过滤器的使用、NuGet程序集版本冲突、线程存储、溢出检查、ThreadPool的最大线程数设置、Redis使用中的问题以及Task.Result和Task.GetAwaiter().GetResult()的区别。 ... [详细]
  • 秒建一个后台管理系统?用这5个开源免费的Java项目就够了
    秒建一个后台管理系统?用这5个开源免费的Java项目就够了 ... [详细]
  • MySQL的查询执行流程涉及多个关键组件,包括连接器、查询缓存、分析器和优化器。在服务层,连接器负责建立与客户端的连接,查询缓存用于存储和检索常用查询结果,以提高性能。分析器则解析SQL语句,生成语法树,而优化器负责选择最优的查询执行计划。这一流程确保了MySQL能够高效地处理各种复杂的查询请求。 ... [详细]
  • 本文通过思维导图的形式,深入解析了大型网站技术架构的核心原理与实际案例。首先,探讨了大型网站架构的演化过程,从单体应用到分布式系统的转变,以及各阶段的关键技术和挑战。接着,详细分析了常见的大型网站架构模式,包括负载均衡、缓存机制、数据库设计等,并结合具体案例进行说明。这些内容不仅有助于理解大型网站的技术实现,还能为实际项目提供宝贵的参考。 ... [详细]
  • OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战
    OpenAI首席执行官Sam Altman展望:人工智能的未来发展方向与挑战 ... [详细]
  • B站服务器故障影响豆瓣评分?别担心,阿里巴巴架构师分享预防策略与技术方案
    13日晚上,在视频观看高峰时段,B站出现了服务器故障,引发网友在各大平台上的广泛吐槽。这一事件导致了连锁反应,大量用户纷纷涌入A站、豆瓣和晋江等平台,给这些网站带来了突如其来的流量压力。为了防止类似问题的发生,阿里巴巴架构师分享了一系列预防策略和技术方案,包括负载均衡、弹性伸缩和容灾备份等措施,以确保系统的稳定性和可靠性。 ... [详细]
  • ### 优化后的摘要本学习指南旨在帮助读者全面掌握 Bootstrap 前端框架的核心知识点与实战技巧。内容涵盖基础入门、核心功能和高级应用。第一章通过一个简单的“Hello World”示例,介绍 Bootstrap 的基本用法和快速上手方法。第二章深入探讨 Bootstrap 与 JSP 集成的细节,揭示两者结合的优势和应用场景。第三章则进一步讲解 Bootstrap 的高级特性,如响应式设计和组件定制,为开发者提供全方位的技术支持。 ... [详细]
  • 本文汇集了我在网络上搜集以及在实际面试中遇到的前端开发面试题目,并附有详细解答。无论是初学者还是有一定经验的开发者,都应深入理解这些问题背后的原理,通过系统学习和透彻研究,逐步形成自己的知识体系和技术框架。 ... [详细]
  • 本文深入探讨了NoSQL数据库的四大主要类型:键值对存储、文档存储、列式存储和图数据库。NoSQL(Not Only SQL)是指一系列非关系型数据库系统,它们不依赖于固定模式的数据存储方式,能够灵活处理大规模、高并发的数据需求。键值对存储适用于简单的数据结构;文档存储支持复杂的数据对象;列式存储优化了大数据量的读写性能;而图数据库则擅长处理复杂的关系网络。每种类型的NoSQL数据库都有其独特的优势和应用场景,本文将详细分析它们的特点及应用实例。 ... [详细]
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社区 版权所有