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


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Tomcat/Jetty为何选择扩展线程池而不是使用JDK原生线程池?
    本文探讨了Tomcat和Jetty选择扩展线程池而不是使用JDK原生线程池的原因。通过比较IO密集型任务和CPU密集型任务的特点,解释了为何Tomcat和Jetty需要扩展线程池来提高并发度和任务处理速度。同时,介绍了JDK原生线程池的工作流程。 ... [详细]
  • 从高级程序员到CTO的4次能力跃迁!如何选择适合的技术负责人?
    本文讲解了从高级程序员到CTO的4次能力跃迁,以及如何选择适合的技术负责人。在初创期、发展期、成熟期的每个阶段,创业公司需要不同级别的技术负责人来实现复杂功能、解决技术难题、提高交付效率和质量。高级程序员的职责是实现复杂功能、编写核心代码、处理线上bug、解决技术难题。而技术经理则需要提高交付效率和质量。 ... [详细]
  • GPT-3发布,动动手指就能自动生成代码的神器来了!
    近日,OpenAI发布了最新的NLP模型GPT-3,该模型在GitHub趋势榜上名列前茅。GPT-3使用的数据集容量达到45TB,参数个数高达1750亿,训练好的模型需要700G的硬盘空间来存储。一位开发者根据GPT-3模型上线了一个名为debuid的网站,用户只需用英语描述需求,前端代码就能自动生成。这个神奇的功能让许多程序员感到惊讶。去年,OpenAI在与世界冠军OG战队的表演赛中展示了他们的强化学习模型,在限定条件下以2:0完胜人类冠军。 ... [详细]
  • 本文详细介绍了云服务器API接口的概念和作用,以及如何使用API接口管理云上资源和开发应用程序。通过创建实例API、调整实例配置API、关闭实例API和退还实例API等功能,可以实现云服务器的创建、配置修改和销毁等操作。对于想要学习云服务器API接口的人来说,本文提供了详细的入门指南和使用方法。如果想进一步了解相关知识或阅读更多相关文章,请关注编程笔记行业资讯频道。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 单点登录原理及实现方案详解
    本文详细介绍了单点登录的原理及实现方案,其中包括共享Session的方式,以及基于Redis的Session共享方案。同时,还分享了作者在应用环境中所遇到的问题和经验,希望对读者有所帮助。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
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社区 版权所有