首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在CUDA中限制寄存器的使用:__launch_bounds__与maxrregcount

在CUDA中限制寄存器的使用:__launch_bounds__与maxrregcount
EN

Stack Overflow用户
提问于 2017-06-22 08:07:44
回答 1查看 13.2K关注 0票数 13

来自NVIDIA CUDA C编程指南

可以使用maxrregcount编译器选项或启动边界来控制寄存器使用,如启动边界中所描述的那样。

根据我的理解(如果我错了,请纠正我),虽然-maxrregcount限制了整个.cu文件可能使用的寄存器数量,但是__launch_bounds__限定符为每个__global__内核定义了maxThreadsPerBlockminBlocksPerMultiprocessor。这两个人完成相同的任务,但以两种不同的方式。

我的使用要求每个线程都有40寄存器,以最大限度地提高性能。因此,我可以使用-maxrregcount 40。我还可以使用40强制使用__launch_bounds__(256, 6)寄存器,但这会导致加载和存储寄存器溢出。

两者之间的区别是什么导致这些登记泄漏?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-22 13:16:41

这个问题的序言是引用CUDA C Programming Guide的话,

内核使用的寄存器越少,在多处理器上驻留的线程和线程块就越多,这可以提高性能。

现在,__launch_bounds__maxregcount通过两种不同的机制限制寄存器的使用。

__launch_bounds__

nvcc通过平衡内核启动设置的性能和通用性来决定__global__函数要使用的寄存器数量。不同的说法是,选择使用寄存器的数量“保证”每个块的不同线程数和每个多处理器的块数。但是,如果在编译时可以得到每个块的最大线程数以及(可能)每个多处理器的最小块数的大致概念,那么可以使用这些信息来优化内核。换句话说

代码语言:javascript
运行
AI代码解释
复制
#define MAX_THREADS_PER_BLOCK 256
#define MIN_BLOCKS_PER_MP     2

__global__ void
__launch_bounds__(MAX_THREADS_PER_BLOCK, MIN_BLOCKS_PER_MP)
fooKernel(int *inArr, int *outArr)
{
    // ... Computation of kernel
}

通知编译器可能的启动配置,以便nvcc能够以“最优”的方式为这种启动配置选择寄存器数量。

MAX_THREADS_PER_BLOCK参数是强制性的,而MIN_BLOCKS_PER_MP参数是可选的。还请注意,如果内核启动时每个块的线程数大于MAX_THREADS_PER_BLOCK,则内核启动将失败。

Programming Guide中对限制机制的描述如下:

如果指定了启动边界,编译器首先从它们派生内核应该使用的寄存器数量的上限L,以确保maxThreadsPerBlock线程的minBlocksPerMultiprocessor块(如果没有指定minBlocksPerMultiprocessor )可以驻留在多处理器上。然后,编译器以下列方式优化寄存器的使用:

  • 如果初始寄存器使用率高于L,则编译器将其进一步减少,直至其小于或等于L,通常以牺牲更多的本地内存使用量和/或更多的指令数量为代价;

因此,__launch_bounds__可能导致注册溢出。

maxrregcount

maxrregcount是一个编译器标志,它通过强制编译器重新安排寄存器的使用,将雇用寄存器的数量严格限制在用户设置的数字上,与__launch_bounds__不一致。当编译器不能保持在规定的限制之下时,它只会将其泄漏到本地内存,这实际上是DRAM。即使这个局部变量存储在全局DRAM内存变量中,也可以缓存在L1,L2中。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44704506

复制
相关文章
MybatisPlus Lambda表达式 聚合查询 分组查询 COUNT SUM AVG MIN MAX GroupBy
众所周知,MybatisPlus在处理单表DAO操作时非常的方便。在处理多表连接连接查询也有优雅的解决方案。今天分享MybatisPlus基于Lambda表达式优雅实现聚合分组查询。
赛先生和泰先生
2022/11/07
6.9K0
MybatisPlus Lambda表达式 聚合查询 分组查询 COUNT SUM AVG MIN MAX GroupBy
Hive窗口函数01-SUM、MIN、MAX、AVG
order by : 在同一个组内,先累加完相同createtime的pv,再累加其他createtime的pv, 比如 : 现在在表末尾加一条数据cookie1 2015-04-10 1 1,那么结果就是 :
CoderJed
2018/09/13
2.8K0
Oracle分析函数三——SUM,AVG,MIN,MAX,COUNT
功能描述:对一组内发生的事情进行累积计数,如果指定*或一些非空常数,count将对所有行计数,如果指定一个表达式,count返回表达式非空赋值的计数,当有相同值出现时,这些相等的值都会被纳入被计算的值;可以使用DISTINCT来记录去掉一组中完全相同的数据后出现的行数。
python与大数据分析
2022/03/11
5950
Oracle分析函数三——SUM,AVG,MIN,MAX,COUNT
SQL聚合函数 AVG
AVG返回NUMERIC或DOUBLE数据类型。 如果expression是DOUBLE类型,AVG返回DOUBLE; 否则,它返回NUMERIC。
用户7741497
2022/03/27
3.3K1
【说站】javascript max和min的使用
以上就是javascript max和min的使用,希望对大家有所帮助。更多Javascript学习指路:Javascript
很酷的站长
2022/11/24
6340
【说站】javascript max和min的使用
Java8 | 如何使用Group By 聚合操作集合数据?
集合数据分组很多在实际开发过程中是相当常见,比如传给前端的产品数据按照类型进行分组。最常见的方式是遍历整个集合,然后通过判断类型构造存储不同类型的集合。那么有没有更好的办法,Java8 groupingBy能帮到我们。
玖柒的小窝
2021/11/28
1.7K0
SQL聚合函数 MIN
MIN聚合函数返回表达式的最小值(最小值)。通常,表达式是查询返回的多行中的字段名称(或包含一个或多个字段名称的表达式)。
用户7741497
2022/03/27
1.3K0
集合去重 (集合元素为引用类型)--- java 8 新特性 --- 根据元素单属性、多属性实现去重
1. 代码写法: (要求 JDK 1.8 或 1.8 以上) package gentle.entity; import lombok.Data; /** * * @author silence * @date 2018/7/6 10:58 */ @Data // 此注解可自动生成set/get、自动重写equals/hashcode 等,不用在代码中书写相关代码。 public class User { private String name; private int a
微风-- 轻许--
2022/04/13
6290
集合去重 (集合元素为引用类型)--- java 8 新特性 --- 根据元素单属性、多属性实现去重
CSS之关于min-width、max-width、min-height和max-height的使用
设div父盒子A中有个div子盒子B,设B的min-height为H,则H为盒子B的最小高度值,意思是:
xinxin-l
2022/03/29
1.4K0
CSS之关于min-width、max-width、min-height和max-height的使用
C语言 | 选择1或2输出max或min
例36:C语言实现输入两个整数,然后让用户选择1或者2,选择1是调用max,输出两者中的大数,选择2是调用min,输出两者中的小数。
小林C语言
2020/12/16
1.2K0
C语言 | 选择1或2输出max或min
Pytorch的max()与min()函数
函数定义:torch.max(input, dim, max=None, max_indices=None,keepdim=False)
狼啸风云
2020/05/07
7.1K0
SQL聚合函数 MAX
MAX聚合函数返回表达式的最大值。 通常,表达式是查询返回的多行中字段的名称(或包含一个或多个字段名称的表达式)。
用户7741497
2022/03/27
1.2K0
集合:按元素的中文属性排序
1. 要排序的元素类: public static class NameCount implements Comparable<NameCount> { Collator collator = Collator.getInstance(java.util.Locale.CHINA); @ApiModelProperty(value = "名") private String name; @ApiModelProperty(value =
微风-- 轻许--
2020/04/14
1.4K0
MySQL中min和max查询优化
测试版本:Server version:        5.1.58-log MySQL Community Server (GPL)
星哥玩云
2022/08/17
1.3K0
JAVA 集合list,Map删除元素的方法总结
这种方式的问题在于,删除某个元素后,list的大小发生了变化,而你的索引也在变化,所以会导致你在遍历的时候漏掉某些元素。比如当你删除第1个元素后,继续根据索引访问第2个元素时,因为删除的关系后面的元素都往前移动了一位,所以实际访问的是第3个元素。因此,这种方式可以用在删除特定的一个元素时使用,但不适合循环删除多个元素时使用。
traffic
2020/04/09
2.9K0
MADlib——基于SQL的数据挖掘解决方案(26)——聚类之k-means方法
聚类算法大都是几种最基本的方法,如k-means、层次聚类、SOM等,以及它们的许多改进变种。MADlib提供了一种k-means算法的实现。本篇主要介绍MADlib的k-means算法相关函数和应用案例。
用户1148526
2019/05/25
8360
Hibernate对象导航语言
文章目录 1. HQL - 对象导航语言 1.1. 简介 1.2. 步骤 1.3. 准备 1.4. 实体查询 1.4.1. 格式 1.4.2. 拓展 1.4.3. 实例 1.5. 部分字段的查询 1.5.1. 格式 1.5.2. 实例 1.6. 多表联合查询 1.7. 前提 1.7.1. 常见的联合查询方式 1.7.2. 对象方式关联查询 1.7.2.1. 实例 1.7.3. join方式查询 1.7.3.1. 左外连查询 1.7.3.1.1. 格式 1.7.3.1.2. 实例 1.7.3.2. 右外连
爱撒谎的男孩
2019/12/31
9050
Max-Min Fairness带宽分配算法
最近再写一个网络仿真器,里面参考了Max-MinFairness算法,这是一种比较理想、公平的带宽分配算法。其思路主要如下:首先是算法的准备,考察某一时刻的网络中所有的flow,由于每条flow都有其各个link,因此可以得到各个link上所有流经的flow,然后开始迭代,各个link都把capacity平均分给所有流经的flow,接着每条flow的速度就等于其最小link分配的带宽,然后每条link的剩余带宽就等于link的capacity减去所有流经的flow的速度的总和,再然后把link的剩余带宽作为
forrestlin
2018/05/23
1.9K0
min-width 属性
min-widht 规定设置最小宽度,且能阻止 height 属性的设置值比 min-width 小。
Html5知典
2019/11/26
8120
min-height 属性
min-height 规定标签设置最小高度,且能阻止height属性的设置值比min-height小。min-height 可覆盖 height , min-height 可覆盖 max-height。
Html5知典
2019/11/26
1.2K0

相似问题

Server查询- Min、Max、Avg聚合问题

14

如何在java上做Groupby,Sum,Avg,Min,Max集合?

10

在南迁移中使用聚合器(Min、Max、Avg)

10

如何使用sqlbuilder.smartsql使用聚合函数(avg、count、max、min)

14

如何模拟聚合函数avg,sum,max,min,和PouchDB?

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文