作者Yan5566 (Lee)
看板C_and_CPP
标题[问题] CUDA的核心与block分配问题
时间Fri Nov 6 11:08:33 2015
各位前辈好
小弟近来接触CUDA 在warp与core的观念上有问题
目前我已知所有的block会被自动分配到各个SM
在一个SM中,每个block中的thread以warp为单位执行
我的问题如下:
假设在一个block中最後一个warp快结束了
那麽其他的core会先执行下一个block中的warp
还是会等一个block中所有的warp执行完,才会执行下一个block
如果是前者,这样是不是就代表无法避免有core闲置
手机发文,排版方面可能欠佳,先谢谢各位前辈指导
-----
Sent from JPTT on my Sony D6653.
--
__ __ _
\ \ / / __ _ _ __ | | ___ ___
\ V / / _` | | '_ \ | | / _ \ / _ \
| | | (_| | | | | | | |___ | __/ | __/
|_| \__,_| |_| |_| |_____| \___| \___|
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.117.247.115
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1446779320.A.B78.html
1F:→ walelile: 硬体那边没有block的概念 执行最小单位就是warp 11/06 12:34
2F:→ walelile: 至於他挑warp的schedule alg就有round-robin等 11/06 12:36
3F:→ freef1y3: 还是有吧 不然syncthreads就不知道要暂停那些warp了 11/06 12:37
4F:→ walelile: gpgpu-sim模拟器里面以前的版本有四种演算法可以选 11/06 12:37
5F:→ walelile: 也是 11/06 12:40
6F:→ freef1y3: 我觉得应该是一个block完全结束後下一个block才会递补 11/06 12:44
7F:→ freef1y3: 否则底层的资源管理会很麻烦 11/06 12:46
8F:→ freef1y3: 要保留尚未完全结束的block占用的资源(ex: shared mem) 11/06 12:49
9F:→ freef1y3: 同时又要空出位置给新的block进来之类 11/06 12:50
10F:→ walelile: nv会去算shared mem使用量来限制同时执行的warp数量 11/06 12:52
11F:→ freef1y3: 至於core闲置的问题应该有几个改善方法 11/06 12:52
12F:→ freef1y3: 1. 改用较小的block size 11/06 12:52
13F:→ walelile: 至少fermi那个世代有这行为 11/06 12:53
14F:→ freef1y3: 2. 增加每个block的计算量 11/06 12:53
15F:→ freef1y3: 印象中shared mem限制的应该是同时执行的block数量 11/06 12:54
16F:→ freef1y3: 当然block数量也会影响warp数量就是了 11/06 12:56
17F:→ freef1y3: 不过我的意思是若要允许一个block尚未执行完 11/06 12:58
18F:→ walelile: 他不可能是等一个block执行完才递补下一个 11/06 12:58
19F:→ walelile: 这样load memory的latency会很明显 11/06 12:59
20F:→ freef1y3: 下一个block就进来 这样占用的资源会更多 11/06 12:59
21F:→ freef1y3: 可能没讲清楚 我的意思不是同时只能有一个block跑 11/06 13:01
22F:→ freef1y3: 假设同时可以跑2个block好了,现在有2个block在跑 11/06 13:04
23F:→ freef1y3: 但其中一个block只剩一个warp还没结束 11/06 13:05
24F:→ freef1y3: 这种情况应该还是要等那个warp结束 下一个block才会进来 11/06 13:05
25F:→ walelile: 如果要更aggressive,硬体还是可以让其他的block先进 11/06 13:10
26F:→ freef1y3: 是有可能 但是还没结束的那个block占用的shared mem 11/06 13:11
27F:→ freef1y3: 总不能先释放掉吧? 11/06 13:11
28F:→ freef1y3: 所以就变成在两个block都占用shared mem的状况下 11/06 13:12
29F:→ freef1y3: 还要再空出一份shared mem让新block进来 11/06 13:12
30F:→ freef1y3: 除非你能以warp为单位来释放shared mem 11/06 13:13
31F:→ walelile: 运算开始跟结假如是mem读写,他放其他warp近来先读资料 11/06 13:13
32F:→ walelile: 他只要知道那块被占用的shared mem不会再被用就好了 11/06 13:14
33F:→ walelile: 还有机会提高记忆体频宽的使用效率 11/06 13:15
34F:→ freef1y3: 其实讨论可能性当然都很难说死没办法做到 11/06 13:27
35F:→ freef1y3: 但是原PO关心的应该是CUDA目前的实作是采用什麽方式 11/06 13:28
36F:→ freef1y3: 这应该写个小程式来实验就可以了..等我有空再来写吧 11/06 13:29
37F:推 johnjohnlin: 一个sm可以支援很多block在上面跑,不会有这个问题 11/06 16:01
38F:→ johnjohnlin: 至於几个,请google cuda occupancy calculator 11/06 16:02
39F:推 mike0227: 一个SM同一时间只会处理跑同一个warp内的指令 11/07 15:55
40F:→ mike0227: 所以不会出现原po问题内"部分core"闲置的状况 11/07 15:56
41F:→ mike0227: stall就是整个SM一起等 不会只有部分core在跑 11/07 15:58
也就是说在一个SM中,执行完一个block里的所有warp後
才会换执行新的一个block中的第一个warp ?
※ 编辑: Yan5566 (1.173.26.97), 11/07/2015 20:17:01
※ 编辑: Yan5566 (1.173.26.97), 11/07/2015 20:22:52
42F:推 johnjohnlin: 可以从很多个block选warp来塞core 11/07 23:26
愿闻其详!!
※ 编辑: Yan5566 (1.173.26.97), 11/08/2015 02:17:08
43F:推 mike0227: 不一定要同一个block 只要资源够 多个blocks可以同时在 11/08 04:23
44F:→ mike0227: 同一个SM上 你会有更多机会盖掉global access latency 11/08 04:24
45F:→ mike0227: Occupancy calculator就是在算同时可有多少Blocks和 11/08 04:25
46F:→ mike0227: threads在同一个SM上 但是要注意 不一定越高越好 11/08 04:26
47F:推 johnjohnlin: 我一般写的时候,大致上以越高越好为准则 11/08 12:25
48F:→ johnjohnlin: 不过我得有一篇paper有提到楼上那件事,好像标题 11/08 12:26
49F:→ johnjohnlin: 开头是neiter more or less的,有兴趣可以找找看 11/08 12:27
50F:推 jun0325: 一个SM的warp scheduler可以schedule来自在不同block的 05/07 21:02
51F:→ jun0325: warp (SM里面的warp scheduler可能不只一个要看硬体) 05/07 21:03
52F:→ jun0325: 基本上warp scheduler的policy最简单也最好用的是GTO 05/07 21:04
53F:→ jun0325: (大部分情况下比RR好) 回归正题,一个block"的确"要等到 05/07 21:05
54F:→ jun0325: 最後一个warp执行完,才会release他所占的资源 05/07 21:05
55F:→ jun0325: 这也就是为什麽在写CUDA的时候,尽量要让每个thread的 05/07 21:06
56F:→ jun0325: 工作量都要相近,这样才能尽可能在同一个时间点做完 05/07 21:06
57F:→ jun0325: 早点release resource给下一个block使用 05/07 21:07
58F:→ jun0325: W大所说的可以先偷塞新的block的warp进去SM 05/07 21:08
59F:→ jun0325: 但这就增加了硬体对於SM管理资源的复杂度 05/07 21:09
60F:→ jun0325: 你要特别建一个表去记录那个快结束block中的warp 05/07 21:10
61F:→ jun0325: 分别占了SM上面的那些资源(Register, Shared Memory) 05/07 21:11
62F:→ jun0325: 因为原本SM对於资源的控管是以block granularity 05/07 21:14
63F:→ jun0325: 如果要达成W大所说的那个方式,就要对每个"warp"都要去 05/07 21:15
64F:→ jun0325: 记录他们所站的资源 05/07 21:15