660ti 显卡:(有7个SM)
基本限制:
- 1个block最多有1024个threads。 (1个block只能够加载在1个SM中。)
- 1个SM最多有2048个threads。(maxThreadsPerMultiProcessor)
- 在最好的情况下,1个SM有2048个线程,按 warp(32个threads) 为执行单位,分为 2048/32 = 64组。
- (我猜的,不知道是否对?)一个SM中有192个core,按照执行单位,192个core也会按照warp为执行单元分为 192/32 = 6组,对应执行64组warp。
5.我的grid为 313 * 313 * 1,block 为 16 * 16 * 1,排除register等其因素的限制,我的1个SM一次可以加载8个block,其中有的block执行完后才能够加载其它的block。
我有以下几点疑惑:
当我用Nsight调试得时候,执行到断点的时候,如下面代码,发现 CUDA Info (Warps) 中有 7个block,序号分别为[0,1,2,3,4,5,6],当序号分别为[0,1,2,3,4,5,6]的block全部执行完后,CUDA Info (Warps) 再加载序号为[7,8,9,10,11,12,13]的block,也是7个。
问1:是不是因为我的显卡有7个SM,SM0分配所得的block序号是[0,7,14,21,28,35,42,49],SM1 的为 [1,8,15,22,29,36,43,50],SM2 的为 [2,9,16,23,30,37,44,51],SM3 的为 [3,10,17,24,31,38,45,52] ,SM4 的为 [4,11,18,25,32,39,46,53],SM5 的为 [5,12,19,26,33,40,47,54],SM6 的为 [6,13,20,27,34,41,48,55],所以 CUDA Info (Warps) 显示每个SM首先执行的那个block?
问2:
到代码12行断点的时候(如下图),发现所有的线程都会停在这里,Status都为Breakpoint。我很疑惑问什么所有线程都能够同时到达断点,因为1个SM中只有192个core,不是应该首先执行前面的192个线程吗?怎么会同时执行1个block中的所有256个线程?
问3:
当往下面执行,到下面其它断点的时候,发现block 0的所有线程基本上都能够同时到达断点,但是其他block的线程基本上都变成绿色,而且一直停在 Source Line 为 12 的地方,直到 block0 执行完后才开始执行block1,以此类推。我彻底晕了,block 0在SM 0,block 1在 SM 1 的话,不是应该和block0和block1同时执行的吗?
[attach]3472[/attach]