首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GPU/CUDA:每个多处理器网格的最大块数和驻留块的最大数目

GPU/CUDA:每个多处理器网格的最大块数和驻留块的最大数目
EN

Stack Overflow用户
提问于 2013-07-15 10:27:36
回答 2查看 2.9K关注 0票数 1

我的GPU的能力是2.1,有2个SMs,每个SM有48个核心。根据CUDA编程指南提供的技术规范,网格的最大块数为65535,每个多处理器的驻留块的最大数量为8。

我对我能发射多少个街区感到困惑。如果每个SM的最大块数是8,这不意味着如果只有2条SMs,我最多可以启动16个块吗?但我成功地启动了更多街区。

也许有像活动块和非活动块这样的东西?如果这是事实,那么这些块是如何安排的?非活动等待直到所有8个活动块完成吗?但这会带来同步问题..。

如果多一些questions...if,每个SM上有48个核,那么就可以同时执行3个半翘曲。但共享内存只有32个银行。如果两个线程同时尝试从同一个波段读取,即使它们属于不同的半翘曲,难道它们不会产生银行冲突吗?

EN

回答 2

Stack Overflow用户

发布于 2020-04-23 09:37:35

我来派对肯定迟到了,但由于之前的回答没有被接受,我希望能帮助其他用户回答同样的问题。

SM中可以包含的最大块数是指给定时间内活动块的最大数量。在每个维度中,块可以被组织成多达65,535个块的一维或二维网格,但是gpu的SM只能容纳一定数量的块。此限制通过两种方式链接到Gpu的计算能力。

  1. 硬件限制由CUDA.规定

每个gpu允许每个SM块的最大限制,而不管它包含多少线程和所使用的资源数量。例如,一个具有计算能力2.0的Gpu的限制为8个块/SM,而一个具有计算能力7.0的Gpu的限制为32个块/SM。这是您可以实现的每个SM的最佳活动块数:让我们称它为MAX_BLOCKS。

  1. 从每个块使用的资源量导出限制。

块由线程组成,每个线程使用一定数量的寄存器:使用的寄存器越多,包含它的块所使用的资源数量就越多。类似地,分配给块的共享内存量增加了块需要分配的资源的数量。一旦超过某个值,块所需的资源数量将非常大,SM将无法分配MAX_BLOCKS允许的尽可能多的块:这意味着每个块所需的资源数量限制了每个SM的活动块的最大数量。

我怎么找到这些边界?

库达也考虑过这个问题。在他们的站点上,您可以使用Cuda占用率计算器文件来发现按计算能力分组的硬件限制。您还可以输入块使用的资源数量(线程数、每个线程寄存器、共享内存字节),并获取有关活动块数量的图表和重要信息。

票数 2
EN

Stack Overflow用户

发布于 2013-07-15 10:45:34

根据CUDA编程指南提供的技术规范,网格的最大块数为65535,每个多处理器的驻留块的最大数量为8。 我对我能发射多少个街区感到困惑。如果每个SM的最大块数是8,这不意味着如果只有2条SMs,我最多可以启动16个块吗?

块的最大数量(网格中的每个维度)是对CUDA调度程序所能处理的限制。除了最近的开普勒GPU外,每个尺寸的极限值为65535。

实际上,活动块的数量取决于很多事情。每个SM可以启动的块数有一个严格的限制,但是如果每个块使用大量的共享内存、寄存器或线程,那么这个数目也可能更小。

调度程序切换出非活动块(即由于各种原因而处于停滞状态的块),并在活动块中切换。大量的块在物理上是无法启动的,以便尽可能地保持SMs的活动。

但这会带来同步问题..。

永远不要假设CUDA模块是按顺序启动的。它们可以按顺序处理,唯一的同步点是在主机上完成内核和cudaDeviceSynchronize

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

https://stackoverflow.com/questions/17652044

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档