我有几个问题:
(我花了很长时间才试图找到答案)
在哪里可以找到有关每台流多处理器最大块数的信息? (我知道它可能是16个块但无法确认)我需要在代码中读取它myDevice.maxBlocksPerMultiProcessor
。
默认内核启动(例如,默认流0上的<<<blocks, threads>>>
)是否会在所有多处理器之间均匀地扩展计算? (或者只有一个多处理器才能完成工作)。
我明白这取决于我的网格配置,我不是在问这个问题。让我们假设我有“性能友好”网格(我的意思是block-threads / maxThreadPerMultiProcessors
最大化多处理器占用率)。
它默认会在多个多处理器上启动吗?
让我们说:我的GPU支持每个多处理器和16个块。 2048 maxThreadPerMultiProcessors。然后我想用<<< N*16, 126 >>>
启动我的内核以最大化多处理器的占用率。我可以使用流和/或并发内核执行来提高性能吗?
(我不这么认为,因为我无法获得超过100%的多处理器占用率*我认为这听起来很荒谬,但我的英语并不完美*)
答案 0 :(得分:2)
在哪里可以找到有关每台流多处理器上最大块数的信息?
您可以从编程指南here获取此信息。您希望了解设备的计算功能。你可以查看here。您的设备计算功能也可以通过编程方式检索;以deviceQuery
CUDA sample code为例进行研究。如果您需要以编程方式为每个多处理器提供最大块,则需要将上面链接的编程指南中的表版本合并到程序中,然后使用计算功能在运行时确定它。
默认内核启动(例如,默认流0上的
<<<blocks, threads>>>
)是否会在所有多处理器之间均匀地扩展计算?
是的,这是CUDA编程模型的基本部分。只要您已经启动了足够的块来在每个SM上放置至少一个,GPU工作分配器将尽可能均匀地分配块。
是的,<<<N, 128>>>
的内核启动N
足够大,应该是实现最大占用率的一个促成因素。占用可以有各种其他限制器(例如寄存器,共享内存使用等),所以这不保证任何东西,但它应该允许最大占用率(每个2048个线程) SM)在你的例子中。关于流(我认为你真的想要询问并发内核),一般来说,一旦你暴露了足够的并行性来使特定GPU饱和,暴露更多的并行性可能无法提供任何额外的好处。但是,它可能会为未来的GPU带来好处,而且流还允许除了并发内核之外的其他内容。 Streams允许复制和计算重叠,这可能是提高整体性能的另一个有价值的因素。
关于CUDA编程模型,硬件实现和性能指南的programming guide sections 2-5中涵盖了许多这些主题。 CUDA best practices guide也涵盖了有用的相关信息。