|
突然又想了想fiber的软切换,fiber软切换的时候的分支类指令的时钟延迟开销,可以由其他HW thread内的fiber通过SMT来隐藏掉。 或者,可能有较好的分支预测,直接就切换过去,几乎没有额外延迟。
例如
HW thread 1里有8个fiber 1/2/.../8。
HW thread 2里也有8个fiber A/B/.../H。
而代码类似如下,load为可预知会产生高延迟的指令或命令:
fiber 1为
fiber_1:
load
load
load
jmp fiber_2 //软切换到fiber2
goback1:
... //计算类指令流
fiber 2类似为
fiber_2:
load
load
load
jmp fiber_3 //软切换到fiber3
goback2:
...
类似...
fiber 8为
fiber_8:
load
load
load
jmp goback1 //软切换回fiber1
goback8:
...
为了消除软切换的分支开销,能够跑满载:
如果fiber1执行分支切换指令需要多个延迟时钟才能进入fiber2,那么这些时钟并不会被浪费,HW thread2内的fiber可以通过SMT把它利用起来。
又有可能,分支预测可以让fiber1的分支切换指令的额外延迟为零,几乎无延迟的切到fiber2。
而由于一个HW thread内的fiber切换完全是由指令来控制的,寄存器的使用情况是完全可预知的,同一个物理寄存器也不会被多个fiber在相同的一个时钟内使用。使得一定条件下,同一个物理寄存器可以被分配到多个fiber里去,相当于物理寄存器的数量被放大了好几倍。
相对于是GPU的多线程,那就是各个线程不能分配得到同一个物理寄存器。
[ 本帖最后由 gaiban 于 2008-9-8 11:36 编辑 ] |
|