(GK20a GPU)tegra k1中每个SM存在多少驻留扭曲?
根据文件,我得到了以下信息 在tegra k1中有1个SMX和192个内核/多处理器
每个多处理器的最大线程数:2048 每个块的最大线程数:1024 任何人都可以指定每个SMX的最大块的值吗?
32 * 4 = 128 (warp中没有线程*没有warp)(AS kepler允许) 要同时发布和执行的四个warp)并发运行的线程? 如果否,有多少个线程同时运行?
请帮助我解决和理解它。
答案 0 :(得分:2)
任何人都可以指定每个SMX最大块的值吗?
kepler(cc 3.x)设备的每个多处理器的最大驻留块数为16。
是32 * 4 = 128(warp中没有线程*没有warp)(AS kepler允许同时发出和执行四个warp)并发运行的线程?如果否,有多少个线程同时运行?
在给定时钟周期内发布的内容与可能“同时执行”的内容之间存在差异。
由于指令执行是流水线的,因此可以在管道中的任何位置执行来自多个不同warp的多条指令。
Kepler有4个warp调度程序,每个发出来自给定warp的两条指令(4个warp调度程序总共4条warp,每个发布槽最多2条指令,最多8条指令可以在每个时钟周期发布。)
每个多处理器可以驻留(即打开和可调度)多达64个warp(每个warp 32个线程x 64个warps =每个多处理器2048个最大线程数)。这也是在任何特定时刻当前正在执行的最大数量(在管道的各个阶段)。
因此,在任何给定的时刻,来自任何64个(最大)可用warp的指令可以处于执行的各个阶段,在Kepler多处理器中的各种功能单元的各种管道中。
然而,Kepler每个多处理器的每个时钟周期的最大线程指令问题是4个warp调度程序x(max)2个指令= 8 * 32 = 256.实际上,优化良好的代码通常不会达到这个最大值但是4-6每个发布时段的平均指令(即每个时钟周期)实际上可以实现。
答案 1 :(得分:0)
部署用于执行SM的每个块都需要某些资源,即寄存器或共享内存。让我们想象以下情况:
我不知道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页面上找到这样的信息。