4.7 MEMORY AS A LIMITING FACTOR TO PARALLELISM

news2024/11/13 9:30:22

虽然CUDA寄存器和共享内存在减少对全局内存的访问次数方面非常有效,但必须注意保持在这些内存的容量范围内。这些内存是线程执行所需的资源形式。每个CUDA设备提供有限的资源,从而限制了给定应用程序可以同时驻留在SM中的线程数量。通常,每个线程需要的资源越多,每个SM中可以驻留的线程就越少,同样,在整个设备中并行运行的线程也就越少。

为了说明内核的寄存器使用与设备可以支持的并行性水平之间的交互,假设在当前一代设备D中,每个SM可以容纳多达1536个线程和16,384个寄存器。虽然16,384是一个大数字,但考虑到每个SM中可以驻留的线程数量,每个线程只允许使用非常有限的寄存器。为了支持1536个线程,每个线程只能使用16,384/1536 = 10个寄存器。如果每个线程使用11个寄存器,则可以在每个SM中同时执行的线程数量将减少。这种减少发生在块粒度上;例如,如果每个块包含512个线程,则通过一次减少512个线程来实现线程的减少。因此,从1536开始,下一个较小的线程数量将是1024,这表明可以同时驻留在每个SM中的线程减少1/3。该程序可以大幅减少可用于调度的warp数量,从而降低处理器在存在长延迟操作的情况下找到有用工作的能力。

每个SM可用的寄存器数量因设备而异。应用程序可以动态确定所用设备的每个SM中可用的寄存器数量,并选择使用适合该设备的寄存器数量的内核版本。寄存器的数量可以通过调用cudaGetDeviceProperties函数来确定,该函数在第3.6节中进行了讨论。假设变量&dev_prop传递给设备属性的函数,字段dev_prop.regsPerBlock生成每个SM中可用的寄存器数量。对于设备D,此字段的返回值应为16,384。然后,应用程序可以将这个数字除以驻留在每个SM中的目标线程数,以确定可以在kerel中使用的寄存器数量。

共享内存使用也可以限制分配给每个SM的线程数量。我们可以假设同一设备D有16,384(16K)字节的共享内存,在每个SM中分配给线程块。我们也可以假设D中的每个SM最多可容纳8个block。要达到这个最大值,每个块不得使用超过2K字节的共享内存;否则,每个SM中可以驻留的块数量将减少,使这些块使用的共享内存总量不超过10K字节。例如,如果每个块使用5K字节的共享内存,则每个SM的分配不能超过三个块。

对于矩阵乘法示例,共享内存可以成为限制因素。对于16×16的tile尺寸,每个块需要16×16×4=1K字节的存储Mds。(请注意,每个元素都是foat类型,为4字节。)Nds还需要1KB。因此,每个块使用2K字节的共享内存。16K字节的共享内存允许8个块同时驻留在SM中。由于这与线程硬件允许的最大值相同,共享内存不是此tile大小的限制因素。在这种情况下,真正的限制是线程硬件限制,每个SM只允许1536个线程。此约束将每个SM中的块数限制为六个。因此,将仅使用6*2KB=12KB的共享内存。这些限制从一个设备到另一个设备,但可以在运行时通过设备查询确定。

每个SM中共享内存的大小也可能因设备而异。每一代或型号的设备在每个SM中可以有不同数量的共享内存。内核通常希望能够根据硬件中的可用量使用不同数量的共享内存。我们可能想要一个主机代码来动态确定共享内存的大小,并调整内核使用的共享内存量,这可以通过调用cuda-GetDeviceProperties函数来完成。我们假设变量&dev_prop传递给函数,而字段dev_prop.sharedMemPerBlock gqives每个SM中可用的寄存器数量。然后,程序员可以确定每个块应该使用的共享内存量。

不幸的是,图4.16中的内核不支持这一点。图4.16 中使用的声明。将其共享内存使用大小硬连接到编译时常数:

__shared__ float Mds[TILE_WIDTH][TILE_WIDTH];
__shared__ float Nds[TILE_WIDTH][TILE_WIDTH];

也就是说,Mds和Nds的大小设置为TILE_WIDTH2元素,无论编译时TILE_WIDTH的值如何。为了说明,假设该文件包含

#define TILE_WIDTH 16.

Mds和Nds都将有256个元素。如果我们想更改Mds和Nds的大小,我们更改TILE_WIDTH的值并重新编译代码。如果不重新编译,内核无法在运行时轻松调整其共享内存使用情况。

我们可以在CUDA中通过不同风格的声明来启用这种调整。我们可以在共享内存声明前面添加一个“C extern”关键字,并在声明中省略数组的大小。以这种方式,Mds和Nds的声明读作

extern __shared__ Mds[];
extern __shared__ Nds[];

请注意,数组现在是一维的。我们需要使用基于垂直和水平索引的线性索引。

当我们启动内核时,我们可以根据设备查询结果动态确定要使用的共享内存量,并将其作为第三个配置参数提供给内核启动。修订后的内核可以通过以下语句启动:
在这里插入图片描述
其中size_tis是用于声明变量的内置类型,用于保存动态分配数据结构的大小信息。大小以字节表示。在我们的矩阵乘法示例中, 16 × 16 tile,我们的大小为16 × 16 x 4=1024字节。省略了在运行时设置大小值的计算细节。

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

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

相关文章

第11章 GUI Page480~486 步骤二十七 “脏数据”与“新文档”状态维护

wxMyPainterFrame类定义中声明新的成员: 增加一个全局变量,初始化新成员: 先实现TrySaveFile() SaveFile()暂时为空实现 增加两个新的私有成员方法: wxMyPainterFrame类中,修改了“_items”的几个地方 ① 鼠标抬起时…

设计模式的艺术P1基础—2.3 类之间的关系

设计模式的艺术P1基础—2.3 类之间的关系 在软件系统中,类并不是孤立存在的,类与类之间存在各种关系。对于不同类型的关系,UML提供了不同的表示方式 1.关联关系 关联(Association)关系是类与类之间最常用…

属性动画的使用

文章目录 1 概述2 创建属性动画页面3 属性动画参数调整延时播放时间delay的设置onFinish回调函数的使用 4 关闭属性动画页面5 参考 1 概述 属性动画,是最为基础的动画,其功能强大、使用场景多,应用范围较广。常用于如下场景中: …

代码随想总结

1. 刷题技能成长 之前跟着代码随想录刷过一段时间,但是因为是自己刷不知道每天该刷几道题,而且没有组织的坚持异常困难,第一次在刷完链表之后,就逐渐停滞不前,十一月份看到了代码随想录的训练营,纠结要不要…

配置git服务器

第一步: jdk环境配置 (1)搜索【高级系统设置】,选择【高级】选项卡,点【环境变量】 (2)在【系统变量】里面,点击【新建】 (3)添加JAVA_HOME环境变量JAVA_HO…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux系统编程第六天-Linux信号(物联技术666)

更多配套资料CSDN地址:点赞+关注,功德无量。更多配套资料,欢迎私信。 物联技术666_嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记-CSDN博客物联技术666擅长嵌入式C语言开发,嵌入式硬件,嵌入式培训笔记,等方面的知识,物联技术666关注机器学习,arm开发,物联网,嵌入式硬件,单片机…

基于zookeeper实现服务节点HA主备自动切换

文章目录 前言一、架构图和流程图二、流程说明1.服务启动初始化ZK、注册所有服务节点信息-MasterRegister2.创建、运行服务节点,并管理服务节点-LeaderSelectorZkClient。3.典型场景-调度服务单体执行-DigitalEmpTask 总结参考 前言 Spring Boot 主备切换可以采用数…

mac电脑php命令如何设置默认的php版本

前提条件:如果mac电脑还没安装多个PHP版本,可以先看这篇安装一下 mac电脑运行多个php版本_mac 同时运行两个php-CSDN博客 第一部分:简单总结 #先解除现在默认的php版本 brew unlink php7.4#再设置的想要设置的php版本 brew link php8.1第二部…

python 多线程 守护线程

daemon线程:守护线程,优先级别最低,一般为其它线程提供服务。通常,daemon线程体是一个无限循环。如果所有的非daemon线程(主线程以及子线程)都结束了,daemon线程自动就会终止。t.daemon 属性,设…

一、MOJO环境部署和安装

以Ubuntu系统为例。 安装mojo-CLI curl https://get.modular.com | MODULAR_AUTHmut_fe303dc5ca504bc4867a1db20d897fd8 sh - 安装mojo SDK modular auth mojo modular auth install mojo 查看mojo版本号 mojo --version 输入mojo指令,进入交互编程窗口

【UE Niagara学习笔记】02 - 制作燃烧的火焰

目录 效果 步骤 一、添加资产 二、制作材质 三、制作粒子 3.1 循环播放 3.2 粒子生成的数量 3.3 粒子的生命周期和初始大小 3.4 火焰高度 3.5 火焰范围 3.6 火焰颜色 效果 步骤 一、添加资产 1. 在虚幻商城中搜索“M5 VFX Vol2. Fire and Flames(Niagara)”…

单片机原理及应用:中断系统结构与控制寄存器

大家好啊,这几天因为考试断更了一段时间,现在放假了也可以恢复正常的更新速度了。今天我们来认识一下单片机的中断系统,这里可以说是我们学习单片机以来第一个核心功能,我们会分几期内容来深入了解中断系统的作用原理和应用方式。…

多模态推荐系统综述:二、特征交互 Fusion

二、Fusion 融合不同的多模态信息,与bridge相比,融合更关注项目之间的多模态内部关系。 它可以灵活地融合不同权重和焦点的多模态信息。 注意机制是应用最为广泛的特征融合。 2.1 粗粒度注意力。 一些模型应用注意力机制在粗粒度级别融合来自多种模式…

Rustdesk本地配置文件存在什么地方?

环境: rustdesk1.1.9 Win10 专业版 问题描述: Rustdesk本地配置文件存在什么地方? 解决方案: RustDesk 是一款功能齐全的远程桌面应用。 支持 Windows、macOS、Linux、iOS、Android、Web 等多个平台。 支持 VP8 / VP9 / AV1 …

e2studio开发三轴加速度计LIS2DW12(1)----轮询获取加速度数据

e2studio开发三轴加速度计LIS2DW12.1--轮询获取加速度数据 概述视频教学样品申请源码下载通信模式管脚定义IIC通信模式速率新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原…

Android studio调试

Android Studio连接手机详细教程(包含遇到的问题集)_android studio 连接手机-CSDN博客 可以创建虚拟机或直连真机或直连模拟器。 无法打开本地终端 Android studio Failed to start [powershell.exe] 利用Android studio的adb命令删除app应用 - 简书 利用ADB工具免root停用A…

MySQL之子查询、连接查询(内外)以及分页查询

一、案例(接上一篇文章) 09)查询学过「张三」老师授课的同学的信息 -- 一共有两种方式 -- 第一种方式: SELECT s.*,c.cname,t.tname,sc.score FROMt_mysql_teacher t,t_mysql_course c,t_mysql_student s,t_mysql_score sc WHERE…

BabylonJS 6.0文档 Deep Dive 摄像机(二):摄像机碰撞

摄像机、网格碰撞和重力 你玩过第一人称射击游戏(FPS)吗?在本教程中,我们将模拟FPS的摄影机移动:摄影机位于地板上,与地面碰撞,并可能与场景中的任何对象碰撞。 如何实现? 为了实现这一功能,我们必须执…

Linux———head命令详解

目录 head 命令是一个用于在命令行中显示文件开头部分内容的常用工具。 head 命令基本语法: 常用选项 示例 显示文件的前 10 行: 显示文件的前 5 行: 显示文件的前 100 个字节: 不显示文件名的标题信息: 显示…

Elasticsearch基本操作之文档操作

本文来说下Elasticsearch基本操作之文档操作 文章目录 文档概述创建文档示例创建文档(生成随机id)创建文档(自定义唯一性标识) 查看文档示例根据主键查看文档查看所有文档 本文小结 文档概述 文档概述 在创建好索引的基础上来创建文档,并添加数据。这里的文档可以类…