我的GPU功能2.1,有2个SM,每个SM有48个核心。根据“CUDA-C编程指南”中提供的技术规范,网格的最大块数为65535,每个多处理器的最大驻留块数为8。
我对可以启动的块数感到困惑。如果每个SM的最大块数是8,那么这是不是意味着如果只有2个SM,我最多可以启动16个块?但我成功推出了更多的块。
也许有像活动块和非活动块这样的东西?如果这是事实,那么这些块是如何安排的?非活动是否等待所有8个活动块完成?但这会带来同步问题......
更多问题......如果每个SM上有48个核心,则可以同时执行3个半warp。但共享内存只有32个银行。如果两个线程同时尝试从同一个波段读取,即使它们属于不同的半经线,它们也不会产生冲突吗?
答案 0 :(得分:1)
根据“CUDA-C编程指南”中提供的技术规范,网格的最大块数为65535,每个多处理器的最大驻留块数为8。
我对可以启动的块数感到困惑。如果每个SM的最大块数是8,那么这是不是意味着如果只有2个SM,我最多可以启动16个块?
最大块数(网格中的每个维度)是对CUDA调度程序可以处理的内容的限制。除了最近的Kepler GPU,每个维度的限制为65535。
实际上,活动块的数量取决于很多事情。每个SM可以启动的块数量存在严格限制,但如果每个块使用大量共享内存,寄存器或线程,则数量也会更小。
调度程序切换出非活动块(即由于各种原因而停止的块)并切换为活动块。发射大量的块比物理上可能,以保持SM尽可能活跃。
但这会带来同步问题......
永远不要假设CUDA块按顺序启动。它们可以不按顺序处理,唯一的同步点是在主机上完成内核和cudaDeviceSynchronize
。
答案 1 :(得分:1)
我参加聚会肯定很晚,但是由于上一个答案没有被接受,我希望其中一个可以帮助其他有相同问题的用户。
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也考虑过这一点。在Cuda Occupancy Calculator file上可以找到他们的站点,通过它们您可以发现按计算能力分组的硬件限制。您还可以输入块使用的资源量(线程数,每个线程的寄存器,共享内存的字节数),并获取有关活动块数的图形和重要信息。