Cuda优化,多处理器,并发内核执行

时间:2016-10-21 17:57:47

标签: optimization cuda


我有几个问题: (我花了很长时间才试图找到答案)

  1. 在哪里可以找到有关每台流多处理器最大块数的信息? (我知道它可能是16个块但无法确认)我需要在代码中读取它myDevice.maxBlocksPerMultiProcessor

  2. 默认内核启动(例如,默认流0上的<<<blocks, threads>>>)是否会在所有多处理器之间均匀地扩展计算? (或者只有一个多处理器才能完成工作)。 我明白这取决于我的网格配置,我不是在问这个问题。让我们假设我有“性能友好”网格(我的意思是block-threads / maxThreadPerMultiProcessors最大化多处理器占用率)。
    它默认会在多个多处理器上启动吗?

  3. 让我们说:我的GPU支持每个多处理器和16个块。 2048 maxThreadPerMultiProcessors。然后我想用<<< N*16, 126 >>>启动我的内核以最大化多处理器的占用率。我可以使用流和/或并发内核执行来提高性能吗?
    (我不这么认为,因为我无法获得超过100%的多处理器占用率*我认为这听起来很荒谬,但我的英语并不完美*)

  4. 抱歉我的英语不好!
    谢谢你的帮助!

1 个答案:

答案 0 :(得分:2)

  1.   

    在哪里可以找到有关每台流多处理器上最大块数的信息?

    您可以从编程指南here获取此信息。您希望了解设备的计算功能。你可以查看here。您的设备计算功能也可以通过编程方式检索;以deviceQuery CUDA sample code为例进行研究。如果您需要以编程方式为每个多处理器提供最大块,则需要将上面链接的编程指南中的表版本合并到程序中,然后使用计算功能在运行时确定它。

  2.   

    默认内核启动(例如,默认流0上的<<<blocks, threads>>>)是否会在所有多处理器之间均匀地扩展计算?

    是的,这是CUDA编程模型的基本部分。只要您已经启动了足够的块来在每个SM上放置至少一个,GPU工作分配器将尽可能均匀地分配块。

  3. 是的,<<<N, 128>>>的内核启动N足够大,应该是实现最大占用率的一个促成因素。占用可以有各种其他限制器(例如寄存器,共享内存使用等),所以这不保证任何东西,但它应该允许最大占用率(每个2048个线程) SM)在你的例子中。关于流(我认为你真的想要询问并发内核),一般来说,一旦你暴露了足够的并行性来使特定GPU饱和,暴露更多的并行性可能无法提供任何额外的好处。但是,它可能会为未来的GPU带来好处,而且流还允许除了并发内核之外的其他内容。 Streams允许复制和计算重叠,这可能是提高整体性能的另一个有价值的因素。

  4. 关于CUDA编程模型,硬件实现和性能指南的programming guide sections 2-5中涵盖了许多这些主题。 CUDA best practices guide也涵盖了有用的相关信息。