占用视图
-
占用率(Occupancy) = 每个 SM 中**的 Warp / 每个 SM可以**的 Warp 的最大值。
-
其中,Theoretical 表示理论值,是由程序决定的;而 Device Limit 表示设备限制的最大值,认为无法改变;Achieved 表示程序实际执行时的情况。
-
图中的红色部份表示限制使用率的一些因素。
-
每个Warp(线程束)包含32个线程,32个 thread 被分成一组一起执行。
-
Maxwell 中,每个 SM 包含64个线程,每个 SM 有两个 Warp Scheduler, 每个 Warp Scheduler 管理两个 Instruction Dispatch Unit,一个 Instruction Dispatch Unit 可以同时管理16个 Warp。
-
Maxwell 中,共享内存与 L1 Cache 分开,每个 SM 的共享内存的大小变成 96KB,每个块可以使用的共享内存最大为48KB。
-
Maxwell 中,每个 SM 的寄存器个数为65536,共64个核,每个线程可以使用的寄存器最多为255个。
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;理论上,由于程序中并未使用共享内存,所以对使用线程块的个数没有限制。