作者HsiaoCC (Learning To Live)
看板VideoCard
标题Re: [请益] 请问 CUDA 每个 block 可使用多少 shar …
时间Thu Jun 3 01:10:40 2010
※ 引述《jk21234 ( 1569 11 /47)》之铭言:
: ※ 引述《mself (mself)》之铭言:
: : 就我了解,SM 跟 block 有对应,但好像不是 1 对 1,
: : 数个 block 会一起在一个 SM 上轮流执行,
: 所以,SM和Block在"某个时段内,独占的1:1执行"
: 如果你觉得不容易理解,它还蛮接近一颗cpu执行多工的方式.
: 切换也应该是context switch.有同样的缺点就是切换再怎麽频繁,
: 对几百MHZ的晶片来说,都是巨大的效能损失.....
: (如果我没记错,cuda文件有描述context switch部分...)
: 所以也不用担心你在程式中使用不到16KB的shared memory.
来闲扯一下他背後的运作,就 GT200 系列来说
每个 SM 在 resource 允许的情况下,最多能同时保持 1,024 个 computing threads
且每次 SM 最多只允许抓取 8 个 blocks,且不能超过 resource limitation
每个 block 内会有许多许多 computing threads,在实际执行时,会动态切出 warps
每个 full warp 会有 32 个 computing threads,而 warp 是 SM 每次实际执行的单位
由於每个 SM 只有 8 个 SP(先不提 SFU),故需要以连续 4 个 cycles 来做
被排程(这个排程很接近RR,详见 US Patent US2007/0214343A1)到之 warp 的
一道指令(通通都做同一道,可以把 warp 视为一个 SIMD group)。当这道指令做完
dispatch unit 会排下一个 warp 来执行(不一定是同一个),可以视为 fine-grain
multithreading。(ATi 的作法比较接近 coarse-grain)
根据用 OpenCL 测试的结果,每个 SM 上,大概要同时保持 512 个 threads
才能达到最好的效能。而在 GPU 中,context switch 的 overhead 比起 OS 低很多~~
因为 GPU 中利用非常庞大的 Register file 来 keep 所有 in-flight data,所以对
GPU 来说,context switch 只是切换一下用的 register set 就没事了~~~
回到正题,shared memory 如果需求的量超过,是没办法被执行的,只能等到在 SM 中
的工作都做完,resource release 了才行~~~
: : 视 register 用量,以及 thread 数上限而定
: : 假设现在是 8 个 block 在 1 个 SM 上轮流执行
: : 是不是每个 block 只能有 2 KB shared memory 呢?
: : 还是说每个 block 都能用满 16 KB,但不是正在执行的 block
: : 的 shared memory (context) 会 switch 到 global memory
: : 要执行时在 switch 回来呢?
--
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.161.118.189
1F:推 jk21234:Block/SM内切换thread很快,不过我说的是比较上层的东西 06/03 01:37
2F:→ jk21234:也就是同一个SM去切换不同的Block,这个应当没那麽快... 06/03 01:37
3F:→ HsiaoCC:就我对它的了解,只要在resource允许情况下,看起来没差… 06/03 01:39
4F:→ HsiaoCC:但是,block内之threads需要能sync,碰到需要sync的比较伤 06/03 01:40
5F:推 jk21234:它文件有暗示,就是说同一张显卡跑两个GPGPU程式比较不好. 06/03 01:42
6F:→ jk21234:除了sync问题之外,SM切换执行不同的blocyk可能没那麽快 06/03 01:43
7F:→ HsiaoCC:跑不同kernel,似乎是scheduling的问题,但是我没实际试过 06/03 01:45
8F:→ HsiaoCC:Fermi whitepaper 上有提到多个 kernel 时排程的改进~~ 06/03 01:45
9F:推 jk21234:fermi的sync应该是大有改进,否则也无法对应OO化的程式需求 06/03 01:48
10F:→ jk21234:以前的硬体不适合multiprogram,也可能是sync的问题 06/03 01:49
11F:→ HsiaoCC:拿之前跑的数据算了一下,切block效能影响是有,但有限~~ 06/03 01:50
12F:→ HsiaoCC:只要让每个block保持>=64 threads,切换 block 对效能的 06/03 01:50
13F:→ jk21234:不过切出多个block通常都是资源量摆不进,如果还塞的下就没 06/03 01:50
14F:→ HsiaoCC:影响,大概只有10ns不到… 06/03 01:50
15F:→ jk21234:必要去分出更多的block,效率上应该会差很多 06/03 01:51
16F:→ HsiaoCC:切block,我用OpenCL在GTX285上测,感觉效率影响不明显:~~ 06/03 01:57
17F:→ HsiaoCC:反而是要怎麽找到上百个threads在同一个SM上run比较麻烦 06/03 01:58
18F:→ HsiaoCC:不过如果block切太少,反而造成有SM idle这样不更惨?:~~ 06/03 02:00
19F:推 jk21234:还没有显卡有100个SM以上.所以没差... 06/03 02:10