我的GPU的能力是2.1,有2个SMs,每个SM有48个核心。根据CUDA编程指南提供的技术规范,网格的最大块数为65535,每个多处理器的驻留块的最大数量为8。
我对我能发射多少个街区感到困惑。如果每个SM的最大块数是8,这不意味着如果只有2条SMs,我最多可以启动16个块吗?但我成功地启动了更多街区。
也许有像活动块和非活动块这样的东西?如果这是事实,那么这些块是如何安排的?非活动等待直到所有8个活动块完成吗?但这会带来同步问题..。
如果多一些questions...if,每个SM上有48个核,那么就可以同时执行3个半翘曲。但共享内存只有32个银行。如果两个线程同时尝试从同一个波段读取,即使它们属于不同的半翘曲,难道它们不会产生银行冲突吗?
发布于 2020-04-23 09:37:35
我来派对肯定迟到了,但由于之前的回答没有被接受,我希望能帮助其他用户回答同样的问题。
SM中可以包含的最大块数是指给定时间内活动块的最大数量。在每个维度中,块可以被组织成多达65,535个块的一维或二维网格,但是gpu的SM只能容纳一定数量的块。此限制通过两种方式链接到Gpu的计算能力。
每个gpu允许每个SM块的最大限制,而不管它包含多少线程和所使用的资源数量。例如,一个具有计算能力2.0的Gpu的限制为8个块/SM,而一个具有计算能力7.0的Gpu的限制为32个块/SM。这是您可以实现的每个SM的最佳活动块数:让我们称它为MAX_BLOCKS。
块由线程组成,每个线程使用一定数量的寄存器:使用的寄存器越多,包含它的块所使用的资源数量就越多。类似地,分配给块的共享内存量增加了块需要分配的资源的数量。一旦超过某个值,块所需的资源数量将非常大,SM将无法分配MAX_BLOCKS允许的尽可能多的块:这意味着每个块所需的资源数量限制了每个SM的活动块的最大数量。
我怎么找到这些边界?
库达也考虑过这个问题。在他们的站点上,您可以使用Cuda占用率计算器文件来发现按计算能力分组的硬件限制。您还可以输入块使用的资源数量(线程数、每个线程寄存器、共享内存字节),并获取有关活动块数量的图表和重要信息。
发布于 2013-07-15 10:45:34
根据CUDA编程指南提供的技术规范,网格的最大块数为65535,每个多处理器的驻留块的最大数量为8。 我对我能发射多少个街区感到困惑。如果每个SM的最大块数是8,这不意味着如果只有2条SMs,我最多可以启动16个块吗?
块的最大数量(网格中的每个维度)是对CUDA调度程序所能处理的限制。除了最近的开普勒GPU外,每个尺寸的极限值为65535。
实际上,活动块的数量取决于很多事情。每个SM可以启动的块数有一个严格的限制,但是如果每个块使用大量的共享内存、寄存器或线程,那么这个数目也可能更小。
调度程序切换出非活动块(即由于各种原因而处于停滞状态的块),并在活动块中切换。大量的块在物理上是无法启动的,以便尽可能地保持SMs的活动。
但这会带来同步问题..。
永远不要假设CUDA模块是按顺序启动的。它们可以按顺序处理,唯一的同步点是在主机上完成内核和cudaDeviceSynchronize。
https://stackoverflow.com/questions/17652044
复制相似问题