(GK20a GPU)tegra k1中每个SM的驻留扭曲

时间:2014-07-22 12:01:10

标签: cuda gpu tegra

(GK20a GPU)tegra k1中每个SM存在多少驻留扭曲?

根据文件,我得到了以下信息 在tegra k1中有1个SMX和192个内核/多处理器

每个多处理器的最大线程数:2048 每个块的最大线程数:1024 任何人都可以指定每个SMX的最大块的值吗?

32 * 4 = 128 (warp中没有线程*没有warp)(AS kepler允许) 要同时发布和执行的四个warp)并发运行的线程? 如果否,有多少个线程同时运行?

请帮助我解决和理解它。

2 个答案:

答案 0 :(得分:2)

  

任何人都可以指定每个SMX最大块的值吗?

kepler(cc 3.x)设备的每个多处理器的最大驻留块数为16。

  

是32 * 4 = 128(warp中没有线程*没有warp)(AS kepler允许同时发出和执行四个warp)并发运行的线程?如果否,有多少个线程同时运行?

在给定时钟周期内发布的内容与可能“同时执行”的内容之间存在差异。

  1. 由于指令执行是流水线的,因此可以在管道中的任何位置执行来自多个不同warp的多条指令。

  2. Kepler有4个warp调度程序,每个发出来自给定warp的两条指令(4个warp调度程序总共4条warp,每个发布槽最多2条指令,最多8条指令可以在每个时钟周期发布。)

  3. 每个多处理器可以驻留(即打开和可调度)多达64个warp(每个warp 32个线程x 64个warps =每个多处理器2048个最大线程数)。这也是在任何特定时刻当前正在执行的最大数量(在管道的各个阶段)。

  4. 因此,在任何给定的时刻,来自任何64个(最大)可用warp的指令可以处于执行的各个阶段,在Kepler多处理器中的各种功能单元的各种管道中。

    然而,Kepler每个多处理器的每个时钟周期的最大线程指令问题是4个warp调度程序x(max)2个指令= 8 * 32 = 256.实际上,优化良好的代码通常不会达到这个最大值但是4-6每个发布时段的平均指令(即每个时钟周期)实际上可以实现。

答案 1 :(得分:0)

部署用于执行SM的每个块都需要某些资源,即寄存器或共享内存。让我们想象以下情况:

  • 来自某个内核的每个线程使用64个32b寄存器(256B寄存器内存),
  • 使用大小为1024个线程的块启动内核,
  • 显然这样的块会消耗特定SM上的256 * 1024B寄存器

我不知道tegra,但是对于我现在使用的卡(GK110芯片),每个SM都有65536个32位寄存器(~256kB)可用,因此在下面的场景中所有的寄存器都会被部署到此SM的单个块使用,因此在这种情况下,每个SM的块数限制为1 ...

共享内存的示例以相同的方式工作,在内核启动参数中,您可以定义每个启动块使用的共享内存量,如果您将其设置为32kB,则在共享64kB的情况下可以将两个块部署到SM内存大小。值得一提的是,截至目前,我相信只有同一内核的块可以同时部署到一个SM。

目前我不确定是否存在除寄存器或共享内存之外的其他阻塞因素,但显然,如果寄存器的阻塞因子为1且共享内存的阻塞因子为2,则较低的数字是数量的限制。每个SM块。

至于你的第二个问题,可以同时运行多少个线程,答案是 - 一个SM中有多个内核,所以在SMX和Kepler架构的情况下它是192.并发warp的数量显然是192 / 32.

如果您对这些内容感兴趣,我建议您使用nsight分析工具,您可以检查所有内核启动及其阻塞因素以及更多有用的信息。

修改 阅读Robert Crovella的回答我意识到每个SM的块和每个SM的线程确实存在这些限制,但由于我的内核通常使用过多的寄存器或共享内存,因此我无法访问它们。同样,可以使用Nsight来调查这些值,这些值显示有关可用CUDA设备的所有有用信息,但是例如在GK110芯片的情况下甚至可以在related document的NVIDIA页面上找到这样的信息。