Nsight 学习笔记-相关标准概念

时间:2024-05-20 18:02:53

占用视图

  1. 占用率(Occupancy) = 每个 SM 中**的 Warp / 每个 SM可以**的 Warp 的最大值。

  2. 其中,Theoretical 表示理论值,是由程序决定的;而 Device Limit 表示设备限制的最大值,认为无法改变;Achieved 表示程序实际执行时的情况。

  3. 图中的红色部份表示限制使用率的一些因素。

  4. 每个Warp(线程束)包含32个线程,32个 thread 被分成一组一起执行。

  5. Maxwell 中,每个 SM 包含64个线程,每个 SM 有两个 Warp Scheduler, 每个 Warp Scheduler 管理两个 Instruction Dispatch Unit,一个 Instruction Dispatch Unit 可以同时管理16个 Warp。

  6. Maxwell 中,共享内存与 L1 Cache 分开,每个 SM 的共享内存的大小变成 96KB,每个块可以使用的共享内存最大为48KB。

  7. Maxwell 中,每个 SM 的寄存器个数为65536,共64个核,每个线程可以使用的寄存器最多为255个。

Nsight 学习笔记-相关标准概念

Active Threads:表示每个 SM **的线程数,设备限制最多可以**2048个线程,由程序决定,理论上也可以**2048个线程。

Active Blocks:表示每个 SM **的线程块数,设备限制可以**的线程块数为32;由于程序内部设定的线程块大小为16*16=256(依据设定而不同),而理论可以**的最大线程数为2048,所以理论上可以**2048/256=8个线程块。

Active Warps:表示设备限制可以**的 Warps 为64个。由于理论上可以**2048个线程,所以理论上最多可以**2048/32=64个 Warps。

  • 如果线程块的大小为1024,那么理论上最多可以**2个线程块。
  • 如果线程块的大小为32,那么理论上最多可以**32个线程块,达到峰值。
  • 如果线程块的大小小于32,那么理论上最多可以**的线程块依然为32,此时可以**的线程数将要受到限制。
  • 如果一个线程块的大小为10*10=100,那么依旧每个线程块依旧需要四个 Warp(128个线程),所以理论上可以**的线程数为:2048*(100/128) = 1600,理论上可以**的线程块数为16,理论上可以**的 Warp 为64。

Threads/Block:每个线程块的线程数。设备限制,每个线程块的线程数最多为1024;由于程序设定,每个线程块的线程数为256,所以理论上每个线程块的线程数为256。

Warps/Block:每个线程块的 Warp 数。设备限制,每个线程块的线程数最多为1024,所以,就限制每个线程块的最多 Warp 数为32;由于程序设定,每个线程块的线程数为256,所以理论上每个线程块的 Warp 数为8个。

Warps 中的 Block Limit:Warp 数对线程块的限制。设备限制,一个线程块至少一个 Warp,应该可以**2048/32=64个 Warp,但是由于设备限制每个 SM 最多只能**32个线程块,所以,也就限制最多执行32个线程块;理论上,程序设定每个块256个线程,也就是说每个块8个 Warp,但是设备限定最多64个 Warp,所以也就限定了每个 SM 最多8个线程块。

Registers/Thread:每个线程可以使用的最大寄存器个数。设备限制,每个寄存器可以使用的寄存器数最多为255个。理论上,由于程序设定,只使用了18个。

Registers/Block:每个线程块可以使用的最大寄存器数。设备限制,每个线程块可以使用的最大寄存器数为65536;理论上,由于程序原因实际使用的寄存器个数为6144。6144并不等于每个线程使用的寄存器数18*256=4608。这是由寄存器的分配方式决定的。

每个线程使用18个寄存器,所以每个 Warp 使用了 18*32 = 576 个寄存器,而寄存器是按页分配的,每页256个寄存器。也就是每个 Warp 分配了3页寄存器,共768个。而一个线程块有256个线程,共8个 Warp,所以共使用了 768 * 8 = 6144 个寄存器。

Registers/SM:每个 SM 使用的寄存器数。因为每个 SM 总共有65536 个寄存器,所以设备限制每个 SM 最多使用65536个寄存器。理论上,由程序设定,每个块使用6144个寄存器,每个 SM 有8个块,所以每个 SM 使用 6144 * 8 = 49152 个寄存器。

Registers 中 Block Limit:由于设备限制,每个 SM 最多可**32个线程块,所以此处设备限制线程块也为32;理论上,由程序决定,每个线程块使用了6144个寄存器,所以最多可执行 65536/6144 = 10 个线程块。

Shared Memory/Block:每块可以使用的共享内存数。由设备限制,每个线程块可以使用的共享内存数为48KB;理论上,由于程序中并未使用共享内存,因此每块使用的共享内存为0。

Shared Memory/Block:每个 SM 可以使用的共享内存数。由设备限制,每个 SM 可以使用的共享内存数为96KB;理论上,由于程序中并未使用共享内存,因此每个 SM 使用的共享内存为0。

Shared Memory 中 Block Limit:由于设备限制,每个 SM 最多可**32个线程块,所以此处设备限制线程块也为32;理论上,由于程序中并未使用共享内存,所以对使用线程块的个数没有限制。