我有几个问题:(我花了很多时间只是试图找到答案)
在哪里可以找到有关每个流式多处理器的最大块数的信息?(我知道这可能是16个块,但无法确认)。我需要像myDevice.maxBlocksPerMultiProcessor
代码内部一样阅读它。
默认内核启动(例如,<<<blocks, threads>>>
在默认流0上)将在所有多处理器之间平均分配计算吗?(或者是只有一个多处理器可以完成这项工作)。
我了解这取决于我的网格配置,而我对此并没有提出任何疑问。让我们假设我拥有“性能友好”的网格(我的意思是block-threads / maxThreadPerMultiProcessors
最大化多处理器占用率)。
默认情况下会在多个多处理器上启动吗?
可以这样说:我的GPU支持每个多处理器16个块和2048个maxThreadPerMultiProcessor。然后,我想启动内核<<< N*16, 126 >>>
以最大程度地提高多处理器的占用率。我可以使用流和/或并发内核执行来提高性能吗?
(我不这样认为,因为我无法获得超过100%的多处理器占用率*我知道这听起来很荒谬,但我的英语并不完美*)
对不起,我的英语不好!
感谢您的帮助!
在哪里可以找到有关每个流式多处理器的最大块数的信息?
您可以从此处的编程指南中获取此信息。您将需要了解设备的计算能力。您可以在这里查找。您的设备计算能力也可以通过编程方式检索;以deviceQuery
CUDA示例代码为例。如果以编程方式需要每个多处理器最大块数,则需要将上面链接的编程指南中的表版本合并到程序中,然后使用计算功能在运行时确定该表。
默认内核启动(例如,
<<<blocks, threads>>>
在默认流0上)将在所有多处理器之间平均分配计算吗?
是的,这是CUDA编程模型的基本部分。只要您启动了足够的块以在每个SM上至少放置一个块,GPU工作分配器就会尽可能均匀地分配块。
是的,在<<<N, 128>>>
哪里N
有足够大的内核启动应该是实现最大占用率的推动因素。占用率可以有其他各种限制因素(例如寄存器,共享内存使用情况等),因此这不能保证任何事情,但是应该允许您的示例中的最大占用率(每个SM 2048个线程)。关于流(我想你真的是想问并发内核),通常,一旦暴露了足够多的并行度以使特定GPU饱和,暴露更多并行度可能不会提供任何其他好处。但是,它可能会为将来的GPU提供好处,此外,流还允许并发内核以外的其他功能。流允许复制和计算重叠,这可能是提高整体性能的另一个重要因素。
其中的许多主题都在CUDA编程模型,硬件实现和性能指南的编程指南第2-5节中介绍。CUDA最佳实践指南还涵盖了有用的相关信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句