Re: [问题] CUDA的核心与block分配问题

楼主: jun0325 (俊)   2016-05-07 22:07:55
一个SM的warp scheduler可以schedule来自不同block的warp
概念就是
我现在有一个warp pool
而这个warp pool的warps是来自不同的block
warp scheduler根据heuristic的policy
每个cycle去从这个warp pool去选最适合的warp来issue
而SM里面的warp scheduler可能不只一个要看硬件
kepler有四个 (issue width = 4)
fermi有两个 (issue width = 2)
这有点像super scalar的概念
同一个cycle可以issue多个independent的warp instruction
基本上warp scheduler的policy最简单也最好用的是GTO
(大部分情况下也比RR好)
回归正题,现在的架构下
一个block"的确"要等到
最后一个warp执行完,才会release他所占的资源
(写个简单的小程式就可以了,
让block中的其中一个thread做dummy的for-loop就可以了)
这点也在GPGPU-sim里面得到验证,里面模拟的model
就是一定要等到最后一个warp执行完才能release所占的资源(reg shared)
新的block才能下下来
(虽然GPGPU-sim目前还停留在GTX480...)
这也就是为什么在写CUDA的时候,尽量要让每个thread的
工作量都要相近,这样才能尽可能在同一个时间点做完
避免造成load imbalance的问题
W大所说的可以先偷塞新的block的warp进去SM
也不是不可能
因为原本SM对于资源的management是以"block granularity"
也就是说,一个block结束,才会release所占的资源
当你想对资源的掌控是以"warp granularity"
想当然尔,就会比block granularity来得更复杂
需要多增加硬件的去管理SM上面的resource
稍微想了一下大概有几点是需要考虑的:
1. # of blocks or # of threads
当这个kernel bound to # of blocks or # or threads/warps的时候
除非你把那个block里的最后一个warp执行完
否则永远没办法偷丢新的block里面的warp
当然硬件的解当然是去突破这个# of blocks or # of threads/warps的限制
2. Shared Memory
当这个kernel bound to shared memory的时候
你没办法偷丢新的block的新的warp下来
因为根本没有足够的shared memory给你放新的block
你最后一个warp没执行完
没办法release这块shared memory
因为你永远不知道这个warp剩下的指令还会不会再读写这块memory
其实最根本的原因就是
shared memory是visible to all the warps in a block
所以不能乱release啊...
如果你说
啊我只偷丢一个warp进来,用不到shared memory吧?
那万一你这个warp也用到shared memory,那不就GG了
3.
如果都没bound to 上面两个条件的话
register感觉是比较有机会能做到W大所说的方法
因为register本来就是warp自己在用的
为了达到
"在旧的block剩最后一个warp还没执行完
却想要丢新的warp进去的目的"
我们就需要建一个register usage的table
当提早执行完的warp
就去mark 这个table的那段register是free的
当新的warp进来时
去check这个table那些区段的register是available的就行了
重点还是
The registers of one warp are only visible to the warp
以上是我对于NV的架构下
对于
"是否能在旧的block还没执行完的条件下
能否塞新的block的warp到SM
需要对硬件做什么修改的讨论"
欢迎大家来讨论~~~
※ 引述《Yan5566 (Lee)》之铭言:
: 各位前辈好
: 小弟近来接触CUDA 在warp与core的观念上有问题
: 目前我已知所有的block会被自动分配到各个SM
: 在一个SM中,每个block中的thread以warp为单位执行
: 我的问题如下:
: 假设在一个block中最后一个warp快结束了
: 那么其他的core会先执行下一个block中的warp
: 还是会等一个block中所有的warp执行完,才会执行下一个block
: 如果是前者,这样是不是就代表无法避免有core闲置
: 手机发文,排版方面可能欠佳,先谢谢各位前辈指导
:
作者: freef1y3 ( )   2016-05-08 00:16:00
不过如果先塞进来的warp遇到syncthreads 还是必须等剩下的warp都进来之后才能往下做

Links booklink

Contact Us: admin [ a t ] ucptt.com