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

帕特里克·B。


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

  1. 在哪里可以找到有关每个流式多处理器的最大块数的信息?(我知道这可能是16个块,但无法确认)。我需要像myDevice.maxBlocksPerMultiProcessor代码内部一样阅读它

  2. 默认内核启动(例如,<<<blocks, threads>>>在默认流0上)将在所有多处理器之间平均分配计算吗?(或者是只有一个多处理器可以完成这项工作)。
    我了解这取决于我的网格配置,而我对此并没有提出任何疑问。让我们假设我拥有“性能友好”的网格(我的意思是block-threads / maxThreadPerMultiProcessors最大化多处理器占用率)。
    默认情况下会在多个多处理器上启动吗?

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

对不起,我的英语不好!
感谢您的帮助!

罗伯特·克罗维拉
  1. 在哪里可以找到有关每个流式多处理器的最大块数的信息?

    您可以从此处的编程指南中获取此信息您将需要了解设备的计算能力您可以在这里查找您的设备计算能力也可以通过编程方式检索;deviceQuery CUDA示例代码为例。如果以编程方式需要每个多处理器最大块数,则需要将上面链接的编程指南中的表版本合并到程序中,然后使用计算功能在运行时确定该表。

  2. 默认内核启动(例如,<<<blocks, threads>>>在默认流0上)将在所有多处理器之间平均分配计算吗?

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

  3. 是的,在<<<N, 128>>>哪里N有足够大的内核启动应该是实现最大占用率的推动因素。占用率可以有其他各种限制因素(例如寄存器,共享内存使用情况等),因此这不能保证任何事情,但是应该允许您的示例中的最大占用率(每个SM 2048个线程)。关于流(我想你真的是想问并发内核),通常,一旦暴露了足够多的并行度以使特定GPU饱和,暴露更多并行度可能不会提供任何其他好处。但是,它可能会为将来的GPU提供好处,此外,流还允许并发内核以外的其他功能。流允许复制和计算重叠,这可能是提高整体性能的另一个重要因素。

其中的许多主题都在CUDA编程模型,硬件实现和性能指南编程指南第2-5节中介绍。CUDA最佳实践指南还涵盖了有用的相关信息。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在内核块执行之间,GPU多处理器的共享内存会如何处理?

处理器与内核(多处理器与多核)的定义

流多处理器,CUDA中每个流处理器的核心

多处理器调度

线程与多处理器Python

在CUDA统一内存多GPU或多处理器中使用原子算术运算

骆驼后onException的多处理器

多处理器架构和Ring 3

多处理器数值加法器

在Linux(CentOS)/多处理器设置中,如何将CPU内核分配给NUMA节点?

多处理器和多处理系统之间有什么区别?

在多处理器系统中,每个内核外部的内存在概念上是否总是平坦/统一/同步的?

Chapel编译器是否可以进行多处理器编译?

分配给多处理器的活动块集的行为是什么?

JVM线程调度程序如何控制多处理器的线程?

pthread API是否在多处理器环境中提供同步?

如何在Visual Studio中启用多处理器构建

std :: call_once多处理器安全吗?

如何在多处理器系统上生成并行子进程?

多线程应用程序如何在多处理器系统中工作

C ++如何限制Visual Studio多处理器编译

如何在许多处理器上运行boost :: threads?

如何为许多处理器体系结构引用.dll?

多处理器系统上的关键部分和内存栅栏/屏障

多处理器系统中的操作系统启动

test_and_set() 指令如何在多处理器上仍然有效?

从在多处理器进程中运行的模块内部更新对象属性

如何将线程块分配给 NVIDIA GPU 上的多处理器?

在多处理器系统中禁用中断的过程是什么?